嵌套对话框过程

Nested Dialog Procedures

本文关键字:过程 对话框 嵌套      更新时间:2023-10-16

我不确定如何调用某些类的对话框过程,正在寻求帮助。

我知道对于正常的消息过程,您可以在 MessageProc 中执行此操作:

case WM_CREATE:
{   
    CREATESTRUCT* cs = (CREATESTRUCT*)_lParam;
    pApplication = (CApplication*)cs->lpCreateParams;
    return pApplication->MessageProc(_Msg, _wParam, _lParam);
}

这将允许您创建独立于类的消息处理。

但是,由于我不知道前两行的确切工作原理(只是它们返回应用程序的"this"指针的定义),我无法弄清楚该怎么做才能让我的对话框过程做类似的事情

case WM_INITDIALOG:
{
    //How can I get the pointer to the inspector that 
    //I want to call the dialog proc on?
    return pInspector->DlgProc(_hWndDlg, _Msg, _wParam, _lParam);
}

任何帮助既能使检查员的指针正常工作,又能准确澄清其他两行在WM_CREATE中正在做什么,将不胜感激

创建窗口时,它会收到一条WM_CREATE消息,其中包含指向CREATESTRUCT结构的指针,并且其中有一个指针大小的用户数据字段(lpCreateParams)。此值来自传递给 CreateWindowEx() 函数的lpParam参数。

这是允许您将自己的类或数据结构与窗口实例相关联的常规机制。

此指针通常需要保存在某个地方,以便以后使用它。执行此操作的一种常见方法是将其存储在窗口属性中:

case WM_CREATE:
{
    CREATESTRUCT* cs = (CREATESTRUCT*)_lParam;
    pApplication = (CApplication*)cs->lpCreateParams;
    SetProp(hWnd, L"my.property", (HANDLE)pApplication);
}

然后在处理其他消息时检索该值:

pApplication = (CApplication*)GetProp(hWnd, L"my.property");

对话框与普通窗口不完全相同,因此尽管存在类似的机制,但它的实现方式不同。当对话框过程收到WM_INITDIALOG消息时,lParam值等效于WM_CREATE消息中的lpCreateParams值。

为了保存pInspector值,需要在创建对话框时将其作为dwInitParam值提供,但假设它是,您可以以类似的方式处理此问题:

case WM_INITDIALOG:
{
    pInspector = (CInspector*)lParam;
    SetProp(hWnd, L"my.property", (HANDLE)pInspector);
}

并在处理其他消息时检索值:

pInspector = (CInspector*)GetProp(hWnd, L"my.property");