当用户点击按钮时,我想调出另一个窗口。所以在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);
答案 0 :(得分:2)
CWnd::CreateEx
的nID
或nIDorHMenu
参数是一个'重载'参数,可以指定控件ID或菜单ID。
对于子窗口(WS_CHILD
窗口样式),它是控件标识符。您可以指定任何值,只要它在具有相同父窗口的所有子窗口中是唯一的。
另一方面,对于弹出窗口(具有WS_CHILD
窗口样式的窗口),它是菜单标识符。在这种情况下,它必须是有效的HMENU
。传递一个补偿值将导致窗口创建失败。
答案 1 :(得分: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类编辑器附带的所有好东西。
我希望这会有所帮助