【发布时间】:2021-05-29 06:40:16
【问题描述】:
所以我是一名大学生,本学期正在使用 OpenGL,并尝试使用 WINAPI 根据课程说明显示一个窗口。我一步一步地按照教授给出的代码运行,代码运行没有错误,但是当我在调试模式下运行它时,我看不到我告诉视觉工作室显示的控制台或窗口。这是在使用 c++ 的 Visual Studio 2019 中。我知道代码是正确的,因为我看到它在教授机器上运行。我想知道是否有人知道发生了什么。
#include "Main.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
//callbacks for winapi
switch (msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
if (wParam == 27)
{
PostQuitMessage(0);
}
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
break;
}
return 0;
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
//Initialize Window ----------------------------------------------------------------------
#pragma region Window Initialization
if (AllocConsole())
{
FILE* stream;
_wfreopen_s(&stream, TEXT("CONIN"), TEXT("rb"), stdin);
_wfreopen_s(&stream, TEXT("CONOUT"), TEXT("wb"), stdout);
_wfreopen_s(&stream, TEXT("CONIN"), TEXT("rb"), stderr);
}
WNDCLASSEX wc; //Window information Container
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(wc.hInstance, (LPCTSTR)IDI_ICON);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = L"MEWINDOW";
wc.hIconSm = LoadIcon(wc.hInstance, (LPCTSTR)IDI_ICON);
if (!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Window registration failed!", L"Error!!!", MB_ICONEXCLAMATION | MB_OK);
exit(0);
return E_FAIL;
}
DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
DWORD dwWindowStyle = WS_OVERLAPPEDWINDOW;
RECT rc = { (long)0, (long)0, (long)600, (long)600 };
AdjustWindowRectEx(&rc, dwWindowStyle, FALSE, dwExStyle);
LPCWSTR windowName = L"OpenGL - Window";
HWND hWindowHandler = CreateWindowEx(dwExStyle,
L"MEWINDOW",
windowName,
dwWindowStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
100, 100,
600, 600,
NULL, NULL,
hInstance,
NULL);
if (hWindowHandler == NULL)
{
MessageBox(NULL, L"Window creation failed!", L"Error!!!", MB_ICONEXCLAMATION | MB_OK);
exit(0);
return E_FAIL;
}
ShowWindow(hWindowHandler, nCmdShow);
UpdateWindow(hWindowHandler);
#pragma endregion
//OpenGL Init ----------------------------------------------------------------------
#pragma region OpenGL Initialization
#pragma endregion
//Shader Compilation ----------------------------------------------------------------------
#pragma region Shader Initialization
#pragma endregion
//Shape Configuration ----------------------------------------------------------------------
#pragma region Shape Initialization
#pragma endregion
//Game Loop ----------------------------------------------------------------------
#pragma region Game Loop
#pragma endregion
std::cout << "Hello World\n";
getchar();
return 0;
}
【问题讨论】:
-
你的message loop呢?
-
@rustyx 这是教授在视频中运行的代码,他得到一个控制台说“Hello World”和一个我们初始化的空白窗口
-
@Ron 不幸的是,我们被告知使用我在问题中提供的代码库。这就是为什么我很困惑为什么什么都没有出现
-
您的项目中是否包含资源文件,其中包含带有
IDI_ICON标识符的图标?如果没有,那么这可能会导致您的程序无法运行。 -
@RyanXLVI 没有message loop,你的
WndProc是没用的。
标签: c++ visual-studio winapi