欢迎光临
我们一直在努力

自己封装一个win32窗口框架

自己封装一个win32窗口框架

笔者自己封装了一个win32窗口框架,为便于后续的代码重用,将其写成博客。

首先是头文件:

#pragma once

#include <Windows.h>

class CMyWnd
{
public:
CMyWnd(HINSTANCE hInstance, TCHAR *szClassName);
~CMyWnd();

BOOL Create(const TCHAR *szTitle, DWORD dwWidth, DWORD dwHeight,
DWORD dwStyle = WS_OVERLAPPEDWINDOW);

void Show(DWORD dwCmdShow = SW_SHOW);

int Run();

protected:
bool RegisterWndClass();

static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

virtual LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam);

virtual void OnCommand(WPARAM wParam);

protected:
HWND m_hWnd;
HINSTANCE m_hInstance;
TCHAR *m_szMyWndClassName;
};

然后是.cpp文件:

#include "CMyWnd.h"

#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")

// ———————————public————————————

CMyWnd::CMyWnd(HINSTANCE hInstance, TCHAR *szClassName)
: m_hInstance(hInstance), m_szMyWndClassName(szClassName)
{
}

CMyWnd::~CMyWnd()
{
}

BOOL CMyWnd::Create(const TCHAR *szTitle, DWORD dwWidth, DWORD dwHeight, DWORD dwStyle)
{
if (!RegisterWndClass())
return FALSE;

m_hWnd = CreateWindowEx(
0, m_szMyWndClassName, szTitle, dwStyle, CW_USEDEFAULT,
CW_USEDEFAULT, dwWidth, dwHeight, nullptr, nullptr, m_hInstance, this);

return (m_hWnd != nullptr);
}

void CMyWnd::Show(DWORD dwCmdShow)
{
ShowWindow(m_hWnd, dwCmdShow);
UpdateWindow(m_hWnd);
}

int CMyWnd::Run()
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return static_cast<int>(msg.wParam);
}

// ———————————–protected———————————-

bool CMyWnd::RegisterWndClass()
{
WNDCLASSEX wndclass = {0};
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = CMyWnd::s_WndProc;
wndclass.hInstance = m_hInstance;
wndclass.hCursor = LoadCursor(nullptr, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.lpszClassName = m_szMyWndClassName;

return (RegisterClassEx(&wndclass) != 0);
}

LRESULT CMyWnd::s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CMyWnd *pThis = nullptr;

if (uMsg == WM_NCCREATE)
{
CREATESTRUCT *pCreate = reinterpret_cast<CREATESTRUCT *>(lParam);
pThis = reinterpret_cast<CMyWnd *>(pCreate->lpCreateParams);
pThis->m_hWnd = hwnd;
SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pThis));
}
else
{
pThis = reinterpret_cast<CMyWnd *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
}

if (pThis)
{
return pThis->WndProc(uMsg, wParam, lParam);
}

return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

LRESULT CMyWnd::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(m_hWnd, uMsg, wParam, lParam);
}

void CMyWnd::OnCommand(WPARAM wParam)
{
}

这个框架具有一定的可拓展性,可以用继承该类并添加更多的功能。

赞(0)
未经允许不得转载:171主机测评 » 自己封装一个win32窗口框架
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址