【Windows API】リソース名はMAKEINTRESOURCEを使用しなければならない?
昨日と今日はWin32APIと格闘してました。大喧嘩です。疲れました(´;ω;`)
苦戦した理由は、リソース(ダイアログボックス)を使用するときに上手くいかなかったことです。
解決策も見つかりました。簡単に説明すると、リソース名を入力するときは、MAKEINTRESOURCEというマクロを使う必要があるようです。
meideru blogの読者の方の中にも、同じような内容で苦労している方がいるかもしれないので、今日の記事に詳しく書こうと思います。
目次
スポンサーリンク
事の発端
事の発端は、ダイアログボックスを表示しようと思ったことです。
以下のようなソースを書きました。
// dialog01.cpp #include <windows.h> #include "resource.h" BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { // ダイアログボックスを表示 DialogBox( hCurInst, // インスタンスハンドル TEXT("IDD_DIALOG1"), // リソース名 NULL, // 親ウィンドウハンドル (DLGPROC)MyDlgProc); // プロシージャ名 return 0; } // ダイアログプロシージャ BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_COMMAND: switch (LOWORD(wp)) { case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDOK: EndDialog(hDlg, IDCANCEL); return TRUE; } return FALSE; } return FALSE; }
リソースヘッダは以下のように記述しました。
#define IDD_DIALOG1 101
リソースファイルは以下のように記述しました。
IDD_DIALOG1 DIALOGEX 0, 0, 309, 177 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,198,156,50,14 PUSHBUTTON "キャンセル",IDCANCEL,252,156,50,14 END
予定だと、以上のコードをコンパイルすると、ダイアログボックスが表示されるはずですが
実際にはそうはなりませんでした・・・。
問題点は、DialogBox関数の第二引数のTEXT(“IDD_DIALOG1”)にあります。デバッグによって発見しました。
MSDNでDialogBox関数を調べると以下のように書いてあります。
INT_PTR DialogBox( HINSTANCE hInstance, // モジュールのハンドル LPCTSTR lpTemplate, // ダイアログボックステンプレート HWND hWndParent, // オーナーウィンドウのハンドル DLGPROC lpDialogFunc // ダイアログボックスプロシージャ );
第二引数はLPCTSTRですので、const char*と同じ意味です。引数としては、TEXT(“IDD_DIALOG1”)は正しいはずです。
しかし、正常に動作せず・・・。
解決策
実は、以前にも同じような問題に出くわしたことがありました。
それは、「【Win32API】リソースをバイナリで出力する方法」という記事に書いてあります。
【関連記事】
・【Win32API】リソースをバイナリで出力する方法
そのときは、リソース名にMAKEINTRESOURCEというマクロを使用していました。なので、今回のケースにもそれを適用してみました。
具体的には、DialogBox関数の第二引数のTEXT(“IDD_DIALOG1”)をMAKEINTRESOURCE(IDD_DIALOG1)と入れ替えてみました。
すると・・・
上手く行きました!!!
しっかりとダイアログボックスが表示されました!!
原因は何だったのか
原因は、未だに不明です(・.・;)
ネットで調べてみたのですが、わかりませんでした。
LPCTSTR = const char* なので、TEXT(“リソース名”)で正しいと思うんですけどね・・・。
謎です。
なにか知っている方は是非教えて下さい!
ノシ
スポンサーリンク
関連記事