Я пытаюсь научиться программировать на Windows и DirectX, и я пытаюсь попробовать разные вещи. Когда вдруг мои окна перестали появляться, даже если это была успешная сборка. Я подумал, что, должно быть, что-то испортил и отменил все, пока не вернулся в то место, где мне в последний раз удалось открыть окно, но теперь, когда я запускаю (с успешной сборкой), оно все равно не отображается 🙁 И У меня заканчиваются идеи о том, в чем может быть проблема, это так странно. Одна из вещей, которые я сделал с тех пор, как в последний раз заставил его работать, это добавление некоторых каталогов libs, но мне трудно понять, как это повлияет на Запрограммируйте этот путь. Кто-нибудь из вас сталкивался с этой проблемой раньше, и если да, то как вы ее решили? Вот код функции, создающей окно (и да, я знаю о бесконечном цикле, он не должен вызывать эта проблема, правда?)
пс. Я также пытался переключаться между WINDCLASSEX и WINDCLASS, со всеми функциями, которые должны быть изменены с ним, не имело никакого значения ds.
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
, не нужно использовать Microsoft чудовище
с инструментарием GNU это все, с инструментами Microsoft вы должны сказать компоновщику принять стандартный код, если вы используете подсистему GUI, через опцию компоновщика /entry:mainCRTStartup
,
также призыв к неблокированию PeekMessage
означает, что ваш цикл обработки сообщений, скорее всего, будет загружен процессором
вместо этого используйте блокировку GetMessage
и не забудьте выйти из цикла, когда GetMessage
возвращает 0 (что указывает на WM_QUIT
сообщение опубликовано)
Других решений пока нет …