CreateDialog,DialogBox各関数でダイアログを作成した場合、配置したアイテムのウィンドウハンドルをどのように取得するのか。
これにはWin32APIのGetDlgItem関数を使う。
HWND hcontrol = GetDlgItem( ダイアログボックスのウィンドウハンドル , リソースのID(数値) )
#include <Windows.h> #include "resource.h" //IDD_DIALOG1の定義が入っている #include <tchar.h> //ダイアログプロシージャ INT_PTR CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; static HWND hbtn; switch (msg) { case WM_INITDIALOG: //初期化時にボタンの名称を変更する hbtn = GetDlgItem(hDlg, IDC_BUTTON1); SetWindowText(hbtn, _T("hello")); ret = TRUE; break; case WM_CLOSE: DestroyWindow(hDlg); PostQuitMessage(0); ret = TRUE; break; } return ret; } //エントリーポイント int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { //ダイアログを作成 HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); ShowWindow(hDlg, SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
次に、ハンドルはわかるがリソースIDがわからない場合。
これにはWin32APIのGetDlgCtrlID関数を使う。
int id = GetDlgCtrlID(ウィンドウハンドル)
#include <Windows.h> #include "resource.h" #include <tchar.h> #include <crtdbg.h> //ダイアログプロシージャ INT_PTR CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; HWND hscr; int id; switch (msg) { case WM_HSCROLL: hscr = (HWND)lp;//WM_HSCROLLのlParamにはハンドルが入っている id = GetDlgCtrlID(hscr);//動かしたスクロールバーのIDを取得 _RPT1(_CRT_WARN, "ID=%d\n", id); break; case WM_CLOSE: DestroyWindow(hDlg); PostQuitMessage(0); ret = TRUE; break; } return ret; } //エントリーポイント int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { //ダイアログを作成 HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); ShowWindow(hDlg, SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }