SDK应用程序

程序运行都要有入口函数,在之前的C++教程中都是main函数,而Windows应用程序的入口函数是WinMain函数,MFC程序也是从WinMain函数开始的。

下面就给出用Windows SDK写的"HelloWorld"程序,与应用程序框架进行对比,这样能更好的了解框架是怎样运行的。Windows SDK开发程序就是不使用MFC类库,直接用Windows API函数进行软件开发。

#include <windows.h>    LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);   int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{      const static TCHAR appName[] = TEXT("Hello world");      WNDCLASSEX myWin;      myWin.cbSize = sizeof(myWin);      myWin.style = CS_HREDRAW | CS_VREDRAW;      myWin.lpfnWndProc = myWndProc;      myWin.cbClsExtra = 0;      myWin.cbWndExtra = 0;      myWin.hInstance = hInstance;      myWin.hIcon = 0;      myWin.hIconSm  = 0;      myWin.hCursor = 0;      myWin.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);      myWin.lpszMenuName = 0;      myWin.lpszClassName = appName;      //Register      if (!RegisterClassEx(&myWin)) return 0;      const HWND hWindow = CreateWindow(      appName,      appName,      WS_OVERLAPPEDWINDOW,      CW_USEDEFAULT,      CW_USEDEFAULT,      CW_USEDEFAULT,      CW_USEDEFAULT,      0,      0,      hInstance,      0);      ShowWindow(hWindow,iCmdShow);      UpdateWindow(hWindow);      {      MSG msg;      while(GetMessage(&msg,0,0,0))      {      TranslateMessage(&msg);      DispatchMessage(&msg);      }      return (int)msg.wParam;      }
}      LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{      if (msg==WM_PAINT)      {      PAINTSTRUCT ps;      const HDC hDC = BeginPaint(hWindow,&ps);      RECT rect;      GetClientRect(hWindow,&rect);      DrawText(hDC,TEXT("HELLO WORLD"),-1,&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);      EndPaint(hWindow,&ps);      return 0;      }      else if (msg==WM_DESTROY)      {      PostQuitMessage(0);      return 0;      }      return DefWindowProc(hWindow,msg,wParam,lParam);
}

上面的程序运行的流程是
进入WinMain函数->初始化WNDCLASSEX,调用RegisterClassEx函数注册窗口类->调用ShowWindow和UpdateWindow函数显示并更新窗口->进入消息循环。

关于消息循环再简单说下,Windows应用程序是消息驱动的,系统或用户让应用程序进行某项操作或完成某个任务时会发送消息,进入程序的消息队列,然后消息循环会将消息队列中的消息取出,交予相应的窗口过程处理,此程序的窗口过程函数就是 myWndProc 函数,窗口过程函数处理完消息就完成了某项操作或任务。本例是要显示"HELLO WORLD"字符串,UpdateWindow函数会发送WM_PAINT消息,但是此消息不经过消息队列而是直接送到窗口过程处理,在窗口过程函数中最终绘制了"HELLO WORLD"字符串。

MFC应用程序

首先在 HelloWorld.cpp 中定义全局对象 theApp:CHelloWorldApp theApp;。调用 CWinApp和CHelloWorldApp 的构造函数后,进入 WinMain 函数(位于appmodul.cpp中)。

InitInstance 中的 ProcessShellCommand 函数又调用了CMainFrame 的 LoadFrame 函数注册并创建了窗口,执行完ProcessShellCommand 函数以后,调用了 m_pMainWnd 的ShowWindow和UpdateWindow 函数显示并更新框架窗口。

接下来该是消息循环了,上面的 AfxWinMain 函数中调用了 pThread 的 Run 函数(位于THRDCORE.cpp中),在 Run 中包含了消息循环。

我们看到 PumpMessage 中通过调用 GetMessage、TranslateMessage、DispatchMessage 等建立了消息循环并投递消息。

CHelloWorldApp 类处理消息,将收到的消息分发给相应的对象。CMainFrame 是视图 CHelloWorldView 的父窗口,视图CHelloWorldView 就显示在 CMainFrame 的客户区中。视图类 CHelloWorldView 用来显示文档类 CHelloWorldDoc 中的数据,并根据对视图类的操作修改文档类的数据。一个视图类只能跟一个文档类相联系,而一个文档类可以跟多个视图类相联系。

二者比较

到此,通过对比可以发现,MFC 应用程序的运行流程与 SDK 程序是类似的,都是先进行一些初始化过程,再注册并创建窗口,然后显示、更新窗口,最后进入消息循环,消息都由窗口过程函数处理。

MFC应用程序框架分析相关推荐

  1. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...

  2. (转载)VS2010/MFC编程入门之四(MFC应用程序框架分析)

    上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...

  3. MFC应用程序框架入门

    摘要: 本文主要对VC++ 6.0的MFC编程方法及MFC应用程序框架进行简要介绍. 关键词: VC++6.0:MFC:程序框架 1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的, ...

  4. MFC应用程序框架-文档/视结构

    MFC应用程序框架-文档/视结构 1.MFC单文档应用程序结构 2.文档对象 2.1基类CDocument 2.2在应用程序中使用文档类的典型步骤 3.视的对象 3.1基类CView 3.2常用的CV ...

  5. 【MFC】MFC应用程序框架详解

    00. 目录 文章目录 00. 目录 01. Win32应用程序 02. MFC应用程序 03. MFC应用程序框架总结 04. 附录 01. Win32应用程序 程序运行都要有入口函数,在之前的C+ ...

  6. VC++基于MFC的程序框架剖析(前言)

    目录 基于MFC的程序框架剖析 MFC类组织结构图:层次结构图 接上:VC++MFC应用程序向导 接下:VC++MFC程序中的WinMain函数(一) 基于MFC的程序框架剖析 MFC库是开发Wind ...

  7. 微信小程序框架分析思维导图

    微信小程序框架分析思维导图

  8. 微信小程序框架分析小练手(三)——仿香哈菜谱小程序制作

    香哈菜谱是一款围绕美食而成的小程序,在这里可以查看各式各样的菜谱. 一.打开微信开发者工具,新建一个项目:xhcp.如下图: 二.建立如下的一些目录: 三.将底部标签导航图标.美食轮播图片.宫格导航图 ...

  9. Windows MFC编程入门——应用程序框架

    一.SDK应用程序与MFC应用程序运行过程对比 程序运行都要有入口函数,在C/C++程序中都是main函数,而windows应用程序的入口函数是WinMain或wWinMain.MFC程序也是从这个入 ...

最新文章

  1. 新内容转入github
  2. 8.0 C++远征:对象数组
  3. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列
  4. SIMD via C#
  5. linux 64位内存划分,linux 64位内存空间大小?(linux 64 bits memory space size? [closed])
  6. Ant Design Pro在使用TreeSelect树选择组件时,报错未注册
  7. php object 对象不存在。增加对象_PHP开发自己的框架,这些知识点不能错过
  8. 2016年北京大学信息学奥赛训练营上机考核第四场【pkusc真题模拟总结】
  9. 第一次使用博客及Coursera课程体验
  10. access 数据库和mysql_access数据库和sql数据库你必须知道的区别
  11. java web 课程设计_javaweb期末课程设计
  12. 16年后,再次新注册个csdn账号
  13. 如何进入oppo云服务器,OPPO云服务(查找手机)
  14. 唐奇安通道策略-python量化【backtrader回测】
  15. ps4正在连接ea服务器,ps4极品飞车19连不上ea服务器 | 手游网游页游攻略大全
  16. 银行手机APP软件做性能测试吗,浅谈银行开放平台应用系统性能测试
  17. 喜羊羊与灰太狼java_喜羊羊与灰太狼之懒洋洋风波
  18. 云栖大会不能错过的一个专场——阿里大数据
  19. 表单上下间隔怎么设置php,html中怎么设置每行文字的间隔
  20. matlab三点求法向量,matlab求法向量

热门文章

  1. Redis-数据结构02-简单动态字符串(sds)
  2. 实现拍照_实现“拍照自由”!vivo IFEA分离式镜头打破思维定势
  3. 1.9_heap_topK_topK问题
  4. 逻辑回归模型_逻辑回归模型
  5. ride中for循环的使用_robotframework-ride使用(Builtin标准库)
  6. 国产441b电子计算机,国产441B晶体管计算机文档(讲义)
  7. python程序如何执行死刑_「Python基础知识」Python生成器函数
  8. 201612-2 工资计算
  9. ARM学习篇 中断定时理解
  10. GCD三部曲之一---辗转相除法