• ベストアンサー

子ウィンドウのデフォルトウィンドウプロシージャについて

oldman50の回答

  • oldman50
  • ベストアンサー率29% (8/27)
回答No.2

 横から失礼します。  その書籍よりも、以下のサイトの記述の方が分かりやすいのではないかと思います。 http://www.kab-studio.biz/Programing/PragmaTwice/Main/183.html http://www.kab-studio.biz/Programing/PragmaTwice/Main/184.html

関連するQ&A

  • デフォルトウィンドウプロシージャ

    ある箇所が間違っていたので修正しました。ある本に子ウィンドウでデフォルトウィンドウプロシージャに渡すとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと渡されると載っていたので、試しにプログラムでやったのですが、 #include <windows.h> LRESULT CALLBACK WndProc( HWND , UINT, WPARAM, LPARAM ); LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR , int nCmdShow ) { MSG msg; HWND hWnd, hWnd3; WNDCLASSEX wndclass,c_wndclass; wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "wh02"; c_wndclass.style = 0; c_wndclass.lpfnWndProc = WndProc1; c_wndclass.cbClsExtra = 0; c_wndclass.cbWndExtra = 0; c_wndclass.cbSize = sizeof(WNDCLASSEX); c_wndclass.hInstance = hInstance; c_wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); c_wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); c_wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); c_wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); c_wndclass.lpszMenuName = NULL; c_wndclass.lpszClassName = "wh01"; if(! RegisterClassEx( &wndclass )) return 0; // ウィンドウクラスの登録 if(! RegisterClassEx( &c_wndclass )) return 0; // ウィンドウクラスの登録 // できないと終了   hWnd = CreateWindow( "wh02", "親ウインドウ(WS_OVERLAPPEDWINDOW)", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, // 親ウィンドウはデスクトップ NULL, hInstance, NULL ); hWnd3 = CreateWindow( "hWnd1", "親ウインドウの子", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, // 親ウィンドウの子 NULL, hInstance, NULL ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); ShowWindow( hWnd3, nCmdShow ); UpdateWindow( hWnd3 ); while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam ; } LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { HDC hdc; PAINTSTRUCT ps; char *p; int id; switch( iMessage ){ case WM_KEYDOWN: id = MessageBox(hWnd, (LPCSTR)"終了しますか", (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); if(id == IDOK) DestroyWindow(hWnd); case WM_DESTROY: PostQuitMessage(0); // メッセージループを終了させる break; default: return DefWindowProc( hWnd, iMessage, wParam, lParam ); } return 0; } LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { return DefWindowProc( hWnd, iMessage, wParam, lParam ); } とやったのですが子ウィンドウでキー入力しても終了しません。 なぜなのでしょうか?何か間違っているのでしょうか?

  • ウィンドウプロシージャの書き方について

    VC++Expressで開発しています。 このたびWin32APIを使用してみたいと思い以下のようなマウスの座標を常に表示するプログラムを書いてみました。 Form1.h ----------------------------------------------- #pragma once #include <Windows.h> #include <stdio.h> #pragma comment(lib, "user32.lib") //(略) LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { switch(msg) { case WM_TIMER: switch(wp) { case 1: POINT point; GetCursorPos(&point); label2->Text="X:"+point.x; label3->Text="Y:"+point.y; break; } default: return DefWindowProc(hwnd,msg,wp,lp); break; } } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { HWND hmyWnd = static_cast<HWND>(this->Handle.ToPointer()); SetTimer(hmyWnd,1,100,NULL); } ----------------------------------------------- コレを実行してみると warning C4441: '__stdcall ' の呼び出し規約が無視されました。代わりに、'__clrcall ' を使用しました という警告が出た後、ウィンドウが表示されますがラベルの内容は変化しません。 そこで質問させてください。 まず、この様な警告が出る理由はなんでしょうか? 私はウィンドウプロシージャの使い方が間違っていると思うのですが、それより先は調べることが出来ませんでした。 次に前述の疑問に関連してですが、「イベント駆動型のプログラムを書く際はメッセージキューにたまったメッセージをそれぞれ適切なウィンドウプロシージャへ送る」と言う風に理解しているのですが、どのサイトでプログラム例を見てもLRESULT CALLBACK WndProc(略)という受け取る側の関数を書いているだけで、肝心の送る側の関数を記述していません。 そのため、私も見よう見真似で受け取る側の関数だけ書いたのですが、これではもちろんどこに書かれているかも分からない送り側の関数と関連付けは出来ませんよね? 実際にウィンドウプロシージャやその他メッセージ処理ではどのようにして関連付けを行っているのですか? また、私はプロジェクトを作成したときに最初に出てきたForm1.hと言うファイルにコードを書き込んでいるのですが、これは後々問題になるでしょうか? 少しまとまりの無い質問となってしまいましたが、どうかお答えください。 お願いしますm(_ _)m

  • プロシージャを越えて戻る?

    プロシージャを越えて戻る? 研修課題として、「じゃんけん」のプログラム作成に取り組んでいるのですが、 "初期化(?)"が出来ずに悩んでいます。 プログラムの流れとして、 (1)コンピュータの手を決定する。(乱数発生を利用して) (2)プレーヤーの手を決定する。(ラジオボタンで選択) (3)勝敗の判断をする。 (4)続行するかどうかを尋ね(メッセージBoxにて)、「はい」ならば(1)に戻る。 …というものです。 これまで、(1)~(3)、(4)のメッセージボックス表示までは何とかクリアしました。 しかし(4)の「戻る」が上手くいきません。どうすれば正解なのかも良くわからない状況です。 私も独自に組んではみましたが、 ラベル等をすべて初期化し、初期状態と同じように「com手決定のボタン」以外のボタンを 全てEnabled=Falseにすることで、「見かけ上は」初期状態に戻す、というものです。 しかし、これでは正解ではないと感じました。 そこで思い浮かんだのが反復処理なのですが、 「プロシージャ内での処理は可能でも、プロシージャ間を越えた反復処理など不可能だし…」 などと自問自答して現在に至ります。 どうすれば、処理の流れとして(4)から(1)に戻ることができるのか、 どうか皆様のご教授をお願いしたいです。よろしくお願いいたします。 *なお、プログラムが200行くらいありますのでコードは割愛いたします。

  • 子ウィンドウに発生したイベント

    親ウィンドウ内に子リストウィンドウを作り 子リストウィンドウを左クリックしたときに 「子リストウィンドウに何かイベントが発生した」 ということを 子リストウィンドウにメッセージを送ってもらうことなく 親ウィンドウが知る方法は有るのでしょうか? 子リストウィンドウのウィンドウ処理関数を作りたくないのでできるだけ子リストウィンドウの処理はデフォルト処理で済ませたいのですが・・・

  • プロシージャの引数について

    DB : SQL Server 2005 プロシージャの引数にCSVファイルのフルパスを入れたいのですが、 エラーが出て困っています。 http://questionbox.jp.msn.com/qa262720.html ↑の回答も参考にしましたが、どうしても出来ません。 最初は以下のように書いていました。 BULK INSERT IDATA from ''+ @pass + '' with ( fieldterminator = ',', rowterminator = '\n' ) このときは、プロシージャを作る段階で↓のエラーメッセージが出ました。 >メッセージ 1038、レベル 15、状態 1、プロシージャ sss、行 30 オブジェクト名または列名がないか、空です。SELECT INTO ステートメントの場合は、各列に名前が付いていることを確認してください。その他のステートメントの場合は、空の別名を検索してください。"" または [] で定義された別名は許可されません。別名として、名前または 1 つのスペースを追加してください。 >メッセージ 319、レベル 15、状態 1、プロシージャ sss、行 30 キーワード 'with' 付近に不適切な構文があります。このステートメントが共通テーブル式または xmlnamespaces 句の場合、前のステートメントをセミコロンで終了してください。 また、上記の回答を参考にしたところ、プロシージャは作成できましたが、 引数を与えて実行する段階で↓のエラーメッセージが出ました。 >メッセージ 203、レベル 16、状態 2、プロシージャ sss、行 32 名前 'BULK INSERT IDATA from '\\・・・\・・・\取込.csv' with ( fieldterminator = ',',rowterminator = '\n')' は有効な識別子ではありません。 引数で与えるのでなく、直接入力した場合は出来ます。 よろしくお願いします (><)

  • 親ウィンドウのメッセージを子ウィンドウで処理する

    親ウィンドウに入ってくるメッセージを子ウィンドウ(ダイアログ)のメッセージマップで処理したいと思ってますが、どうにもできません。なにかよい方法はないでしょうか? 処理したいメッセージはESCが押されたかどうかだけなので、親で受けたメッセージを子供にSendMessageすればよいのですが、できれば、親で受けたメッセージすべてを子供にそのまま渡すというようなことができたらうれしいです。 ATL/WTLでの書き方だともっとうれしいです。 どうぞよろしくお願いします。

  • 初歩的な質問なのですが、サブルーチン、プロシージャについて

    初めてプログラミングを行おうと思っています。 そこで、VBを使って行おうと思っているのですが、 全てが初めてなので、まずは本を読んでいるところです。 本の中で、サブルーチンやプロシージャという言葉がよく出てくるのですが、サブルーチンは処理のかたまり、プロシージャは処理の命令と軽く考えていたのですが、本の中に、『サブルーチンにはFunctionプロシージャとSubプロシージャの2種類がある』と書いてあり、それ以来、私にはサブルーチンもプロシージャも同じものに思えてしまいます。人に聞いたところ、『全然別ものだよ』という答えしかありませんでした。これは、どう違うのでしょうか?? また、SubプロシージャのSubはサブルーチンを示すとあり、益々、理解できなくなりました。 恐れ入りますが、サブルーチン、プロシージャ、Functionプロシージャ、Subプロシージャとは何かについて、おわかりの方がいらっしゃいましたらご教授ください。 宜しくお願い致します。

  • subプロシージャ

    2次方程式a*x^2+bx+c=0えお解くプログラムを考える。メインプロシージャmain1がsubプロシージャread1,solve1,display1を1回ずつ呼び出す。プロシージャread1で変数a,b,cにinputboxで整数値を入力する。プロシージャsolve1では、まず判別式D=b^2-4*a*cを計算して、D>0の場合にはx1、x2に実数解x1=(-b+sqr(D)/(2*a)、x2=(-b-sqr(d)/(2*a)を求める。D<0の場合はx1に実部-b/(2*a)を、x2に虚部sqr(-D)/(2*a)を求める。プロシージャdisplay1は入力された3つの整数値とsolve1で得られた2つの変数x1.x2の値を判別式Dの符号に応じてMsgbox関数で表示する。 以上のプログラムをモジュールレベル変数を用いてつくりなさい。 Sub read1() '問10(1) Dim a As Integer, b As Integer, c As Integer a = InputBox(" aの値を入力して") b = InputBox(" bの値を入力して") Sub solve1() D = b ^ 2 - 4 * a * c If D > 0 Then x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) Else x1 = -b / (2 * a) x2 = Sqr(-D) / (2 * a) Sub display1() End Sub ここまでやったのですがこの先どうやるかわかりません。 おしえてください。 あとモジュールレベル変数ってなんですか?

  • 使われないウィンドウメッセージ

    ウィンドウプロシージャをウィンドウメッセージを受け取るだけでなく、個人的なメッセージを送ってシグナル関数の代用にしたいなと思ったのですが、ウィンドウズが使っていない、これから使われないウィンドウメッセージの値はありますか?プロセス間でのシグナル受け渡しのため、ウィンドウプロシージャをシグナル関数の代用にすると、メッセージループがそのまま使えて好都合なのです。 今は処理する必要が無いウィンドウメッセージを代用として使っていますが、何だかスマートではないのでそういうウィンドウメッセージがあれば教えてください。例えば9x系で使われていたが、NTでは使用されないウィンドウメッセージ等。 回答よろしくお願いします。

  • Windows終了時にDefault IME

    昨日からWindowsを終了させるときに、 Default IME このプログラムからの応答がありません。ビジー状態が入力待ちかまたは停止 しています。 というメッセージがでてしまうのです。 ここで「終了」をクリックすれば終わってくれるけど、 毎回毎回この状態です。 ウイルスかと思って、ウイルススキャンしたけども以上はなく、何かが壊れているのかと思い、Cドラブをスキャンしたけども、何ともありませんでした。 この症状はいったいなんなのでしょうか、 どうすれば今まで通りの終了が出来るのでしょうか? 詳しく解決方法の説明願います。 Win98 IE6