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

来源:互联网 发布:传奇霸业翅膀升级数据 编辑:程序博客网 时间:2024/05/01 16:20

为了在之后的编程更加方便,所以现在将win32的基本框架封装一个类。


myWindow.h:

#pragma once#include <Windows.h>static bool isPushEsc = false;//是否按下Escclass 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;}


0 0