代码之家  ›  专栏  ›  技术社区  ›  Sossenbinder

我将使用哪个HWND在WinMain函数中创建对话框?

  •  2
  • Sossenbinder  · 技术社区  · 9 年前

    我目前正在尝试用WTL来练习C++,我现在面临着这个问题。到目前为止,我已经与WTL合作了很多,但我总是有一个模板,它已经实现了最基本的窗口创建。然而,我现在想自己做,因为我现在无法获得模板。

    以下内容:

    这是我的WinMain:

    #include "stdafx.h"
    #pragma once
    #include "MusicPlayerDialog.h"
    #include "resource.h"
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
        LPSTR szCmdLine, int nCmdShow)
    {
        UNREFERENCED_PARAMETER(szCmdLine);
        UNREFERENCED_PARAMETER(hInstPrev);
    
        _Module.Init(NULL, hInst);
    
        MusicPlayerDialog myDialog;
        MSG msg;
    
        myDialog.Create( **//PROBLEM//** )
    
        myDialog.ShowWindow(nCmdShow);
        myDialog.UpdateWindow();
    
        while (GetMessage(&msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    }
    

    这是我的对话:

    #pragma once
    #include "stdafx.h"
    #include "resource.h"
    
    class MusicPlayerDialog : public CDialogImpl<MusicPlayerDialog> 
    {
    public:
    
        enum { IDD = IDD_MAINDIALOG };
    
        BEGIN_MSG_MAP(MusicPlayerDialog)
            MESSAGE_HANDLER(WM_CLOSE, OnClose)
            MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
            MESSAGE_HANDLER(WM_INITDIALOG, OnInit)
        END_MSG_MAP()
    
        LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        LRESULT OnInit(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    
    private:
    
    };
    

    考虑到像我这样的初学者更容易用对话框设计器创建GUI,我真的很想用对话框来实现。我很确定使用原始窗口更好,但我现在只想学习窗口、对话框等之间的通信。

    我现在的问题是,我不知道该传递给什么 myDialog.Create()

    首先,问题是我必须传递给它的HWND。我在MSDN上读了一下,似乎这个参数代表了对话框的“父”窗口。

    然而,我还没有创建任何其他窗口,所以没有什么可以传递给它。

    我不知道我的…桌面窗口必须有个句柄吗?像这样吗?我真的想不通。

    我知道有一种方法可以抓取给定窗口/对话框的父窗口,但考虑到没有什么可抓取的,我认为这在这里不起作用。

    1 回复  |  直到 9 年前
        1
  •  3
  •   Rabbid76    6 年前

    如果第二个参数为 CDialog::Create ( pParentWnd )为NULL,则对话框对象的父窗口设置为主应用程序窗口。另一种选择是使用 CWnd* AFXAPI AfxGetMainWnd( ); 如果从应用程序的主线程调用,则返回应用程序主窗口的内容。

    另请参见 CDialog::Create AfxGetMainWnd