Windows MFC编程入门——应用程序框架
一、SDK应用程序与MFC应用程序运行过程对比
程序运行都要有入口函数,在C/C++程序中都是main函数,而windows应用程序的入口函数是WinMain或wWinMain。MFC程序也是从这个入口开始的。Windows SDK开发程序就是不使用MFC类库,直接用Windows API函数进行开发。
下面就是SDK应用程序示例:
#ifndef UNICODE
#define UNICODE
#endif #include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{// Register the window class.const wchar_t CLASS_NAME[] = L"Sample Window Class";WNDCLASS wc = { };wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;RegisterClass(&wc);// Create the window.HWND hwnd = CreateWindowEx(0, // Optional window styles.CLASS_NAME, // Window classL"Learn to Program Windows", // Window textWS_OVERLAPPEDWINDOW, // Window style// Size and positionCW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, // Parent window NULL, // MenuhInstance, // Instance handleNULL // Additional application data);if (hwnd == NULL){return 0;}ShowWindow(hwnd, nCmdShow);// Run the message loop.MSG msg = { };while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_DESTROY:PostQuitMessage(0);return 0;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));EndPaint(hwnd, &ps);}return 0;}return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
上面的程序运行的流程是:进入WinMain函数->初始化WNDCLASS,调用RegisterClass函数注册窗口类->调用CreateWindowEx函数->调用ShowWindow显示窗口->进入消息循环。关于消息循环再简单说下,Windows应用程序是消息驱动的,系统或用户让应用程序进行某项操作或完成某个任务时会发送消息,进入程序的消息队列,然后消息循环会将消息队列中的消息取出,交予相应的窗口过程处理,此程序的窗口过程函数就是myWndProc函数,窗口过程函数处理完消息就完成了某项操作或任务。
- 设计窗口
- 注册窗口
- 创建窗口
- 显示和更新
- 通过循环取消息
- 处理消息(窗口过程)
WINAPI在我环境下被定义为__stdcall ,即参数的传递顺序:参数列表从右到左依次入栈,并在函数返回前清空堆栈
MFC应用程序:编写MFC程序需要包含#include<afxwin.h>头文件
自己创建MFC应用程序框架:自定义类继承自CWinApp应用程序类,创建MyApp app应用程序对象(有且只有一个)。程序入口为InitInstance()函数。在程序入口函数中创建自定义框架类(MyFrame继承自CFrameWnd)。在MyFrame类构造函数中创建窗口Create。显示更新窗口并保存框架类对象指针。
使用应用程序向导生成单文档应用程序框架:
消息映射是一个将消息和成员函数相互关联的表。比如,框架窗口接收到一个鼠标左击消息,MFC将搜索该窗口的消息映射,如果存在一个处理WM_LBUTTONDOWN消息的处理程序,然后就调用OnLButtonDown。
将消息映射添加到一个类中所做的全部工作:
1)在所操作类中,声明消息映射宏
2)通过放置标识消息的宏来执行消息映射,相应的类将在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息。
3)对应消息处理函数分别在类中声明,类外定义
Windows MFC编程入门——应用程序框架相关推荐
- VS2010/MFC编程入门之四(MFC应用程序框架分析)
上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...
- (转载)VS2010/MFC编程入门之四(MFC应用程序框架分析)
上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...
- (转载)VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)...
上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...
- VS2010/MFC编程入门之一(Ribbon界面开发:创建Ribbon样式的应用程序框架)
Ribbon界面就是微软从Office2007开始引入的一种为了使应用程序的功能更加易于发现和使用.减少了点击鼠标的次数的新型界面,从实际效果来看,不仅外观漂亮,而且功能直观,用户操作简洁方便. 鸡啄 ...
- vs2010c语言窗口程序,VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)...
上一节中鸡啄米讲了文档.视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口. 分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型 ...
- VS2019/MFC编程入门——文档、视图和框架:分割窗口
上一节中讲了文档.视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口.在内容开始前为大家介绍一款MFC界面开发控件: Xtreme Toolkit Pro | 免费下载:是屡获殊荣的 ...
- VS2010/MFC编程入门
近来鼓捣2D小游戏的过程中发现鸡啄米大神很好的MFC系列资料,在此汗颜将地址扒拉了过来,留待以后慢慢学习. VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解) (http://ww ...
- VS2019/MFC编程入门之对话框:向导对话框的创建及显示
上一讲讲了属性页对话框和相关的两个类CPropertyPage类和CPropertySheet类,对使用属性页对话框做准备.本节将为大家演示如何创建向导对话框. 仍然以前面的"加法计算器&q ...
- (转载)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...
最新文章
- python多版本共存使用pip
- Windows全能终端神器MobaXterm
- 玻璃质感_他的玻璃质感让人佩服的五体投地
- SAP 与 JSON 接口实施案例一
- VTK:帧率用法实战
- 将一个项目中已有的文档添加到另一个项目中的方法
- Leet Code OJ 27. Remove Element [Difficulty: Easy]
- 【转】vue项目打包上传的步骤和方法
- chrome同步_如何在Chrome中打开或关闭同步
- 一步步分析-C语言如何面向对象编程
- Spark之SparkSQL数据源
- 路由器配置vlan桥接
- Git diffmerge 工具的配置及问题解决
- 就国内而言,读大学的意义是什么?
- 卡通头像生成器Avataaars generator
- Linux aarch64交叉编译之 weston窗口管理程序
- vue 存取、设置、清除cookie
- ThinkPHP框架安装介绍
- int在c语言中能输出负数么,为什么使用模数时C ++输出负数?
- win10兼容哪些版本的mysql_win10兼容SQL哪个版本?