作者共发了1篇帖子。 字体大小:较小 - 100% (默认)▼  内容转换:不转换▼
 
点击 回复
265 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)
 

本帖信息

点击数:265 回复数:0
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-4-16 19:01
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。