目前共有1篇帖子。 內容轉換:不轉換▼
 
點擊 回復
194 0
其实,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();
}

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:194 回複數:0
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-4-16 19:01
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。