設置 | 登錄 | 註冊

目前共有1篇帖子。

其实,Win32的窗口类就是真正的C++类,因为WNDCLASSEX类可以继承

1樓 巨大八爪鱼 2016-4-16 19:01
例如,下面的程序可以正常运行:
#include <Windows.h>

class MyClass : public WNDCLASSEX
{
protected:
    HWND hWnd;
public:
    LPTSTR szTitle;

    MyClass();
    void Register();
    void Create(int nCmdShow);
    int Loop();

    static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};

// 构造函数
MyClass::MyClass()
{
    cbSize = sizeof(WNDCLASSEX);
    cbClsExtra = 0;
    cbWndExtra = 0;
    hbrBackground = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
    hCursor = LoadCursor(NULL, IDC_ARROW);
    hIcon = LoadIcon(NULL, IDI_APPLICATION);
    hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    hInstance = hInstance;
    lpfnWndProc = WndProc; // 子类不能直接重写父类的lpfnWndProc, 否则创建窗口会失败
    lpszClassName = TEXT("MyClass");
    lpszMenuName = NULL;
    style = NULL;
}

void MyClass::Register()
{
    if (!RegisterClassEx(this))
        exit(0);
}

void MyClass::Create(int nCmdShow)
{
    hWnd = CreateWindow(TEXT("MyClass"), szTitle, WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, NULL, NULL, hInstance, NULL);
    if (!hWnd)
        exit(0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
}

int MyClass::Loop()
{
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK MyClass::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MyClass cls;
    cls.szTitle = TEXT("窗口标题");
    cls.Register();
    cls.Create(nCmdShow);
    return cls.Loop();
}

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。