1.Win32基本程序概念(深入浅出MFC之读书笔记)

原创 2012年03月27日 20:45:25

Windows程序分为“程序代码”和“UI资源”两大部分,两部分最后以RC编译器整合为一个完整的的exe档案,如图所示。1.Win32基本程序概念(深入浅出MFC之读书笔记)

Windows程序调用的函数可分为C Runtimes以及Windows API两大部分,后者由操作系统本身提供(主要是GDI32.DLL,USER32.DLL和KERNEL32.DLL)。动态链接库在链接时期需要链接器为应用程序本身准备一些适当的信息,才能在执行时期跳转到dll中执行。这些信息放在“import函数库”中(如GDI32.LIB)。

Windows是以消息为基础的事件驱动系统。接受并处理消息的主角就是窗口。每一个窗口都有一个负责处理消息的函数称为“窗口函数”。

Win32应用程序与操作系统之间的关系如图所示。1.Win32基本程序概念(深入浅出MFC之读书笔记)

当windows的“外壳”(shell,例如资源管理器)侦测到使用者想要执行一个windows程序,于是调用加载器把该程序加载,然后调用C Startup code,后者调用Winmain,开始执行程序。Winmain的四个参数由操作系统传递进来。

消息发生时操作系统已经根据当时状态为消息标明了所属窗口,而窗口所属的窗口类已经明白标示了窗口函数。

消息映射雏形:首先定义一个MSGMAP_ENTRY结构和dim宏,

struct MSGMAP_ENTRY{

UINT nMessage;

LONG (*pfn)(HWND,UINT,WPARAM,LPARAM);//该元素是一个函数指针,以此指针所指的函数处理nMessage消息;

};

#define dim(x) (sizeof(x)/sizeof(x[0]))

接下来组织两个数组_messageEntries[]和_commandEntries[],把程序中欲处理的消息以及消息处理例程的关联性建立起来:

//消息与处理例程的对照表格

struct MSGMAP_ENTRY _messageEntries[]=

{

  WM_CREATE,OnCreate,

  WM_PAINT,OnPaint,

  WM_COMMAND,OnCommand.

};

//Command-ID与处理例程的对照表格

strcut MSG_ENTRY  _commandEntries=

{

  ID_ABOUT,OnAbout,

  IDM_FILEOPEN,OnFileOpen,

};

于是窗口函数可以这么设计:

//窗口函数

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

{

int i;

for(i=0;i<dim(messageEntries);i++){//消息对照表

  if(message==messageEntries[i].nMessage)

     return((*messageEntries[i].pfn)(hWnd,message,wParam,lParam));

}

return (DefWindowProc(hWnd,message,wParam,lParam));

}

//OnCommand——专门处理WM_COMMAND

LONG OnCommand(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

{

int i;

for(i=0;i<dim(commandEntries);i++){//命令项目对照表

    if(LOWORD (wParam)==commandEntries[i].nMessage)

     return((*commandEntries[i].pfn)(hWnd,message,wParam,lParam));

}

return (DefWindowProc(hWnd,message,wParam,lParam));

}

LONG OnCreate(...)

{

...

}

LONG OnAbout(..)

{

...

}

如此一来,WndProc和OnCommand永远不必改变,每当有消息要处理时,只要在_messageEntries[]和_commandEntries[]两个数组中加上新元素,并针对新消息撰写新的处理例程即可。

窗口的诞生和死亡:

1.Win32基本程序概念(深入浅出MFC之读书笔记)

注意GetMessage和PeekMessage的区别。前者只有收到WM_QUTI消息时返回零,后者在消息队列里没有消息时返回零,因此可用后者进行idle处理。

while(TRUE){

if(PeekMessage(&msg,NULL,0,0,PM_REMOVE){

     if(msg.message==WM_QUIT)

          break;

     TranslateMessage(&msg);

     DispatchMessage(&msg);

    }

    else {

       OnIdle();

      }

}

 

系统给予核心对象一个计数值作为管理之用,每个核心对象都会获得一个handle作为识别,每被使用一次,其对应的计数值加1。执行一个程序就必然产生一个进程(process)。

建立新进程之前,系统必须做出两个核心对象,也就是“进程对象”和“线程对象”。当系统产生这两个对象时,它会把两个对象的handle填入PROCESS_INFORMATION结构的相关字段中,应用程序可以从这里获得这些handles。

为了割断母子进程的关系,可以使用CloseHandle关闭子进程。

为了保证多线程的安全性,C Runtime函数库必须为每一个线程做一些登记工作。没有这些记录,C Runtime函数库就不知道要为每一个线程配置一块新的内存,作为线程的区域变量用。

相关文章推荐

MFC 与 win32应用程序区别(转)

MFC就是 微软给你包装了的库,提供了很多扩展功能,以及高级功能,这样方便你使用,而不是自己从头调用API来实现 而API由于是MFC下一层,自然实现更灵活,可以根据你的需要来使用,不会被MFC类库...

在Win32应用程序中使用MFC类库

由于MFC中的辅助类,如 CFileDialog,CFileFind,CString等使用起来非常的方便如果用API来完成相应的工作,则需要自己完成大量的重复工作,使用 MFC的辅助类可以节省大量...

《深入浅出MFC》学习笔记一 : Win32基本程序概念 (转)

本文转载至http://blog.chinaunix.net/uid-20782170-id-3141818.html  Windows程序运行的本质:Message based, Event dr...

<<深入浅出MFC>>笔记1——Win32基本程序观念

1.Windows SDK程序开发流程 主要分为程序代码和UI资源两部分。   2.以消息未基础,以事件驱动     程序不断的等待外围的输入,判断在处理。操作系统通过捕捉外围...

深入浅出MFC学习笔记:(第一章:win32基本概念,第二章:C++的重要性质)

深入浅出MFC阅读笔记:   写在开始的话: 刚结束《C++primer》的第二次阅读,决定趁热打铁,学习《深入浅出MFC》。当然,学习框架不是目的,而是通过学习MFC底层框架实现原理,对C...

深入浅出MFC-Win32程序基本概念.pptx

  • 2016年12月13日 08:18
  • 1.21MB
  • 下载

深入浅出MFC笔记1-Win32和MFC程序对比

MFC是Miscrosoft Foundation Classes的缩写,是微软对Windows API的封装,所以要学习MFC,首先要对Win32程序有一个基本的了解,下面用一个例子来说明Win32...

【深入浅出MFC】第二章 Win32 基本程序观念

1.类别及其成员- 谈封装(encapsulation) member variable(成员变量)和member function(成员函数) 2.基础类别与衍生类别:谈继承(Inherit...

深入浅出MFC笔记2-MFC程序如何包装Win32程序

从上一节的Win32程序与MFC程序的对比中可以看到,MFC程序中可运行代码只有MyApp::InitInstance()和MyFrame::MyFrame(),可以想到MFC程序一定会调用此两个函数...

程序员面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念

第五章    程序设计基本概念 5.1 赋值语句 x = x & (x-1); count ++; //将 x 转化成二进制后包含的1的数量 5.2 i++ 问...
  • Cowena
  • Cowena
  • 2015年08月08日 14:34
  • 983
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1.Win32基本程序概念(深入浅出MFC之读书笔记)
举报原因:
原因补充:

(最多只允许输入30个字)