【发布时间】:2019-11-27 03:54:21
【问题描述】:
考虑以下代码:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PWSTR pCmdLine, int nCmdShow) {
MSG msg;
HWND hwnd;
WNDCLASSW wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.lpszClassName = L"Window";
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpszMenuName = NULL;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassW(&wc);
hwnd = CreateWindowW(wc.lpszClassName, L"Window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 350, 250, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0)) {
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
这会创建一个空白窗口,我想重现它,但使用 main 入口点而不是 wWinMain。
以下代码有效,但感觉很hacky:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int main(int argc, HINSTANCE argv) {
MSG msg;
HWND hwnd;
WNDCLASSW wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.lpszClassName = L"Window";
wc.hInstance = argv;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpszMenuName = NULL;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassW(&wc);
hwnd = CreateWindowW(wc.lpszClassName, L"Window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 350, 250, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0)) {
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
有没有更好的办法?
【问题讨论】:
-
你会发现this question值得一读。
-
@WhozCraig 这正是我想要的,谢谢。您能否考虑留下答案,以便我接受。
-
main是控制台应用程序的用户程序入口点。WinMain是 Windows 应用程序的用户程序入口点。那么为什么要main作为入口点呢?只需使用WinMain。 -
@PaulOgilvie 我不能那样做。我想设计一个在多个平台上创建 gui 的包装器。我希望它适用于 Linux 和 Windows。在 Windows 上,它将调用 WinApi 的函数,而在 Linux 上,它将调用 GTK,因此用户将需要使用
main入口点,因为这两者都适用,而 WinMain 只能在 Windows 上运行。 HINSTANCE 不是跨平台的,但我调整了我的代码,以便在特定平台上根据需要使用它。 -
只需创建两个主文件,一个用于 windows,一个用于您的其他平台。如图所示,您的整个 Apporach 使用 Windows,例如
WNDCLASS和RegisterClass,因此它已经是特定于 Windows 的。您还说您针对不同平台调整代码,现在为什么不这样做呢?听起来你想解决错误的问题,。
标签: c winapi main entry-point hinstance