为了在之后的编程更加方便,所以现在将win32的基本框架封装一个类。
myWindow.h:
#pragma once
#include <Windows.h>
static bool isPushEsc = false;//是否按下Esc
class myWindow
{
public:
myWindow(void);
~myWindow(void);
public:
HWND GetHandle();//返回窗口句柄
bool Create(int &width,int &height);//创建窗口
void Run();//处理消息循环
LRESULT CALLBACK MessageHandler(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);//消息处理
private:
LPCWSTR w_name;//窗口类的名字
HINSTANCE w_instance;//应用程序的实例句柄
HWND w_hwnd;//窗口句柄
};
myWindow.cpp:
因为定义窗口的时候必须指定一个回调函数,所以我们定义一个静态的WndProc,因为在WndProc中需要调用其他消息的处理函数MessageHandler,所以我们又定义一个类的实例句柄applicationHandle。
#include "myWindow.h"
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//静态回调函数
static myWindow *applicationHandle;//类的一个静态实例
myWindow::myWindow(void)
{
isPushEsc = false;
w_hwnd = NULL;
w_name = L"Hello World";
}
myWindow::~myWindow(void)
{
}
HWND myWindow::GetHandle()
{
return w_hwnd;
}
bool myWindow::Create(int &width,int &heigh)
{
w_instance = GetModuleHandle(NULL);//得到程序实例句柄
applicationHandle = this;
w_name = L"Hello world";
WNDCLASSEX wnd;//定义一个窗口类
wnd.cbSize = sizeof(WNDCLASSEX);//窗口大小
wnd.cbClsExtra = 0;//附加字节,一般为0
wnd.cbWndExtra = 0;//附加字节,一般为0
wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//窗口画刷颜色
wnd.hCursor = LoadCursor(NULL,IDC_ARROW);//窗口中光标的风格
wnd.hIcon = LoadIcon(NULL,IDI_WINLOGO);//窗口图标,可以在资源视图中改
wnd.hIconSm = wnd.hIcon;//窗口小图标
wnd.hInstance = w_instance;//实例句柄
wnd.lpfnWndProc = WndProc;//窗口过程函数,下面有定义
wnd.lpszClassName = w_name;//窗口类名称
wnd.lpszMenuName = w_name;//菜单资源名称,可以在资源视图中改
wnd.style = CS_HREDRAW | CS_VREDRAW;//窗口风格,用|符号能够同时选中,具体类型看下面的图
//注册窗口类
if(!RegisterClassEx(&wnd))
{
MessageBox(NULL,L"注册窗口失败!",L"Hello world",0);
return 0;
}
//创建窗口
w_hwnd = CreateWindowEx(WS_EX_APPWINDOW,w_name,w_name,WS_OVERLAPPEDWINDOW,300,200,
800,600,NULL,NULL,w_instance,NULL);
//显示窗口创建为焦点
ShowWindow(w_hwnd,SW_SHOW);
SetForegroundWindow(w_hwnd);
SetFocus(w_hwnd);
//隐藏鼠标
SetCursor(false);
return true;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return applicationHandle->MessageHandler(hwnd,msg,wParam,lParam);
}
}
LRESULT CALLBACK myWindow::MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch(message)
{
case WM_KEYDOWN:
if(wparam == VK_ESCAPE)
isPushEsc = true;
return 0;
default:
return DefWindowProc(hwnd,message,wparam,lparam);
}
}
void myWindow::Run()
{
MSG msg;
//初始化消息函数
ZeroMemory(&msg,sizeof(MSG));
bool isRuning = true;
while(isRuning)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//发送消息给窗口过程
}
if(msg.message == WM_QUIT){
isRuning == false;
}
else {
isRuning = !isPushEsc;
//Do someting
}
}
}
main.cpp:
#pragma once
#include "myWindow.h"
myWindow* window;
int WINAPI WinMain(
HINSTANCE hInstance,//当前运行的实例句柄
HINSTANCE hPrevInstance,//当前运行的实例句柄的前一个句柄
LPSTR lpCmdLine,//一个以空终止的字符串,指定传递给应用程序的命令行参数。
int nCmdshow//指定程序的窗口应该如何显示
)
{
int width = 800,height = 600;
window = new myWindow;
if(window->Create(width,height))
{
window->Run();
}
return 0;
}