【VC编程】笔记3---使用Win32SDK编程,模仿MFC的消息映射处理机制
2017-01-03 10:47
651 查看
/***************************************************************************************************** *文件说明: * 资源头文件---resource.h *开发环境: * Win10+VS2012 *时间地点: * 陕西师范大学 2017.1.2 *作 者: * 九月 ******************************************************************************************************/ #define IDI_APP 100 //[1]主窗口图标资源标识符 #define IDI_APPSMALL 101 //[2]主窗口小图标资源标识符 #define IDR_APP 102 //[3]主窗口菜单快捷键资源标识符 #define IDS_APP_TITLE 1000 //[4]应用程序标题资源标识符 #define IDM_FILE_NEW 1101 #define IDM_FILE_OPEN 1102 #define IDM_EXIT 1103 #define IDM_ABOUT 1104 #define IDM_SEPTEMBER 1105
/***************************************************************************************************** *文件说明: * 资源描述文件---resource.rc *开发环境: * Win10+VS2012 *时间地点: * 陕西师范大学 2017.1.2 *作 者: * 九月 ******************************************************************************************************/ #include "resource.h" #include <Windows.h> IDD_APP ICON DISCARDABLE "res\\app.ico" //[1]主窗口图标资源 IDD_APPSMALL ICON DISCARDABLE "res\\appsmall.ico" //[2]主窗口小图标资源 IDR_APP MENU DISCARDABLE //[3]主窗口菜单资源 BEGIN POPUP "文件(&F)" BEGIN MENUITEM "新建(&N)\tCtrl+N", IDM_FILE_NEW MENUITEM "打开(&O)..\tCtrl_O" IDM_FILE_OPEN MENUITEM "退出(&X)" IDM_EXIT END POPUP "帮助(&H)" BEGIN MENUITEM "软件简介(&A)" IDM_ABOUT END POPUP "九月软件" BEGIN MENUITEM "九月软件简介" IDM_SEPTEMBER END END IDR_APP ACCELERATORS MOVEABLE PURE //[0]主窗口快捷键资源 BEGIN "N",IDM_FILE_NEW "O",IDM_FILE_OPEN, VIRTKEY,ALT "X",IDM_EXIT, VIRTKEY,ALT VK_F1,IDM_ABOUT, VIRTKEY END STRINGTABLE DISCARDABLE //[1]字符串资源 BEGIN IDS_APP_TITLE "MainWindow" //[2]应用程序标题资源 END
/***************************************************************************************************** *文件说明: * 1--Win32_SDK编程---主程序 * 2--这是一个标准的Windows窗口程序,它有窗口,图标,菜单,资源,窗口过程,消息处理等元素,是SDK编程的程序 * 模板,成为基于窗口的Windows应用程序的编程框架 *变成框架: * 这个变成框架是进行SDK编程的基础结构,其项目文件有: * 1--程序文件(一般与项目同名) * 2--资源头文件-------resource.h * 3--资源描述文件-----resource.rc * 4--存放在res子文件下的资源数据文件 *windows编程框架模块: * 1--头文件:包含所有头文件或者链接库文件 * 2--全局定义:应用实例,主窗口变量,数据结构等全局定义,固定不变 * 3--消息处理函数原型 * 4--消息映射表宏定义 * 5--注册窗口类函数 * 6--初始化窗口 * 7--消息循环 * 8--主函数 * 9--消息处理函数的实现 *文件说明: * 增加WM_COMMAND菜单消息处理函数 *开发环境: * Win10+VS2012 *时间地点: * 陕西师范大学 2017.1.2 *作 者: * 九月 ******************************************************************************************************/ #include<Windows.h> #include<stdio.h> #include<iostream> #include"resource.h" #include<tchar.h> /****************************************************************************************************** *模块说明: * 全局变量定义 ******************************************************************************************************/ HINSTANCE hInst; //[1]应用程序句柄实例 HWND hMainWnd; //[2]主窗口句柄 char szWindowTitle[] = "MainWindow"; //[3]主窗口标题 char szWindowClass[] = "SDKWIN32APP"; //[4]主窗口类名 /****************************************************************************************************** *模块说明: * 消息映射表结构 ******************************************************************************************************/ struct WIN_MSGMAP_ENTRY { UINT nMessage; //[1]消息码 LRESULT (*pfn)(HWND hwnd,UINT message,WPARAM wPatam,LPARAM lParam); //[2]窗口过程函数 }; #define BEGIN_MESSAGE_MAP() const struct WIN_MSGMAP_ENTRY _messageEntries[]={ #define ON_MSG(nMessage,pfn) {nMessage,pfn}, #define END_MESSAGE_MAP() {0,NULL}}; /****************************************************************************************************** *模块说明: * 消息处理函数原型 ******************************************************************************************************/ LRESULT OnCommand(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); //[1]菜单命令响应函数 /****************************************************************************************************** *模块说明: * 消息映射表宏定义 ******************************************************************************************************/ BEGIN_MESSAGE_MAP() ON_MSG(WM_COMMAND,OnCommand) //[1]命令消息映射 END_MESSAGE_MAP() /****************************************************************************************************** *模块说明: * 函数原型声明 ******************************************************************************************************/ ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE hInstance,int nCmdShow); int Run(); LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); /****************************************************************************************************** *函数说明: * 1---WinMain是Windows程序的入口函数,与DOS程序中的Main函数的作用是一样的 * 2---WinMian主函数的作用是: * 1--创建应用程序窗口 * 2--建立消息循环 *函数参数: * 1---HINSTANCE hInstance------指针变量,当前应用程序的实例句柄 * 2---HINSTANCE hPrevInstace---指向当前应用程序前的一个实例句柄 * 3---LPSTR lpCmdLine------指向本程序命令行字符串的指针 * 4---int nCmdShow-------本程序窗口显示方式的标志 ******************************************************************************************************/ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { MyRegisterClass(hInstance); //【1】注册窗口类 if(!InitInstance(hInstance,nCmdShow)) //【2】初始化窗口失败,退出程序 return 0; return Run(); //【3】进入消息循环 } /****************************************************************************************************** *函数说明: * 模块1:注册窗口类---函数 *函数参数: * HINSTANCE hInstance------指针变量,当前应用程序的句柄实例 ******************************************************************************************************/ ATOM MyRegisterClass(HINSTANCE hInstance) { //【1】设计窗口 WNDCLASS wndCls; wndCls.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; //[2]窗口样式 wndCls.lpfnWndProc = (WNDPROC)WndProc; //[3]指向窗口过程函数的函数指针 wndCls.cbClsExtra = 0; wndCls.cbWndExtra = 0; wndCls.hInstance = hInstance; //[4]应用程序实例句柄 wndCls.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_APP); //[5]主窗口图标 wndCls.hCursor = LoadCursor(NULL,IDC_ARROW); //[6]主窗口光标 wndCls.hbrBackground= (HBRUSH)GetStockObject(GRAY_BRUSH); //[7]主窗口背景颜色 wndCls.lpszMenuName = (LPCWSTR)IDR_APP; //[8]主窗口菜单 wndCls.lpszClassName= _T("MyWindow"); //[9]主窗口类名 wndCls.hIcon = LoadIcon(hInstance,(LPCWSTR)IDI_APPSMALL); //[10]小图标 //【2】注册窗口 return RegisterClass(&wndCls); } /****************************************************************************************************** *函数说明: * 模块2:初始化窗口 *函数参数: * HINSTANCE hInstance------指针变量,当前应用程序的句柄实例 ******************************************************************************************************/ BOOL InitInstance(HINSTANCE hInstance,int nCmdShow) { DWORD ds = WS_OVERLAPPEDWINDOW; hInst = hInstance; //[1]保存应用程序的实例 //[2]创建主窗口 hMainWnd = CreateWindow(_T("MyWindow"),_T("Win32示例"),ds,0,0,600,400,NULL,NULL,hInstance,NULL); if(!hMainWnd) return FALSE; ShowWindow(hMainWnd,nCmdShow); //[3]显示主窗口 UpdateWindow(hMainWnd); //[4]更新主窗口 return TRUE; } /********************************************************************************************************** *函数说明: * 模块3:消息循环 *模块功能说明: * 1---在设计窗口,注册窗口,创建窗口,显示窗口,更新窗口等操作完成之后,我们需要一个消息循环,不断的从应用 * 程序的消息队列中取出消息,并进行响应。 * 2---要从消息队列中取出消息,我们需要调用GetMessage()函数 *GetMessage()的函数原型如下所示: * GetMessage(KPMSG lpMsg,HWND hwnd,UINT wMsgFilterMin,UINT wMsgFilterMax) *函数参数说明: * 1--KPMSG lpMsg--指向一个消息MSG的结构体,GetMessage从线程的消息队列中取出的消息信息将保存在 * 该结构体对象中 * 2--HWND hwnd----用于指定接收属于哪一个窗口的消息 * 3--UINT wMsgFilterMin----指定要获取消息的最小值 * 4--UINT wMsgFilterMax----指定要获取消息的最大值 * 5--GetMessage()函数结构到除了WM_QUIT外的消息均返回非零值。对于WM_QUIT消息,该函数返回0;如果出现错误 * 该函数返回-1 ************************************************************************************************************/ int Run() { MSG msg; HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInst,(LPCTSTR)IDR_APP); //[1]加载快捷键资源 while (GetMessage(&msg,NULL,0,0)) { //将快捷键转换为相应的菜单命令 if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)) { TranslateMessage(&msg); //[2]将键盘事件转换成字符消息 DispatchMessage(&msg); //[3]分发消息到窗口的消息处理函数中去执行 } } return msg.wParam; } /****************************************************************************************************** *函数说明: * 模块4:窗口过程函数 *函数参数: * 1---HWND hwnd------发送消息的窗口句柄 * 2---UINT uMsg------系统传递过来的消息识别码 * 3---WPARAM wParam--消息附加参数1 * 4---LPARAM lParam--消息附加参数2 ******************************************************************************************************/ LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { if(uMsg==WM_DESTROY) { if(uMsg=WM_DESTROY) { PostQuitMessage(0); return 0; } } else { WORD i; //[1]WORD---unsigned short int for(i=0;_messageEntries[i].nMessage;i++) //[2]nMessage为0,结束循环 { //如果消息映射表中有消息,则调用对应的消息处理函数 if(uMsg==_messageEntries[i].nMessage) { if(uMsg!=WM_DESTROY) //[3]如果是非WM_DESTROY消息,处理后立即返回 return (*_messageEntries[i].pfn)(hwnd,uMsg,wParam,lParam); //[4]如果是WM_DESTROY消息,处理但不返回,继续WM_DESTROY的后处理 (*_messageEntries[i].pfn)(hwnd,uMsg,wParam,lParam); break; } } } return DefWindowProc(hwnd,uMsg,wParam,lParam); } /****************************************************************************************************** *函数说明: * 消息响应函数 ******************************************************************************************************/ LRESULT OnCommand(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { MessageBox(hwnd,_T("始被点击"),_T("消息框"),MB_OK); return TRUE; }
相关文章推荐
- 【VC编程】笔记2--SDK编程的模板程序/MFC消息映射机制的本质解析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析(修订版)
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- mfc学习笔记之如何修改mfc消息机制处理顺序
- 孙鑫MFC笔记MFC消息映射机制的剖析
- windows编程,vc,mfc消息处理
- 孙鑫VC视频教程笔记之第四课“MFC消息映射机制和CDC类”
- C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
- VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- MFC消息映射和处理机制整理
- windows编程(消息机制、消息队列、消息映射、线程同步)笔记windows编程(消息机制、消息队列、消息映射、线程同步)笔记
- 使用VC进行SDK编程时使用宏映射按钮消息
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫MFC笔记教程(4)--MFC消息映射机制的剖析
- VS2010/MFC编程入门之三(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
- MFC的消息处理机制由两部分组成:CCmdTarget类和消息映射表。