ツールバーに文字が付けられない!アドバイスをお願いします

このQ&Aのポイント
  • ツールバー作成関数を使って、ツールバーに文字を付ける処理を行いたいですが、うまくいきません。
  • ツールバー作成関数を閉じると、文字を付ける関数が機能せず、標準のボタンが表示されます。
  • ツールバー作成関数を閉じずに、文字を付ける関数を閉じると文字が表示されますが、エラーが出ます。
回答を見る
  • ベストアンサー

ツールバーにうまく文字が付けられません

いつもお世話になっています。よろしくお願いします。 色々調べて、自分なりに改良したのですが、原因がつかめません。 アドバイス、ヒントをお願いします。 ツールバーの『windows標準のボタン』に、『文字を付ける』部分で躓いています。   //ツールバー作成関数 HWND MyCreateToolbar(HWND hWnd) { HINSTANCE hInst; HWND hTool; TBADDBITMAP tb; int stdid; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hTool = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, // コントロールID 0, hInst, NULL, tbb, 0, 0, 0, 0, 0, sizeof(TBBUTTON)); tb.hInst = HINST_COMMCTRL; tb.nID = IDB_STD_SMALL_COLOR; stdid = SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb); tbb[0].iBitmap += stdid; tbb[1].iBitmap += stdid; tbb[2].iBitmap += stdid; SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb[0]); tb.hInst = HINST_COMMCTRL; tb.nID = IDB_VIEW_SMALL_COLOR; stdid = SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb); tbb[3].iBitmap += stdid; SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)1, (LPARAM)&tbb[3]); } //ここでくくると、『ボタンに文字を付ける関数』が機能しない //『}』 を、『ボタンに文字を付ける関数』の最後につけると、文字が表示されるが、エラーが出る。 //エラー E2108 c:\ツールバー\toolbar\toolbar.cpp 201: typedef 'HWND' の使い方が間違っている(関数 MyCreateToolbar(HWND__ *) ) エラー E2379 c:\ツールバー\toolbar\toolbar.cpp 201: ステートメントにセミコロン(;)がない(関数 MyCreateToolbar(HWND__ *) ) *** 2 errors in Compile *** /ボタンに文字を付ける関数 HWND MyCreateToolbar(HWND hWnd); //;セミコロンをつけないと //HWNDの使い方が間違っている ステートメントにセミコロンが無い の エラー { HINSTANCE hInst; HWND hTool; TCHAR szBuf[16]; int iNEW; int iOPEN; int iPARENT; int iDELETE; TBADDBITMAP tbab; InitCommonControls(); hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hTool = CreateWindow(TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, (HMENU)ID_TOOLBAR, hInst, NULL); SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); tbab.hInst = HINST_COMMCTRL; //既成はCOMMCTRL 自作ビットマップはNULL tbab.nID = IDB_STD_SMALL_COLOR; ID_TOOLBAR; SendMessage(hTool, TB_ADDBITMAP, (WPARAM)0, (LPARAM)&tbab); LoadString (hInst, IDS_NEW, szBuf, (TCHAR)sizeof(szBuf)); iNEW = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbb[0].iString = iNEW; LoadString (hInst, IDS_OPEN, szBuf, (TCHAR)sizeof(szBuf)); iOPEN = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbb[1].iString = iOPEN; LoadString (hInst, IDS_DELETE, szBuf, (TCHAR)sizeof(szBuf)); iDELETE = SendMessage(hTool, TB_ADDSTRING,0, (LPARAM)szBuf); tbb[2].iString = iDELETE; LoadString (hInst, IDS_PARENT, szBuf, (TCHAR)sizeof(szBuf)); iDELETE = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbb[3].iString = iPARENT; SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)(LPTBBUTTON)&tbb[0]); return hTool; } } ツールバー作成関数を 『}』で閉じると 文字を付ける関数が機能せず、標準のボタンが4つ表示されます。 『}』 を『文字を付けるをつける関数』の最後に付けると文字が表示されるが、『ツールバー作成関数』の所で閉じていないので、エラーが出ます。 『}』 を『文字を付けるをつける関数』の最後に付けると ボタン二つ分の大きさの『文字だけのボタンが最初に表示されたボタン4つを隠して3種類だけ表示されます。(新規作成、開く、削除) このとき、新規作成などの文字の上の部分をクリックすると、隠れていたボタンが出てきます。 その出てきたボタンもクリックできます。文字をクリックすると、ボタンは、隠れてしまいます。 VC++で『文字を付けるをつける関数』は、エラー、警告が出て作れません。

noname#220054
noname#220054

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

>HWND MyCreateToolbar(HWND hWnd) >{ (略) >HWND MyCreateToolbar(HWND hWnd); >//;セミコロンをつけないと >//HWNDの使い方が間違っている ステートメントにセミコロンが無い の エラー >{ 全部のパターンで、関数の中身を全部「取っ払って」みよう。 パターン1(「}」を一番最後に付けて、セミコロンがないパターン) HWND MyCreateToolbar(HWND hWnd) { HWND MyCreateToolbar(HWND hWnd) { } } これは、明らかにおかしい。コンパイラは「HWNDが変な所にある」「セミコロンが無い」と判断する。 パターン2(「}」を一番最後に付けて、セミコロンがあるパターン) HWND MyCreateToolbar(HWND hWnd) { HWND MyCreateToolbar(HWND hWnd); { } } これは「MyCreateToolbarの中で、MyCreateToolbarをプロトタイプ宣言している」と解釈されると思う。そしてコンパイラはエラーを吐く。 パターン3(「}」を前の方に付けて、セミコロンがないパターン) HWND MyCreateToolbar(HWND hWnd) { } HWND MyCreateToolbar(HWND hWnd) { } 「完全に同じ名前の関数を2つ定義している」ので「最初の方」だけが機能する。つまり「ボタンに文字を付ける関数」が機能しない。 パターン4(「}」を前の方に付けて、セミコロンがあるパターン) HWND MyCreateToolbar(HWND hWnd) { } HWND MyCreateToolbar(HWND hWnd); { } これは「2番目のは、単なるMyCreateToolbarのプロトタイプ宣言」になる。そして、コンパイラはエラーを吐く。 もう一度「クラスモジュールの記述方法」と「上位クラスのメンバ関数をラップする、ラッパーの記述方法」を勉強し直しましょう。

noname#220054
質問者

お礼

アドバイス有難うございます。 御礼が遅れてすみません。 ご指摘のとおり、 >「2番目のは、MyCreateToolbarのプロトタイプ宣言」の形を不思議に思っていました。 >「最初の方」だけが機能する。つまり「ボタンに文字を付ける関数」が機能しない。 も感じてはいたのですが、どのように処理をして良いのかわかりませんでした、(経験不足ですね。)でも、 >「完全に同じ名前の関数を2つ定義している」 の指摘で、間違いに気づきました。(一つに纏めれば良い) 今は、『ボタンも4つ表示され、その下に文字も表示されるようになりました』 ただ、『文字が全て、一種類』なのが残念ですが、これは、何とかなりそうです。

関連するQ&A

  • 子ウインドウの作成と破棄について

    CALLBACK のみを書きました。 メインウインドウを破棄したら 子ウインドウも破棄したいのですが、 うまく出来ません。 どうすればよろしいでしょうか? よろしくお願いします。 #include<windows.h> #include"ChildWindow.h" char MainWindowClassName[]="mainwindow"; LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { static HWND childWnd; switch(message) { case WM_ACTIVATEAPP: childWnd=Child_CreateWindow(hWnd,message,wParam,lParam); break; case WM_DESTROY: DestroyWindow(childWnd); PostQuitMessage(0); break; default: return DefWindowProc(hWnd,message,wParam,lParam); } } ///////////////////////////////////////////// #include<windows.h> char ChildWindowClassName[]="childwindow"; LRESULT CALLBACK ChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: MessageBox(NULL,"","",MB_OK); break; default: return DefWindowProc(hWnd,message,wParam,lParam); } } ATOM Child_RegistWindow(HINSTANCE hInstance){} HWND Child_InitInstance(HWND hParentWnd,HINSTANCE hInst,int CmdShow){} HWND Child_CreateWindow(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { int CmdShow=1; Child_RegistWindow(NULL); HWND ChildWnd=Child_InitInstance(hWnd,NULL,CmdShow); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return ChildWnd; }

  • C++ WIN32 ウィドウの表示

    プログラミング初心者です。 WIN32APIの勉強を始めたばかりの状態です。 本を見ながら、ウィンドウを表示させるだけのプログラムを書いてみたのですが、エラーになってしまいます。 #include <windows.h> //ウィンドウ・クラス名 #define MYWNDCLSNAME "MyWindowClass" LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wndcls; HWND hWnd; MSG msg; //ウィンドウ・クラスを登録 ZeroMemory(&wndcls, sizeof(wndcls)); wndcls.lpfnWndProc = WndProc; wndcls.hInstance = hInst; wndcls.hIcon = LoadIcon(0, IDI_APPLICATION); wndcls.hCursor = LoadCursor(0, IDC_ARROW); wndcls.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wndcls.lpszClassName = MYWNDCLSNAME; if(RegisterClass(&wndcls) == 0) return -1; //メイン・ウィンドウを作成 hWnd = CreateWindow(MYWNDCLSNAME, "My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInst, NULL); if(hWnd == 0) return -2; //ウィンドウの表示状態を指定する ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); //メッセージループ while(GetMessage(&msg, 0, 0, 0)){ DispatchMessage(&msg); } //WM_QUITメッセージのwParamを終了コードにする return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; } //自分で処理しないメッセージはWindowsに任せる return DefWindowProc(hWnd, uMsg, wParam, lParam); } 本を読み直しても原因がよくわかりません。 どこがいけないのかご指摘いただけるとうれしいです。お願いします。 エラーの内容は error C2440: '=' : 'const char [14]' から 'LPCWSTR' に変換できません。 error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [14]' から 'LPCWSTR' に変換できません。 です。

  • ダイアログ表示後に1回だけ実行

    ダイアログベースのプログラムで、ダイアログを表示後にメッセージボックスを表示しようとして、下のプログラムのようにしたのですがダイアログが表示される前にメッセージボックスが表示されてしまいます。 ダイアログが表示された直後に1回だけ表示されるようにするにはどうすればいいですか? #include<Windows.h> #include "resource.h" HINSTANCE hinst; INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { hinst=hInstance; DialogBox(hinst,TEXT("mydlgmain"),NULL,dlgproc); } INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { TCHAR moji[]=TEXT("ダイアログ表示"); switch(msg) { case WM_INITDIALOG: MessageBox(hwnd,moji,TEXT(""),MB_OK); return(INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwnd,LOWORD(wp)); return (INT_PTR)TRUE; } return(INT_PTR)FALSE; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • WINAPI editbox内の文字が文字化けする

    プログラムは、ウィンドウ内にエディットボックスを表示するだけのものです。 下のプログラムを実行すると、エディットボックス内に ”繧ィ” と表示されます。また、“エディタ“ と入力すると ”ィ」ソ” と表示されます。 GetWindowTextでテキストを取得すると、MessageBoxには何も表示 されませんでした。 使用しているパソコンはwindows10です。 どうすれば文字化けが解消されるのでしょうか。 #include <stdio.h> #include <windows.h> HINSTANCE hinstance; TCHAR tch[128]; LRESULT CALLBACK winpr(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR lpcmdline,int ncmdshow) { TCHAR szwinClass[]=TEXT("samp1"); TCHAR sztitle[]=TEXT("サンプル"); int width=720; int height=720; WNDCLASSEX wcx; HWND hwnd; MSG msg; hinstance=hinst; wcx.cbSize=sizeof(WNDCLASSEX); wcx.style=CS_HREDRAW | CS_VREDRAW; wcx.hbrBackground=(HBRUSH)(COLOR_WINDOWTEXT+1); wcx.cbClsExtra=0; wcx.cbWndExtra=0; wcx.hIcon=NULL; wcx.hIconSm=NULL; wcx.hCursor=LoadCursor(NULL,IDC_ARROW); wcx.hInstance=hinstance; wcx.lpfnWndProc=winpr; wcx.lpszClassName=szwinClass; wcx.lpszMenuName=sztitle; if(!RegisterClassEx(&wcx)){ MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OK); return 1; } hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,szwinClass,sztitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, width,height, NULL,NULL,hinstance,NULL); if (!hwnd) { MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OKCANCEL); int err=GetLastError(); return 1; } ShowWindow(hwnd,ncmdshow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)>0){ TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT CALLBACK winpr(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam){  HDC hdc; HWND hwndedit; int id; switch(message){ case(WM_CREATE): hwndedit= CreateWindow( TEXT("edit"), TEXT("エディタ"), WS_CHILD | WS_VISIBLE , 10, 10, 200, 30, hwnd, (HMENU)1,hinstance, NULL); return 0; case(WM_CLOSE): GetWindowText(hwndedit,tch,GetWindowTextLength(hwndedit) + 1); MessageBox(hwnd,tch,TEXT("文字化け"),MB_OK); id=    MessageBox(hwnd,TEXT("閉じる"),TEXT("閉じる"),          MB_OKCANCEL); if (id==IDOK){ DestroyWindow(hwnd); } return 0; case(WM_DESTROY): PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,message,wparam,lparam); } }

  • マウスフックについて

    Dllにてマウスフックをして、左ボタンが押しあがったらWM_LBUTTONUPされたら メッセージを送信するというものです。 そのときに、マウスの位置はどこにあってもいいのです。 たとえば、自分のウインドウの中で左ボタンを押して、 デスクトップ上などで左ボタンがあがったらメッセージを送信するというようにしたいのですがうまくいきません。 以下がソースです。 よろしくお願いします。 #include <windows.h> #include "MouseHook.h" HINSTANCE hInst; HHOOK hHook; HWND hWnd; BOOL bHook; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) { hInst = hInstance; return TRUE; } EXPORT int SetMainHWND(HWND hMainWindow) { hWnd = hMainWindow; return 0; } EXPORT BOOL IsHooking() { if (bHook) return TRUE; else return FALSE; } EXPORT int MouseHookSet() { hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc,hInst, NULL); if (hHook == NULL) { return -1; } else { bHook = TRUE; return 0; } } EXPORT int MouseHookEnd() { if (UnhookWindowsHookEx(hHook) != 0) { bHook = FALSE; return 0; } else { return -1; } } EXPORT LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { MOUSEHOOKSTRUCT *pmh; pmh = (MOUSEHOOKSTRUCT *)lParam; if (wParam == WM_LBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } if (wParam == WM_NCLBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } return CallNextHookEx(hHook,nCode,wParam,lParam); }

  • コンボボックスのボタンを押しても、アイテムリストが開きません。

    コンボボックスのボタンを押しても、アイテムリストが開きません。 h_ComboBox = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""),WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,16, 90, 500, 24,hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL); SendMessage(h_ComboBox, CB_ADDSTRING, 0, (LPARAM)"試験1"); SendMessage(h_ComboBox, CB_ADDSTRING, 0, (LPARAM)"試験2"); SendMessage(h_ComboBox, CB_ADDSTRING, 0, (LPARAM)"試験3"); SendMessage(h_ComboBox, CB_SETCURSEL, 0, 0); このようなボックスを数個作っていますが、最初の3個のボックスはリストが開くのですが後が開きません。 解決策を教えてください。

  • GetModuleFileNameでエラーが出てしまう。

    #include<windows.h> #include<string.h> // 関数のプロトタイプ宣言 VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam); // エントリポイント int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { char Caption[201]; char FileName[1024]=""; char FindList[1][80]={"Microsoft Internet Explorer"}; GetWindowText(hwnd, Caption, 200); for(int i=0;i<=0;i++) if(NULL!=strstr(Caption,FindList[i])) { HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); if(GetModuleFileName(hInst, FileName, 1023)!=0) { // ファイル名取得成功したときの動作 MessageBox(NULL,Caption,FileName,MB_OK|MB_SETFOREGROUND); }else{ MessageBox(NULL,Caption,"Error",MB_OK|MB_SETFOREGROUND); } } return true; } 実行するとIEが起動されてたらそのウインドウのキャプションとプログラム名を表示される予定なのですが、 GetModuleFileNameでエラーが返されます。 何が原因なのでしょう?

  • CREATESTRUCT と GetWindowLong

    HINSTANCE hInst; CREATESTRUCT *lpcrea; lpcrea = (CREATESTRUCT *)lParam; hInst = lpcrea->hInstance; と HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); は、どういう意味なのか、どこが違うのか教えてください。 メインのウインドウのインスタンスをグローバル宣言して いなかった場合に、プロージャ内でメインのウインドウの インスタンスを得ているんだと思うんだけど、細かい部分の 説明をしてほしいです。

  • ブレイクポイントについて

    #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 ); hWnd2 = CreateWindow( "hWnd1", "親ウインドウの子", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, // 親ウィンドウの子 NULL, hInstance, NULL ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); ShowWindow( hWnd2, nCmdShow ); UpdateWindow( hWnd2 ); while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam ; } LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { default: ブレイクポイント3return DefWindowProc( hWnd, iMessage, wParam, lParam ); } return 0; } LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { case WM_DESTROY: ブレイクポイント1postQuitMessage(0); break; ブレイクポイント2return DefWindowProc( hWnd, iMessage, wParam, lParam ); } のプログラムを組んで実行して、ブレークポイントでやったのですがまず親ウィンドウの終了ボタンを押したらブレイクポイント1が通り、次にブレイクポイント2が通りここまではいいのですがブレイクポイント3が三回繰り返して実行されるのですが、なぜ三回繰り返されるのでしょうか?

  • プロトタイプが必要な場合

    WndProc関数の前にFunc関数を書いているから、WndProc関数の ソースがコンパイルされる時はFunc関数は既に読み込み済みで Func関数のプロトタイプは必要無いと思ったんだけど、必要なんですか? #include <windows.h> int Func(HWND); ←これは必要ですか? LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpstr, int n) {  … } int Func(HWND hWnd) {  … } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {  static int i;  switch(uMsg){  case WM_CREATE:   i = Func(hWnd);   break;  … }

専門家に質問してみよう