1

当用户单击一个按钮时,我想打开另一个窗口。所以在 OnBnClicked..() 函数中,我添加了以下代码:

CWnd* window = new CWnd;
BOOL result = window->CreateEx(WS_EX_CLIENTEDGE, _T("STATIC"), _T("Hi"), WS_CHILD | WS_VISIBLE, 0, 0, 20, 20, m_hWnd, (HMENU)1234);
window->ShowWindow(SW_SHOW);

这有效,除了它创建了一个子窗口。我需要的是一个单独的窗口。所以我修改了代码,将“WS_CHILD”更改为“WS_POPUP”,将“m_hWnd”更改为“NULL”。

CWnd* window = new CWnd;
BOOL result = window->CreateEx(WS_EX_CLIENTEDGE, _T("STATIC"), _T("Hi"), WS_POPUP | WS_VISIBLE, 0, 0, 20, 20, NULL, (HMENU)1234);
window->ShowWindow(SW_SHOW);

但是现在,CreateEx() 调用返回 FALSE。我会很感激一些指针。

[编辑:]

我更新了代码如下。但仍然看到同样的问题。此外,即使 CreateEx() 返回 FALSE,GetLastError() 实际上也返回 0。

CWnd* window = new CalibrationWindow;
LPCTSTR className = NULL;
if (!className) {
className = AfxRegisterWndClass(
    CS_VREDRAW | CS_HREDRAW,
  ::LoadCursor(NULL, IDC_ARROW),
  (HBRUSH) ::GetStockObject(WHITE_BRUSH),
  ::LoadIcon(NULL, IDI_APPLICATION));
}
BOOL isValid = ::IsWindow(GetSafeHwnd());
BOOL result = window->CreateEx(0, _T(className), _T("Hi"), WS_POPUP | WS_VISIBLE, 0, 0, 20, 20, m_hWnd, (HMENU)1234);
DWORD errorCode;
if (!result) {
    errorCode = GetLastError();
}
window->ShowWindow(SW_SHOW);
4

2 回答 2

2

nIDornIDorHMenu参数是一个“CWnd::CreateEx重载”参数,它指定控件 ID 或菜单 ID。

对于子窗口(WS_CHILD窗口样式),它是控件标识符。您可以指定任何值,只要它在具有相同父窗口的所有子窗口中是唯一的即可。

另一方面,对于弹出窗口(具有WS_CHILD窗口样式的窗口),它是菜单标识符。在这种情况下,它必须是有效的HMENU. 传递一个虚构的值将导致窗口创建失败。

于 2013-08-21T23:23:17.060 回答
1

以下是如何使用不同的方法从 CWnd 派生类创建窗口:

CWndDerived myWnd;

LPCTSTR className = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
    nullptr,
    (HBRUSH) ::GetStockObject(WHITE_BRUSH),
    nullptr);
myWnd.CreateEx(
    0,  // WS_EX_TOPMOST
    className,
    _T("Title"),
    WS_POPUP | WS_BORDER | WS_CAPTION | WS_MAXIMIZEBOX | WS_SYSMENU,
    0, 0, 300, 200,
    m_hWnd,
    nullptr,
    nullptr);

这允许您将您的CWndDerived myWnd作为其他窗口的成员变量(如果您需要它)并保留 MSVC 的 MFC 类编辑器附带的所有好东西。

我希望这有帮助

于 2014-05-29T02:41:22.460 回答