0

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

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

case WM_CREATE:
{   
    CREATESTRUCT* cs = (CREATESTRUCT*)_lParam;
    pApplication = (CApplication*)cs->lpCreateParams;

    return pApplication->MessageProc(_Msg, _wParam, _lParam);
}

这将允许您创建一个独立于类的 Message Proc。

然而,由于我不确切知道前两行是如何工作的(只是它们返回应用程序的“this”指针的定义),我不知道该怎么做才能让我的 Dialog Procedures 去做类似的事情

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 中其他两行正在做什么的任何帮助将不胜感激

4

1 回答 1

1

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

这是一种通用机制,可让您将自己的类或数据结构与窗口的实例相关联。

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

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值等同于消息中的lpCreateParamsWM_CREATE

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

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

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

pInspector = (CInspector*)GetProp(hWnd, L"my.property");
于 2013-10-24T19:05:04.133 回答