スポンサーリンク

リソースから作成したダイアログボックスのコントロールへアクセスする

1.WindowHandle → Resource ID

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;
}

 

 

2.Resource ID → WindowHandle

次に、ハンドルはわかるがリソース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;
}

 

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: