在main.cpp中:
#include "window.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
Window main_window(hInstance, nCmdShow);
main_window.Intitialize(CS_HREDRAW, NULL, LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW), (WIDE_CHAR) "Application", (WIDE_CHAR) "WindowName");
return main_window.Show();
}
在window.h 中:
#include <stdio.h>
#ifndef _WINDOW_H_
#define _WINDOW_H_
#include <windows.h>
typedef wchar_t* WIDE_CHAR;
typedef HINSTANCE INSTANCE;
typedef HWND HANDLE_WINDOW;
typedef tagWNDCLASSEXW WINDOW_CLASS;
LRESULT Procedure(HANDLE_WINDOW, UINT, WPARAM, LPARAM);
class Window {
private:
INSTANCE instance;
int show_command;
WINDOW_CLASS window_object;
HANDLE_WINDOW handle;
public:
Window(INSTANCE instance, int show_command) {
this->instance = instance;
this->show_command = show_command;
}
void Intitialize(UINT style, HICON icon, HCURSOR cursor, HBRUSH background, WIDE_CHAR class_name, WIDE_CHAR title) {
window_object.cbSize = sizeof(WINDOW_CLASS);
window_object.cbClsExtra = 0;
window_object.cbWndExtra = 0;
window_object.hInstance = instance;
window_object.lpfnWndProc = Procedure;
window_object.style = style;
window_object.hIcon = icon;
window_object.hCursor = cursor;
window_object.hbrBackground = background;
window_object.lpszMenuName = NULL;
window_object.lpszClassName = class_name;
window_object.hIconSm = NULL;
RegisterClassExW(&window_object);
printf("%lld", GetLastError());
handle = CreateWindowExW(WS_EX_CLIENTEDGE, class_name, title, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1080, 720, NULL, NULL, instance, NULL);
}
int Show() {
ShowWindow(handle, show_command);
UpdateWindow(handle);
MSG message;
while (GetMessageW(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessageW(&message);
}
return message.wParam;
}
};
LRESULT Procedure(HANDLE_WINDOW handle, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CLOSE:
DestroyWindow(handle);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(handle, message, wParam, lParam);
break;
}
return 0;
}
#endif
我試著把Win32的界面包起來,試著做個視窗,但總是卡在一些奇怪的地方,比如Unicode...
首先,我不能完全理解寬字符的使用和轉換。我認為視窗注冊和視窗創建失敗的很大一部分原因在于使用了寬字符和普通字符。其次,我不明白為什么我不能使用命名空間“std”,一旦我使用它,甚至視窗注冊都會失敗。
uj5u.com熱心網友回復:
你正在傳遞(WIDE_CHAR) "Application"和(WIDE_CHAR) "WindowName"到Intitialize。
正如你定義的
typedef wchar_t* WIDE_CHAR;
引數是NARROW字符轉換為WIDE字符。當CreateWindowExW嘗試訪問它們時,它會越界(因為寬字串是窄字串的兩倍),從而導致錯誤:
ERROR_NOACCESS 998 (0x3E6) Invalid access to memory location.
根據https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--500-999-
改為這樣做:
main_window.Intitialize(CS_HREDRAW, NULL, LoadCursor(NULL, IDC_ARROW),
(HBRUSH)(COLOR_WINDOW), L"Application", L "WindowName");
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449962.html
