这看起来像是重复,但请先听我说。这更多是在调试方面。 我正在尝试使用here方法删除窗口的边框。
哪些东西会使这些功能无效?使用ShowWindow(Handle, SW_HIDE)
隐藏窗口也不起作用。我已经创建了自己的Window类,有很多函数,所以我不想在这里粘贴我的整个代码。
这是窗口的初始化函数:
HRESULT SampleWindow::InitializeSimple(SampleWindow* win)
{
HRESULT hr;
HWND hWnd;
SampleWindow* sampleWin;
sampleWin = new SampleWindow();
aMWindowProps->Center();
hWnd = CreateWindowEx(
NULL,
aMWindowProps->aWindowClass,
aMWindowProps->aWindowTitle,
WS_OVERLAPPEDWINDOW,
aMWindowProps->aRealLeft,
aMWindowProps->aRealTop,
aMWindowProps->GetRelativePosWidth(),
aMWindowProps->GetRelativePosHeight(),
HWND_DESKTOP,
NULL,
*aMWindowProps->aHInstance,
sampleWin);
aMWindowProps->aHwnd = &hWnd;
hr = hWnd ? S_OK : E_FAIL;
win->aHwnd = &hWnd;
//ShowWindow(hWnd, SW_SHOWNORMAL);
return hr;
}
您可以看到 WindowProps
包含有关正在创建的窗口的各种信息。
我的类中还有一个HWND
指针变量指向窗口处理程序。
以下是我在main上尝试过的一些内容,其中sw2是指向我的窗口类的指针:
ShowWindow(*sw2->aHwnd, SW_SHOW);
//ShowWindow(*sw2->aHwnd, nCmdShow);
LONG lStyle = GetWindowLong(*sw2->aHwnd, GWL_STYLE);
lStyle &= WS_POPUP;
//lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
SetWindowLong(*sw2->aHwnd, GWL_STYLE, lStyle);
//ShowWindow(*sw2->aHwnd, SW_MINIMIZE);
//ShowWindow(*sw2->aHwnd, SW_HIDE);
//ShowWindow(*sw2->aHwnd, SW_HIDE);
//SetWindowLong(*sw2->aHwnd, GWL_STYLE, GetWindowLong(*sw2->aHwnd, GWL_STYLE) && ~ WS_BORDER && ~ WS_SIZEBOX && ~ WS_DLGFRAME);
SetWindowPos(*sw2->aHwnd, HWND_TOP, sw2->aMWindowProps->aRealLeft, sw2->aMWindowProps->aRealTop, sw2->aMWindowProps->aRealWidth, sw2->aMWindowProps->aRealHeight, SWP_FRAMECHANGED);
//LONG lExStyle = GetWindowLong(*sw2->aHwnd, GWL_EXSTYLE);
//lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
//SetWindowLong(*sw2->aHwnd, GWL_EXSTYLE, lExStyle);
//SetWindowPos(*sw2->aHwnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
我想知道一些关于调试代码的建议。我知道这些功能正常工作,因为我在一个更简单的窗口项目(来自Microsoft的示例项目)上测试了它。
答案 0 :(得分:1)
正如乔纳森·波特在评论中指出的那样,你的错误是:
aMWindowProps->aHwnd = &hWnd;
hr = hWnd ? S_OK : E_FAIL;
win->aHwnd = &hWnd;
其中HWND hWnd仅在当前方法的范围内有效。我想你在课堂上定义aHwnd就像:
HWND * aHwnd;
这至少是不必要的。你似乎把一个HANDLE(一个HWND就是其他)误认为是一种实例/对象本身。它不是,它更像是指针或引用。你总是可以安全地写:
HWND myAttribute=hWnd;
只要您在同一个过程中使用它。 (窗口句柄甚至可以跨进程边界有效,但不要告诉任何人这一点。)
事实上,我知道你没有指向句柄而不是句柄本身的情况。
注意,我明确写了关于句柄的内容,因为HWND是一种标准的窗口句柄。