鏑矢の憂鬱2001年1月前半
透明1ドットイメージ
 
2001/01/01 (Mon)
・あけましておめでとうございます!! 表紙でも書いてますけど、プログラミング関係のコンテンツは受難の時代を迎えるのでごちゅーいくださいです。
 
・で、今日はお休み。少しプログラミングしたんだけど、ホントに少しだったんで。正規表現ライブラリの使い方調べないとあかんなー。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/02 (Tue)
・今日もお休みしまーす。
透明1ドットイメージ
 
2001/01/03 (Wed)
・今日はちょっと regex で正規表現処理をテストしてました。 Perl になれてるからかもしんないけど、なーんか使いにくい(汗)。最小マッチができないのが結構きついかなー。今回のアプリはそんなに複雑な検索はしないんで、正規表現使わないで普通に調べた方がいいかもしんない。
 
・……今日はこれくらい(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/04 (Thu)
・今日はお休みします。
透明1ドットイメージ
 
2001/01/05 (Fri)
・今日もお休みぃ。もうそろそろ質問おくれ〜。
透明1ドットイメージ
 
2001/01/06 (Sat)
・今年の質問第1号!! では今日のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 あけましておめでとうございます。
 昨年は、お世話になりました。
 今年もいろいろと質問するかと思いますが、よろしくお願いします。
 で、早速で恐縮なんですが質問です。
 VC++で画面を作成し、コントロールの配置する場合、コントロール同士の重なり合いで、優先度などはあるのでしょうか?(後に配置したコントロールの方が前面に表示される等)
 やりたいことは、ラジオボタンをグループボックスの線上に表示させたいのですが、エディターでコントロールを配置し、画面を表示すると、線がラジオボタンの上に表示されてしまいます。
 どうしたらよいのでしょうか?
 コントロールの重なり合いを制御する方法があれば教えてください。
透明1ドットイメージ
透明1ドットイメージ
 
・あけましておめでとうございます! 今年もよろしくおねがいしますー。さて、ここで鍵になるのは「コントロールの描画順」。後の方に描画されれば、上書きされるから手前に来ることになります。その描画順は、リソースファイル内で書き込まれてます。「プロジェクト名.rc 」ファイルをテキストモードで開いてみましょう。ダイアログの部分は……
 
///////////////////////////////////////////////////////////
//
// Dialog
//

IDD_T_DLGJUNK18_DIALOG DIALOGEX 0, 0, 191, 271
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |  
    WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "t_DlgJunk18"
FONT 9, "MS Pゴシック"
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,7,250,50,14
    PUSHBUTTON      "TrackMouseEvent",IDC_BUTTON1,7,7,177,14
    PUSHBUTTON      "テンプレート",IDC_BUTTON2,7,22,177,14
    PUSHBUTTON      "SHGetFileInfo",IDC_BUTTON3,7,37,177,14
    PUSHBUTTON      "SetCurrentDirectory",IDC_BUTTON4,7,52,177,14
    PUSHBUTTON      "関数ポインタ",IDC_BUTTON5,7,67,177,14
    PUSHBUTTON      "スレッド",IDC_BUTTON6,7,83,177,14
    PUSHBUTTON      "プロセス起動",IDC_BUTTON7,7,99,177,14
    PUSHBUTTON      "コマンド実行",IDC_BUTTON8,7,115,177,14
    PUSHBUTTON      "グループ枠より上に",IDC_BUTTON9,7,144,177,14
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | 
                    WS_TABSTOP,7,131,38,10
    GROUPBOX        "Static",IDC_STATIC,7,132,177,9
END
	
 
・って感じになってると思います。この順番で描画されるんで、上のだとチェックボックスの CONTROL "Check1" のあとに GROUPBOX "Static" が来てるからグループ枠の方が上になっちゃうんです。だから
 
    GROUPBOX        "Static",IDC_STATIC,7,132,177,9
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | 
                    WS_TABSTOP,7,131,38,10
	
 
・って感じに入れ替えれば、チェックボックスの方が後に描画されるから上に来るようになります。あと、一応プログラム上でもできるみたいです。こんな感じ。
 
void Test( CDialog *p_cDlg )
{
    // IDC_CHECK1 が手前にしたいチェックボックス。
    CWnd *pcChkWnd = p_cDlg->GetDlgItem( IDC_CHECK1 );
    pcChkWnd->SetFocus();
    pcChkWnd->SetWindowPos
            ( &CWnd::wndTop, 0, 0, 0, 0
            , SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE );
    p_cDlg->GetDlgItem( IDOK )    // 何でもいいから他の。
        ->SetFocus();
}
	
 
・なんかスマートでないやり方だなぁ(汗)。もっと他に方法があるかもしんない。とりあえずこれでもできるってことで。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/07 (Sun)
・今日はお休み〜。
透明1ドットイメージ
 
2001/01/08 (Mon)
・今日は Perl プログラミングしてました。「ホームページの改変をする〜」ゆーて、そのためにほめかぶを作ってたんだけど、 regex だけだと置換とかできないから、 Perl の方が便利って話になっちゃって、結局 Perl で全部やっちゃいました(汗)。何やったかってゆーと、 Codian の各ページのソースを見ると分かるんだけど、タイトルとか「次へ」とかを Java スクリプトで表示してるんだよね。それをちゃんとしたのに置き換えるとゆーの。
 
・元々、各スクリプトはコピーしたものなんで統一されてるし、コメントを入れてあったからそれをフラグにできたんで、その点は楽勝。でも「あるタグに囲まれた文」を現す正規表現を作るのが結構大変だったり。 <SCRIPT[^>]*>[^>]*document.write\( document.title \)\;[^<]*<\/SCRIPT> とかゆーなんかスマートでないのになってしまった(汗)。
 
・あと、なんかぶっつけで作っちゃったんで関数化とかあんましなかったり、簡単にテストしたあといきなり本ファイルに掛けちゃったり(汗)。バックアップは取ってあるんで、ついおおざっぱになってしまう……。あと 01.html の 01 を数値化するのに、最初の 0 を取ればいいだけってことに気付かなかったり。こーゆーとこ気付かないと難しいんだなぁ。
 
・ちなみに、開発環境は VC (爆)。まずメニューの【ツール】−【カスタマイズ】ダイアログの【ツール】ページで Perl.exe をフルパス指定、引数は $(WkspDir)\Main.pl にして、【アウトプットウィンドウを使用】をチェック。で、コンソールプロジェクトを作って、そのフォルダに Main.pl ってゆー使い回し用 Perl プログラムをコピー。そうすると、テキストエディタでプログラム書いて保存したら、ツールボタンひとつで実行! 結果がアウトプットウィンドウに出るから楽〜。に BCB とかでしたのと同じ方法だけどね。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/09 (Tue)
・今日はちょっとだけ。 assert() 系で「中止」すると ExitProcess() するけど、ホントはこれって結構まずいのかなーとか。デストラクタだけでも呼ばれるような仕組みだといいんだけど。かといって、例外投げても catch しないとデストラクタ呼ばれないし。結局は「中止しない」ってことになるんかなー。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/10 (Wed)
・今日はお便り紹介〜。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは。
 HiSというものです。いつも楽しく見させてもらってます。
 ちょっと質問があるんですが、他の起動してるアプリのウィンドウハンドルを取得するにはどうすればいいんでしょうか?
 取得したウィンドウハンドルにいろいろとメッセージを送って操作したりしたいのです。
 ご教授願います。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。ウィンドウハンドルの取得方法はいっぱいあります。まず FindWindow() 。ウィンドウには「ウィンドウ名」と「ウィンドウクラス名」のふたつの名前が付いてます。ウィンドウ名はタイトルバーに書かれてる名前、ウィンドウクラス名はウィンドウの原型になるものの名前です。ウィンドウクラス名はアプリごとに違うんで、 Spy++ で操作したいウィンドウのウィンドウクラス名を調べて、 FindWindow() で取得する方法がひとつ。
 
・ Spy++ の「照準」みたく、ある点での一番上のウィンドウを取得するなら WindowFromPoint() 。ウィンドウクラス名とかじゃなくて、画面に表示されてる中からウィンドウを選ぶ場合にはこれ。
 
・他には「ウィンドウを片っ端から調べる」っていう方法があります。片っ端から調べるのには、 GetWindow() か EnumWindows() を使います。 GetWindow() はまず GW_HWNDFIRST を第2引数に指定して一番上のウィンドウを取得して、次からは GetWindow() に GW_HWNDNEXT を指定して次々とウィンドウを取得していきます。
 
・これのやり方は Knowledge Base の Article ID: Q33161 "Using the GetWindow() Function" に書いてあります。もひとつ、 EnumWindows() の方は、一回呼べば、指定したコールバック関数が次々と自動的に呼ばれて、その引数としてウィンドウハンドルが渡される形式です。ただ、こっちはコールバック関数を作らなきゃいけないから、クラスとかと使う場合には面倒かも。
 
・ウィンドウハンドルから、逆にウィンドウ名を取得するなら GetWindowText() 、ウィンドウクラス名を取得するなら GetClassName() を使います。最後の GetClassName() 以外の関数は MSDN の "Window Functions" ってページに書いてあるんでそちらもご覧ください。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは。
 STL&iostream 入門を楽しく読ませていただきました。
 他の解説書に比べて非常に読みやすく、わかり易く書かれていて、大変勉強になりました。ぜひ、続編(中級、上級編)もお願いします。
 質問ですが、VCでエディットボックスへの入力データの右詰表示をコードで設定する方法を知りたいのですが?
 右詰をコントロールのプロパティで設定したバージョンのexeをWindwos95で動作させた時、右詰で表示されないため、コードで設定するしかないのかと思っています。
 よろしくお願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。が、なーぜかエディットボックスのスタイルを変更しても、それが反映されない……なぜにー?(泣)  ES_RIGHT や WS_EX_RIGHT がちゃんと入ってるのに〜。と思ったら、ダイアログのスタイルに DS_LOCALEDIT をしないと動的に変更できなかった(汗)。プロパティだと「ローカル編集」ね。こんなん気付くかい!! で、単に動的に変えるんだったら、CWnd::ModifyStyle( ES_LEFT, ES_RIGHT, SWP_FRAMECHANGED ); ってすればうまくいくはず。
 
・でもこの質問はそれとはちょっと違うのかな? もしかしたら、新しくエディットボックスを作り直すことでうまくいくかもしんない。 GetWindowLong() でウィンドウスタイルを取得して、 GetWindowRect() エディットボックスの位置とサイズを取得して、 ID は Spy++ で先に調べといて、で、元からあるエディットボックスを Destroy して新たにエディットボックスを Create すればうまくいくかな。
 
・あ、もしかしたら他のアプリの話なのかな。そうなると結構難しいかもしんない。システムフックをインストールしてからでないと難しいかも。あーあと、いま Win95 の環境がないんで分かんないんだけど、複数行にするとうまくいくって話が Knowledge Base の Article ID: Q108940 "Text Alignment in Single Line Edit Controls" に書いてありますです。その辺が原因なのかもしんない。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/11 (Thu)
・今日はお休み〜。
透明1ドットイメージ
 
2001/01/12 (Fri)
・今日はぷらとわ書いてました。書き始めるまではちょっとおっくうなんだけど、書き始めちゃえば1時間くらいですぱっと。今日は GetDlgItem() のを Attach() したり。知らなかったんだけど、 DDX でメンバ変数と結び付けたコントロールは Attach() できないんですねー。
 
・それにしても、ホントにいつまで経っても終わらないです。確かに、ひとつのちっこいテーマでかなりしっかり書いちゃうんでそれで長くなるんだけど、でも他のことに応用できるような感じで解説してるつもりではあるんで。だから最終的には……最終的っていつだ?
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/13 (Sat)
・今日はお休み〜。
透明1ドットイメージ
 
2001/01/14 (Sun)
・今日はお便り紹介〜。
 
透明1ドットイメージ
透明1ドットイメージ
 ども、つい先日他のアプリのウインドハンドルの取得'について質問したものです。
 教えていただいた通りFindWindow()で上手くいきました。
 それで他のアプリにメッセージを送ったりしてたんですが、メッセージだけでなく文字列なんかも送れないでしょうか。
透明1ドットイメージ
透明1ドットイメージ
 
・それは「他のアプリ」、つまり受け取る側も自分で作ってる場合ですよね。そうじゃない、すでに存在するアプリだと、場合によって異なるです。たとえば、単にエディットボックスに文字列を書き込みたいとかだったら、そのエディットボックスのウィンドウハンドルを調べて WM_SETTEXT を SendMessage() すればOK。
 
・でも、一見エディットボックスに見えてそうじゃなかったり、文字列の受け取り方法が特別だったりしてるとちょっと難しいかも。そのアプリがどういう実装をしているのか調べないと。 Spy++ でメッセージを調べることになるかなー。
 
・受け取る側を自分で作る場合には、これはこれで大変。たとえば WM_USER+X って感じの独自メッセージで文字列を送る場合、単に文字列ポインタを WPARAM や LPARAM に入れるだけじゃうまくいかないです。送る側と受け取る側が別々のプロセスだと、メモリが完全に独立してるから、受け取る側から読み取る側のメモリをアクセスできなくてエラーになります。
 
・なんで、文字列だけ別経由で送る必要があります。一番基本的な方法は「ファイルマッピング」を使う方法。 CreateFileMapping() で「メモリ上のファイル」を作ることができて、これにまず送る側が文字列を書き込んで、「書き込んだよ」メッセージを受け取る側に送信、メッセージを受け取る側で受け取ったらこの「メモリ上のファイル」にアクセスして文字列を取得、っていう形式。
 
・もちろん複数のプロセスやスレッドが同時に動くと文字列が受け取られる前に書き換えられちゃう可能性があるんで、その場合には同期処理しないとダメ。あと、ファイルマッピングを使わない方法としては、ホントにファイルを使う方法や、クリップボードを経由する方法もあるけど、あんま勧めないです。ファイルマッピングが比較的安定。
 
・オマケのへんてこ方法その1。 WPARAM と LPARAM 、あわせて8バイトに文字を詰め込んで送る(爆)。1回に8文字送れるから、128文字でも16回送ればOK。へんてこ方法その2。受け取り側で非表示の複数行エディットボックスを用意して、そこに WM_SETTEXT する(爆)。どっちも実際にやってる人いるかどうかは不明。理論上は問題なさそうだけど、実は思い付かないだけ?
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/15 (Mon)
・今日はお便り紹介〜。
 
透明1ドットイメージ
透明1ドットイメージ
…あと、CodianにはLZH形式で前ページをひとつにまとめた「Codianオフライン版」というものが存在します。1メガバイトもあるんで…
 
 とありますが、「前ページ」とはひょっとして「全ページ」ということでしょうか?
透明1ドットイメージ
透明1ドットイメージ
 
・それは「Codian」についてのですね……そう、誤字です(泣)。すでに直しましたのでご確認ください。こういう誤字脱字関連の指摘、大募集(爆)。実は結構指摘を受けてて、その都度更新してたりします(いつも教えてくれてる方、ありがとう!)。それでもなくならない(爆)。この前は1月壁紙に2000年って書いちゃうし……。ここで匿名でもいいんでがしがし指摘してください! 辞書や日記やかぶゆ〜だけじゃなく、誤字指摘でかぶスタに参加しよう!(爆)
 
・でわまたっ!
 
 
(C)KAB-studio 2001 ALL RIGHTS RESERVED.