现在的位置: 首页 > 综合 > 正文

mfc 学走路了

2013年12月09日 ⁄ 综合 ⁄ 共 4515字 ⁄ 字号 评论关闭

     

       win32程序开发流程

         window程序分为程序代码和ui 资源   2部分最后以rc编译器整合为一个完整的exe档案。

         ui资源是指功能菜单、对话框外貌、程序图标、光标形状等等东西。ui的实际内容是借助各种工具产生的,以各种扩展名的文件存在的。如.ico、.bmp等

         程序员必须在一个所谓的资源描述文档.rc中描述他们。rc编译器rc。exe读取rc文件的描述后将所有的ui资源文件集中制作出一个.res文件,再与程序代码结合在一起,这才是一个完整的windows可执行文件。

 

1、window支持动态链接,应用程序调用的windows api函数是在执行期间才链接上的
windows 程序调用的函数分为 cruntimes 以及windows api 两大部分。早期c runtimes并不支持动态链接,但是visual c++ 4.0以后支持了,在
32位操作系统上已经没有small\medium\large等内存模式之分。
   LIBC.LIB  cruntimes 函数的静态链接版本。
   MSVCRT.lIB C Runtimes 函数库动态链接版本的import函数库。若链接这一函数库,程序必须执行时必须有MSVCRT40.DLL在场。

  windows api 由操作系统本身(主要是windows 三大模块 GDI32.dll,USER32.dll,KERNEL32.dll)提供。

  需要什么头文件.h
   所有windows 程序都需要载入windows.h ,不过该头文件只照顾三大模块所提供的api函数。
2、以消息为基础,以事件驱动

    windows程序的进行系依靠外部发生的事件来驱动。程序不断的等待,等待任何可能的输入,然后做出适当的处理。输入是由操作系统捕捉
到之后,以消息形式(一种数据结构)进入程序之中。   USER模块掌管着各个外围程序,他们各有侦测循环。

3、makefile,就是设定某个文件和某个文件相比较--比较其产生的日期。由其比较结构来决定要不要你指定的某些操作。
4、程序进入点  
   main 函数一般是c程序进入点
   winmain则是windows  程序的进入点
   windows 的外壳 shell
5、窗口类之注册与窗口诞生
 
   窗口产生 由api函数 CreateWindow完全包办了这个工程。诞生属性必须先设定好。所谓属性包括窗口的外貌和行为,一个窗口的边框、颜色、标题、位置
等等就睡其外貌,而窗口接收消息后的反应就是其行为(具体指窗口函数本身)。在产生窗口之前先利用函数RegisterClass设定属性。注册窗口类。

 wc_lpfnWndProc所指定的函数就睡窗口的行为中枢,也就是窗口函数。 CreateWindow只产生窗口,
并不显示窗口,所以稍后外貌必须再利用ShowWindow将它显示在屏幕上。外貌希望传送一个WM_Paint给窗口,以驱动窗口的绘图操作,所以调用UpdateWindow。

 

6、由于win32程序的每一个实例(istance)有自己的地址空,故共享同一窗口已不可能。但是由于win32系统令hPrevInstance永远0,所以
我们仍然得以把ReigisterClass 和CreateWindow按旧习惯安排。这样既符合了新环境的需求,又兼顾了与旧程序代码的兼容。
7、消息循环

 初始化工作完成后,winmain进入所谓的消息循环:

while(GetMessage(&msg,...)){
   TranslateMessage(&msg);//软换键盘消息
  DispatchMessage(&msg);//分派消息
}

8、窗口的生命中枢:窗口函数
  消息循环中的DispatchMessage把消息分配按到哪里,它通过USer模块协助送到改窗口的窗口函数去了。窗口函数通常利用switch/case方式判断消息的类型,以决定何种方式进行处理。
由于它是被window系统所调用的,我们没有在应用程序中使用该函数,所以这是一种callback 函数,意思是指在你的程序中,被window调用的函数。这些函数虽然被你设计,但是永远
不会被你调用,他们是为了window系统设计的。

  在程序进行中,消息由输入装置,经由消息循环的抓取,源源传送给窗口并进而送到窗口函数中去。窗口函数体积可能很庞大,也可能很精简。

9、消息映射 (Message Map)     p_25
   使用消息映射后,winProc和OnCommand永远不必改变,每当有新的要处理的信息的时候,只要在—
_messageEntries[] 和_commandEntries[]两个数组加上新元素,并针对新消息撰写新的处理即可。

10、对话框的运行

   windows的对话框依其与父窗口的关系,分2类:
  1、令父窗口无效,直到对话框结束,modal对话框。
  2、父窗口与对话框同时运行,这种称modeless对话框。
  
  为了做出一个对话框,必须准备2样东西:
 1、对话框模板(Dialog template)
 2、对话框函数(dialog procedure ) 其形态非常类似与窗口函数,但只处理WM_INITDIALOG
和WM_COMMAND两个消息。
  modal对话框的激活与结束,靠的是DialogBox和EndDialog两个api函数。

11、模块定义文件 (.def)
  windows程序需要一个模块定义文件,将模块所有的信息记录下来。
  在visual c++集成开发环境中开发程序,不再需要特别准备.def文件,因为模块定义文件
中的设定都有默认值。模块定义文件中的stub指令用来指定所谓的stub程序,win16允许自设一个stub程序,
但win32不允许,win32中stub指令已经失效。


 

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

   windows程序的生死

1、程序初始化过程中调用createwindow,建立一个窗口后,作为程序的屏幕舞台,会送出W
WM_CREATE直接给窗口函数,后者可以在此时做些初始化操作。
2、在程序活着的时候,不断的以GetMessage从消息队列中抓取额消息。如果这个消息是WM_QUIT,
GetMessage会传回0而结束while循环,进而结束整个程序。
3、DispatchMessage通过Windows User模块的协助与监督,把消息分派到窗口函数。消息将在该处被判别并处理
4、程序不断的进行2.3的操作。
5、当使用这按下系统菜单中的close命令项时,系统送出WM_CLOSE。通常程序窗口函数不拦截此消息,于是DefWindowProc处理它。
6、DefWindowProc收到WM_CLOSE后,调用DestroyWindow把窗口清除。DestroyWindow本身会送出WM_DESTROY。
7、程序对WM_DESTTRORY的标准反应就是调用PostQuitMessage。
8、PostQuitMessage没什么其他操作,就只送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如步骤2,结束循环。

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

空闲时间的处理 onidle
  所谓的空闲时间(idle time )是指“系统中没有任何消息等待处理”的时间。

console程序与dos程序的差别:

  win32程序:利用windows编译器、链接器做处理的程序。
  console程序:如果程序以main为进入点,调用C Runtime函数和不牵扯GUI的Win32 api函数,那么就是一个
console程序,console窗口将会成为其标准输入和输出装置。
  dos程序:dos环境下开发的程序,也是以main为程序进入点,也可以调用C runtime函数,但是
不可能调用 win32 api函数。

 

************************************************************************************************************************************ MFC Console 程序设计

  在MFC 中,CFile用来处理正常的文件I/0操作。CStdioFile衍生自CFile,一个CStdioFile对象代表以 C Runtime函数fopen所开启的一个 steam文件,Stream文件有缓冲区,可以以文字模式或二进制模式开启。

   CString 对象代表一个字符串,是一个完全独立的类。

   

MFC程序的几个重点:

 

   1、程序进入点依然是main。

   2、需载入所使用的类的头文件 如afx.h。

   3、可直接使用与gui无关的mfc类,本列为CStdioFile 和CString。

   4、编辑时需指定 /mt,标示使用多线程版本的 Cruntime函数库。

    MFC console 程序中一定要指定多线程的 C runtime库,所以必须使用 /mt选项,不这样做,会出现错误。

 

*********************************************************************************************************************************

  Visual C++ 一共有6个 C runtime 函数库产品:

     Single-Threaded static   libc.lib       /ML

     Multithreaded       static  libcmt.lib     /MT

     Multithreaded     dll         msvcrt.lib          /MD

     Debug Single-Threaded  static  libcd.lib    /MLd

    Debug Multithreaded  static libcmtd.lib       /MTd

    Debug Multithreaded DLL    msvcrtd.lib       /MDd

*********************************************************************************************************************************

抱歉!评论已关闭.