Directx学习笔记【二】 将win32基本框架封装成类

为了在之后的编程更加方便,所以现在将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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值