Windows核心编程(1)

一、创建过程 消息循环

1.WinMain首先调用Api函数RegisterClass注册一个窗口类,这个类定义

了窗口重要属性,如窗口过程地址, 默认背景色, 图标. 通过WNDCLASS结构字段

来定义,  程序生成一个窗口时,必须制定窗口类, 在类被使用之前,必须先对其进行注册,

这就是为什么RegisterClass在程序的开始即被调用的原因,

2.一旦WNDCLASS被注册,WinMain讲调用最重要的CreateWindow函数生成应用程序

3.一个MFC程序你看不到WinMain函数,他也不调用RegisterClass或CreateWIndow

由于生成没有WS_VISIBLE所以在CreateWIndow之后要调用ShowWindow

它是窗口可见,并确保WM_PAINT消息处理程序立刻执行。

4.接下来就是消息循环,为了检索并调度消息,WinMain执行一个简单的反复调用

GetMessage,TranslateMessage,和DispatchMessage这3个API讲函数的while循环语句

GetMessage检查消息队列,如果某个消息是有效的,则讲它从队列删除并复制到msg

否则GetMessage将停留到消息队列上知道消息有效, msg是MSG的一个实例

其知道保包含相关的消息参数,

例如消息ID和消息被放置在队列中的时间,  TranslateMessage函数将一个指示字符键的键盘

消息转换成容易使用的WM_CHAR消息,DispatchMessage函数则讲消息发送给窗口过程,

5.消息循环一直循环到GetMessage函数返回0值时结束, 这个只有WM_QUIT消息从消息队列中

被检索到时才发生,.这是WinMain结束,程序终止.

6.由DispatchMessage函数调度的消息将生产对窗口过程WinProc的调用, 其他没有被处理

的消息传递给了DefWindowProc函数进行默认处理,

7.窗口类是Windows系统的数据结构, 窗口类包含窗口重要信息,如窗口风格,窗口消息处理WndProc

窗口的光标等

二、应用程序对象

  1. MFC应用核心是基于CWinApp类对象,CWinApp提供了消息循环并来检索消息,

并将消息调度给应用程序窗口

2.覆盖ExitInstance在应用程序终止后调用,是释放资源的完美地方,覆盖要确保调用基类

三、框架窗口对象

1.MFC的CWnd类机器派生类为窗口或应用程序创建的窗口提供面向对象接口

窗口类是从CMainWindow是从CFrameWnd类派生的,后者又是从CWnd派生

CFrameWnd模仿框窗口的行为,

2.客户区和非客户区

窗口的非客户区包含标题栏.菜单栏,窗口边框

客户区指除非客户区之外的区域,都是客户区

3.窗口样式 是影响窗口外观和行为的一组属性集合

采用WS为前缀的宏定义

WS_BORDER创建有边框的窗口

WS_CAPTION创建有标题栏的窗口

WS_CHILD创建一个子窗口 等等...

4.窗口扩展样  一般用WS_EX_为前缀的宏定义

WS_EX_CLIENTEDGE指明窗口具有3D外观

WS_EX_APPWINDOW当窗口可见时,将窗口放置在任务栏

WS_EX_CONTROLPARENT允许用户TAB键遍历子窗口 ...

四、窗口的Z-Order与桌面窗口

  1. 窗口Z-Order的概念

屏幕一般X轴Y轴表示平面位置,而以Z轴表示前后位置,X轴从左向右

Z轴从屏幕内指向屏幕外,Z-Order值表示窗口的前后顺序,Z-Order值越大,在屏幕显示越靠近用户

2.桌面窗口

桌面窗口就是系统桌面对应的窗口,桌面窗口与其它的关系是,桌面窗口在最底层,其它窗口

在它之上,所有它的Z-Order值最小。

五、父窗口和所有者窗口

  1. 父窗口与所有者窗口的名次

窗口之间有两种关系, 一种是owner-owner关系 和 parent-child关系

前者是所有/被所有关系, 后者是父/子关系, owner称为所有窗口,parent为父窗口

2.父窗口与子窗口的关系

子窗口是嵌在父窗口上面的,就像是钉在父窗口上面的感觉,子窗口显示区域不能超过

父窗口的显示区域,超出的不显示,当父窗口被隐藏时,它的所有子窗口也被隐藏,

当父窗口销毁时,它拥有所有子窗口都被销毁.

3.所有者窗口与被所有者窗口的关系

被所有的窗口永远显示在所有者窗口之上,当所有者窗口最小化时,被所有窗口会自动隐藏

当所有窗口销毁时,被所有的窗口就会被销毁, 当所有者窗口移动时,被所有的窗口不一起移动,

被所有窗口可以在所有者窗口区域之外的位置显示.

原文地址:http://blog.51cto.com/12158490/2092674

时间: 2024-10-31 15:52:05

Windows核心编程(1)的相关文章

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

【windows核心编程】DLL相关(2)

关于DLL的延迟加载 延迟加载DLL,使用的是隐式加载方式,当为exe使用的DLL指定为延迟加载的时候,连接器会将exe的[导入段]中去除该DLL的相关信息,同时在exe中嵌入一个新的[延迟加载段]表示要从该DLL中导入哪些函数. 通过让对延迟加载函数的调用跳转到delayimp.lib中的__delayLoadHelper2函数,来完成对延迟加载的DLL的解析. 当exe中第一次调用了一个延迟加载的DLL中的某个导出函数时,加载器才会将该DLL加载到进程地址空间中.需要注意的是:虽然此时已经加

《windows核心编程系列》十八谈谈windows钩子

windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功能.所谓的指定窗体并不局限于当前进程的窗体,也能够是其它进程的窗体.当监视的某一消息到达指定的窗体时,在指定的窗体处理消息之前,钩子函数将截获此消息,钩子函数既能够加工处理该消息,也能够不作不论什么处理继续传递该消息.使用钩子是实现dll注入的方法之中的一个.其它经常使用的方法有:注冊表注入,远程线

【windows核心编程】DLL相关

DLL相关的东西 1.DLL的加载方式 隐式: #pragma comment(lib, "XX.lib"); 编译器去查找名为XX.dll的DLL,除了名字相同,该DLL和该LIB的GUID也相同. 显式: HINSTANCE   hInst = LoadLibrary(TEXT("XX.dll")); if(NULL == hInst)  retrun; HINSTANCE hInst = LoadLibrary(TEXT("XX.dll")

《Windows核心编程》第5版 学习进度备忘

学习资源:<Windows核心编程>第5版 知识基础支持: 跳过的内容: 1. 知识要点: 1: 注意事项: 1. 不理解知识点: 1. 进度: 1.2014-08-10,前两章结束,接下来“第3章内核对象” <Windows核心编程>第5版 学习进度备忘,布布扣,bubuko.com

windows核心编程(字符编码)

一.字符编码 字符集 1)字符集是字符的数字代码集.有ANSI/ASCII.MBCS(Multibytes).Unicode等.比如“汉”字Unicode代码为0x6c49. 编码方案 2)编码方案是记录字符代码的方式.有UTF-8.UTF-16.GB2312等.编码方案分“变长编码”与“定长编码”两种.UTF-8是变长编码(汉字有的两字节有的三字节),而UTF-16是两字节定长的编码. 字符集与编码方案 3)字符集与编码方案是配套的.如GB2312编码,即是GB2312字符集与GB2312编码

【windows核心编程】使用远程线程注入DLL

前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写.  示意图如下:  相关API 1.创建远程线程 //该函数除了第一个参数为目标进程句柄外 //其他参数均和CreateThread一样 HANDLE hThread = CreateRemoteThread( __in HANDLE hProcess, //目标进程句柄 __in_opt LPSECURITY_A

【windows核心编程】线程局部存储TLS

线程局部存储TLS, Thread Local Storage TLS是C/C++运行库的一部分,而非操作系统的一部分. 分为动态TSL 和 静态TLS 一.动态TLS 应用程序通过调用一组4个函数来使用动态TLS, 这些函数实际上最为DLL所使用. 系统中的每个进程都有一组 正在使用标志(in-use flag), 每个标志可被设置为FREE 或者 INUSE, 表示该TLS元素是否正在使用. 微软平台保证至少有TLS_MINUMUM_AVALIABLE个标志位可供使用, TLS_MINUMU

【windows核心编程】DLL相关(3)

DLL重定向 因为DLL的搜索路径有先后次序,假设有这样的场景:App1.exe使用MyDll1.0.dll, App2.exe使用MyDll2.0.dll, MyDll1.0 和 MyDll2.0是同一个DLL的两个版本,1.0为旧版本,2.0为新版本. 而如果MyDll2.0.dll的存放路径的优先次序比较靠前时,那么App1.exe就会去加载MyDll2.0.dll,这就可能引发 DLL地狱问题,因此DLL重定向可解决这个问题. 加载程序总是先检查应用程序目录,我们所要做的就是如下: ①在

windows核心编程 DLL技术 【转】

注:本文章转载于网络,源地址为:http://blog.csdn.net/ithzhang/article/details/7051558 本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑定的技术. 第一种将DLL映射到进程地址空间的方式是直接在源代码中引用DLL中所包含的函数或是变量,DLL在程序运行后由加载程序隐式的载入,此种方式被称为隐式链接. 第二种方式是在程序运行时,通过调用API显式的载入所需要的DLL,并显式的链接所想要链接的符号.换句话说,程序在运行时,其中的一个线程