关闭

【VC编程】笔记2--SDK编程的模板程序/MFC消息映射机制的本质解析

325人阅读 评论(0) 收藏 举报
分类:
/*****************************************************************************************************
*文件说明:
*        资源头文件---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--消息处理函数的实现
*开发环境:
*        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}};
/******************************************************************************************************
*模块说明:
*         消息处理函数原型
******************************************************************************************************/
/******************************************************************************************************
*模块说明:
*         消息映射表宏定义
******************************************************************************************************/
BEGIN_MESSAGE_MAP()
//	//ON_MSG....
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:消息循环
******************************************************************************************************/
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;
}
/******************************************************************************************************
*函数说明:
*         窗口过程函数
*函数参数:
*         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_PAINT)
	{
		PAINTSTRUCT ps;
		const HDC hDC = BeginPaint(hwnd,&ps);
		RECT  rect;
		GetClientRect(hwnd,&rect);
		DrawText(hDC,TEXT("Windows编程"),-1,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
		EndPaint(hwnd,&ps);
		EndPaint(hwnd,&ps);
		return 0;
	}
	else if(uMsg==WM_DESTROY)
	{
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

MFC对话框编程详细学习笔记

因最近研究工作要用到MFC,故再次重温了孙鑫老师的MFC对话框编程,因所用的编译软件为VS2008,与视频中孙老师使用的VC++6.0有很大出入,造成很大不便,我通过各方查找,实现了VS2008相对应于VC++6.0的方法。现将对话框编程整个视频的详细内容分享如下,希望对有缘看到的朋友提供方便。笔者...
  • Bright_Geek
  • Bright_Geek
  • 2014-10-25 20:29
  • 2770

MFC 串口编程详细教程 图文并茂

本人之前从未接触MFC编程,由于项目需要,所以上网查阅了相关资料,并实现了上位机串口通信。由于网上的资料还不够详细,本人决定写一个图文并茂的详细教程。因为本人只是初学,如有错误,欢迎指点。 开发环境是:VC 6.0 串口编程方法:32位控件 第一步:建工程 运行VC 6.0,文件-〉新建,选择M...
  • a_runing_man
  • a_runing_man
  • 2013-08-14 21:32
  • 74754

VC++(MFC)多线程编程

二、线程间通信   一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。 使用全局变量进行通信 由于属于同一个进...
  • chenscmail
  • chenscmail
  • 2013-08-17 17:50
  • 11584

Windows串口通信VC++编程实例

1、windows串口操作API介绍:
  • wu_tongyu
  • wu_tongyu
  • 2014-08-04 10:26
  • 1613

20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)

1、新建MFC对话框工程如下 2、给编辑框控件添加变量,其中Edit Box添加Value变量,Button添加Control变量,ID和变量分别为: IDC_EDIT_RXDATA() IDC_EDIT_TXDATA() IDC_BTNOPEN() IDC_BTNSEND() CString ...
  • KevinHuang2088
  • KevinHuang2088
  • 2016-04-26 15:33
  • 6121

二. MFC框架程序分析--Windows编程课程学习笔记

二. MFC框架程序分析--Windows编程课程学习笔记
  • ling_xiao007
  • ling_xiao007
  • 2016-06-20 15:07
  • 805

<MFC笔记>多线程编程简单实例

在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面就此简单的讲一下: 创建线程的函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T dwStackSize...
  • EbowTang
  • EbowTang
  • 2014-06-10 20:51
  • 1544

VS2013/MFC编程入门之四(MFC消息映射机制概述)

上一讲为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容。        前面已经说过,Windows应用程序是消息驱动的。在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2016-11-23 11:00
  • 1834

VC_MFC串口通信编程详解

在工业控制中,工控机(一般都基于 Windows 平台)经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛.   一般情况下,工控机和各智能仪表通过 RS485 总线进行通信.RS485 的通信方式是 半双工的,只能由作为主节点的工控 PC 机依次轮询网络上的...
  • beikefengling123
  • beikefengling123
  • 2014-04-18 11:40
  • 1976

VC程序的安装与部署安装项目版-一个简单例子

小小成就感记录之:VC程序打包   2010-11-22 17:53:56|  分类: 学习 |  标签: |字号大中小 订阅        ...
  • gexiaochuan122
  • gexiaochuan122
  • 2013-12-01 02:04
  • 1876
    个人资料
    • 访问:391975次
    • 积分:5913
    • 等级:
    • 排名:第5060名
    • 原创:195篇
    • 转载:154篇
    • 译文:3篇
    • 评论:57条
    最新评论