【问题标题】:Accessing controls within Property Sheet访问属性表中的控件
【发布时间】:2019-07-01 03:55:49
【问题描述】:

我正在使用 PropertySheet(Wizard97 类型)创建一个 Windows 应用程序,但我不清楚如何从对话框回调中访问控件。

首先我设置属性表。

psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].dwFlags = PSP_HIDEHEADER ;
psp[1].hInstance = g_hInst;
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_SETUP);
psp[1].pszIcon = NULL;
psp[1].pfnDlgProc = (DLGPROC)ButtonsDlgProc;
psp[1].lParam = 0;

所以在 ButtonsDlgProc 中,我无法访问已添加到对话框中的控件。

LRESULT CALLBACK ButtonsDlgProc(HWND hdlg,
      UINT uMessage,
      WPARAM wParam,
      LPARAM lParam)
{
CButton * button;

switch (uMessage)
{
    case WM_COMMAND:
    switch (wParam)
    {
        case IDC_CHECK1:
            button = (CButton *)GetDlgItem(hdlg, IDC_CHECK1);
            button1IsChecked = button->GetCheck();
            break;

GetDlgItem 返回一个句柄,但是在调用 button->GetCheck() 时,我得到一个异常。这是访问控制成员的正确方法吗?

【问题讨论】:

  • GetDlgItem(hdlg, IDC_CHECK1) 返回HWND,您不能将其转换为CButton*,它们是两个不相关的对象。如果这是 MFC 的 CWnd::GetDlgItem(IDC_CHECK1),那么您可以将 CWnd* 转换为 CButton*。或者您可以使用CWnd::Attach(HWND) 将句柄附加到CButton* - 无论如何,我对您为什么要像这样将MFC 与WinAPI 混合使用感到困惑。请详细说明。否则使用CPropertySheet等。
  • 好点。我对 MFC 比较陌生,所以我没有意识到我正在混合 MFC 和 WinAPI。我将重构以使用 CPropertySheet。谢谢。

标签: c++ visual-c++ mfc propertysheet


【解决方案1】:

实现它的最简单方法是

button = (CButton *)CWnd::FromHandle(::GetDlgItem(hdlg, IDC_CHECK1));

【讨论】:

  • 这行得通。谢谢你。我还将尝试重构我的代码以使用 CPropertySheet。
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多