我正在尝试学习一些windows和directX编程,我正在尝试一些不同的东西。当我的窗口突然停止出现,即使它是一个成功的构建。我想我一定搞砸了一些东西,我撤消了一切,直到我回到我最后一次设法让窗口出现的地方,但现在当我运行时(成功构建)它仍然没有显示:(我开始想不出问题可能是什么,它太奇怪了。自从上次我让它工作以来,我所做的一件事是添加一些库目录,但我很难看到这会如何影响程序。你们中有人遇到过这个问题吗?如果遇到过,你们是怎么解决的?下面是创建窗口的函数代码(是的,我知道无限循环,但它不应该导致这个问题,对吧?):
p。我也试过在WINDCLASSEX和WINDCLASS之间切换,所有需要改变的功能,没有任何区别。
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow){
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
RegisterClass(&wc);
RECT wr = {0, 0, 500, 400}; // set the size, but not the position
AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); // adjust the size
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"My first window", // Window text
WS_OVERLAPPEDWINDOW, // Window style
CW_USEDEFAULT, CW_USEDEFAULT,//position x,y
wr.right-wr.left, wr.bottom-wr.top,//width, height
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL){
return 0;
}
InitD3D(hwnd);
// Run the message loop.
MSG msg = { };
while (true){
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
}
}
return 0;
}
看起来您需要在那里调用ShowWindow
(除非InitD3D
这样做,否则您没有显示代码)
窗口在默认情况下是不可见的,所以你可以在用户看不到
的情况下进行各种初始化。作为另一种选择,您可以创建已经可见的窗口,但通常保持单一约定
是一个好主意。顺便说一下,你可以使用标准的
int main
,不需要使用微软的怪物
与GNU工具链,这就是全部,与微软的工具,然后你必须告诉链接器接受标准代码,如果你使用GUI子系统,通过链接器选项/entry:mainCRTStartup
。
同样,对非阻塞PeekMessage
的调用意味着你的消息循环很可能是一个CPU占用者
使用阻塞GetMessage
,并记住在GetMessage
返回0时退出循环(这表明已经发布了WM_QUIT
消息)