今天想看看Direct10的,却发现自己连最基本的Windows程序都忘了是怎样的..于是照着书码了一遍代码,顺便贴到博客上来,提醒自己..
下面是一个简单的Windows应用程序。
#include <windows.h> HWND myWinWnd = 0; bool iniWinApp(HINSTANCE instanceHandle,int nshow); int run(); LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); /*第一个参数为该程序的实例句柄,一个程序可以有多个实例,就是我们常说的“多开”,用于操作系统对实例程序的识别..第二个参数是十六位操作系统遗留的问题 可以不用理。第三个参数是程序启动时传入命令行参数的字符串,第四个参数指定窗口的现实方式比如默认SW_SHOW,最大化SW_SHOWMAXIMIZED,最小化*/ int WINAPI WinMain(HINSTANCE instanceHandle,HINSTANCE prehinstance,PSTR pCmdLine,int nShowCmd) { /*iniwinApp函数完成初始化及创建窗口的过程,传入程序的实例句柄,及窗口的显示方式*/ if(!iniWinApp(instanceHandle,nShowCmd)) { MessageBox(0,L"iniWinApp fail",0,MB_OK); return 0;//error } return run(); } bool iniWinApp(HINSTANCE instanceHandle,int nShow) { ////////////////////////////////////////////////////////////////////////// ///填充WNDCLASS信息 WNDCLASS wc;//调查下具体成员 //CS_VREDRAW 当窗口水平方向的宽度变化时重绘整个窗口 //CS_HREDRAW 当窗口水平方向的宽度变化时重绘整个窗口 wc.style = CS_HREDRAW | CS_VREDRAW; //该窗口类所使用的消息回调函数,一个回调函数可以给不同的窗口类使用,不同的窗口类也可以使用一个回调函数 wc.lpfnWndProc = WndProc; //表示窗口类结构和实例话之后,额外分配的字符。一般设为0 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = instanceHandle; //图标与鼠标 wc.hIcon = LoadIcon(0,IDI_APPLICATION); wc.hCursor = LoadCursor(0,IDC_ARROW); //用于指定窗口客户区背景色 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //用于指定窗口菜单,这里设为0表示没菜单 wc.lpszMenuName = 0; //该窗口类的名字 wc.lpszClassName = L"diyige"; ////////////////////////////////////////////////////////////////////////// ///注册wc if(!RegisterClass(&wc)) { MessageBox(0,L"registerClass fail",0,MB_OK); return false;//error } ////////////////////////////////////////////////////////////////////////// ///creat 和显示 windows //creatwindow函数调用成功后将返回对应一个创建好的窗口的窗口句柄,创建失败返回0(窗口句柄就像是窗口的标识符一样。) myWinWnd = CreateWindow( L"diyige",//已经注册好的窗口类的名字 L"第一个",//窗口标题 WS_OVERLAPPEDWINDOW,//窗口式样,这个是比较经典的 CW_USEDEFAULT,//窗口左上角X的坐标,CW_USEDEFAULT表示由系统自己决定 CW_USEDEFAULT,//y CW_USEDEFAULT,//窗口宽度(单是像素) CW_USEDEFAULT,//窗口高度 0,//当前窗口父窗口的句柄,因为没有所以填0 0,//菜单的句柄,因为这个窗口没菜单所以是0 instanceHandle,//与窗口关联的应用程序实例句柄 0); if(myWinWnd == 0) { MessageBox(0,L"creatwindow fail",0,0); return false; } ShowWindow(myWinWnd,nShow); UpdateWindow(myWinWnd); return true; } int run() { //msg 是用于表示Windows消息的结构体 /*Windows消息内容有:接收消息的窗口的句柄,特定消息的预定义常量值(如WM_QUIT),与该消息一起的附加信息,消息被加入消息队列的时间 消息被送入消息队列时鼠标在屏幕的位置。更多相见MSG结构体的定义*/ MSG msg = {0}; bool bRet = 1; while((bRet = GetMessage(&msg,0,0,0)) != 0) { if(bRet == -1) { MessageBox(0,L"GetMessage fail",0,MB_OK); break; } else { TranslateMessage(&msg);//用于键盘信息的转换,虚拟键盘码转化为字符信息 DispatchMessage(&msg);//将消息传送给特定的消息处理函数 } } return (int)msg.wParam; } //消息回调函数,由操作系统调用 LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: MessageBox(0,L"WM_LBUTTONDOWN clicked",0,MB_OK); return 0; case WM_KEYDOWN: if(wParam == VK_ESCAPE) DestroyWindow(hwnd); else MessageBox(0,L"a key has been pressed",0,MB_OK); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,msg,wParam,lParam); }
下面是程序的修改版,改动的是消息循环中Getmessage换成Peekmessage,Peekmessage比较实用与Direct这种经常更新响应的程序。详细的区别一搜索就可以找到很多的。新的run函数如下
int run() { //msg 是用于表示Windows消息的结构体 /*Windows消息内容有:接收消息的窗口的句柄,特定消息的预定义常量值(如WM_QUIT),与该消息一起的附加信息,消息被加入消息队列的时间 消息被送入消息队列时鼠标在屏幕的位置。更多相见MSG结构体的定义*/ MSG msg = {0}; while(msg.message != WM_QUIT) { if(PeekMessage(&msg,0,0,0,PM_REMOVE)) { TranslateMessage(&msg);//用于键盘信息的转换,虚拟键盘码转化为字符信息 DispatchMessage(&msg);//将消息传送给特定的消息处理函数 } else { //do something } } return (int)msg.wParam; }