VC++杂七杂八的笔记(三)

UpdateWindow函数通过发送一个WM_PAINT消息来刷新窗口,UpdateWindow将WM_PAINT消息直接发送给了窗口过程函数进行处理,而没有放到消息队列里。

MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。在消息映射表中,消息与对应的消息处理函数指针是成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息。如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。

MFC在后台维护了一个窗口句柄与对应的C++对象指针的对照表。当收到某一消息时,消息的第一个参数就指明了该消息与哪个窗口句柄相关,通过对照表,就可以找到与之相关的C++对象指针。然后把这个指针传递给应用程序框架窗口类的基类,后者会调用一个名为WindowProc的函数。

_T宏

Windows 98及以前的版本使用8位的ANSI字符集,它类似于ASCII字符集。Windows NT使用16位的Unicode字符集,它是ANSI字符集的一个超集。Unicode包含了各种各样来自非US字母表的字符。

使用ANSI字符编译的程序可以在Windows NT上运行,但Unicode程序运行起来要稍微快点,因为Windows NT不需要在每个字符上执行ANSI到Unicode的转换。Unicode应用程序不能在Windows 98上运行。

_T("Hello"):如果定义了预处理_UNICODE,编译器将使用Unicode字符。如果没有定义则使用ANSI字符。使用_T宏修饰字符串常量同时还需要做以下工作:

(1)将字符声明为TCHAR而不是char。

(2)使用TCHAR*来声明TCHAR字符串指针或者更佳的LPTSTR(指向TCHAR字符串的指针)和LPCTSTR(指向const TCHAR字符串的指针)。

如果只是用指定的画刷填充一块区域,并不需要把画刷选入设备描述表。设备描述表中存在一个默认的白色画刷。

创建CBitmap对象时,仅调用其构造函数并不能得到一个有用的位图对象,还需要调用一个初始化函数来初始化这个位图对象,如LoadBitmap、CreateBitmap等。

void CTESTADlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    CBitmap bitmap;
    bitmap.LoadBitmapW(IDB_BITMAP1);
    CBrush brush(&bitmap);
    CClientDC dc(this);
    dc.FillRect(CRect(CPoint(0, 0), point), &brush);

    CDialogEx::OnLButtonDown(nFlags, point);
}

VC++为我们提供的位图编辑器只能编辑256色或更少颜色的位图,超过256色的位图就不能被加载了,但这幅位图在程序中是能正常使用的。

位图的显示

一种显示位图的方法如下:

CreateCompatibleDC函数将创建一个内存设备上下文,与参数pDC所指定的DC兼容。内存设备上下文实际上是一个内存块,表示一个显示的表面。如果想把图像复制到实际的DC中,可以先用其兼容的内存设备上下文在内存中准备这些图像,然后再将这些数据复制到实际DC中。

窗口的绘制包含两个步骤:擦除窗口背景,然后对窗口重新进行绘制。擦除窗口背景时,程序会发送一个WM_ERASEBKGND消息。

BitBlt函数是将源设备上下文中的位图复制到目标设备上下文中。调用BitBlt复制位图后,又调用了视类的基类的OnEraseBkgnd函数,该函数的调用把窗口背景擦除了,所以会看到我们设置的位图一闪就消失了。

StretchBlt函数可以实现位图的拉伸或压缩,以适合目的矩形区域的尺寸。

OnDraw中显示位图也可以,但窗口会有闪烁现象,这是因为当窗口尺寸发生变化时,会引起窗口重绘操作,它会首先擦除背景,然后再重新贴上位图。

 1 BOOL CBitView::OnEraseBkgnd(CDC* pDC)
 2 {
 3     CBitmap bitmap;
 4     bitmap.LoadBitmapW(IDB_BITMAP2);
 5     BITMAP bmp;
 6     bitmap.GetBitmap(&bmp);
 7
 8     CDC dcCompatible;
 9     dcCompatible.CreateCompatibleDC(pDC);
10
11     dcCompatible.SelectObject(&bitmap);
12
13     CRect rect;
14     GetClientRect(rect);
15     //pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY);
16     pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
17     //return CView::OnEraseBkgnd(pDC);
18     return TRUE;
19 }
时间: 2024-10-16 12:25:50

VC++杂七杂八的笔记(三)的相关文章

VC++杂七杂八的笔记(二)

在Windows中,不仅用户程序可以调用系统的API函数,系统也会调用用户程序,这个调用是通过消息来进行的.wParam和lParam表示的信息随消息的不同而不同. 每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口消息. Windows程序中的消息分为进队消息和不进队消息.进队消息将由系统放入到应用程序的消息队列中,然后由应用程序取出并发送.不进队消息在系统调用窗口过程时直接发送给窗口.不管进队消息还是不进队消息,最终都由系统调用窗口

VC++杂七杂八的笔记(一)

Afx_msg并没有什么其他用途,它只是用来表明该原型说明是针对消息映射函数而言. 仅改变视窗成员变量OnDraw函数是不会被调用的(除非改变了视窗的大小).必须调用InvalidateRect函数,它能触发Windows的WM_PAINT消息,该消息又在CView类被映射,以引起对OnDraw的调用. OnDraw的参数名以注释的形式存在,所以在使用这个指针之前,必须解除这个名称的注释,或用自己的名称代替这个名称. 两种情况可优化Windows的绘制过程.第一,我们必须知道Windows只更新

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

构建之法阅读笔记三—结对编程

构建之法阅读笔记三——结对编程 何谓结对编程,结对编程就是程序员肩并肩,平等的,互补的进行开发工作,他们使用同一台电脑,编写同样的程序,一起分析,一起设计,一块交流想法. 然而我以前却并不是这样做的,我以前喜欢在没人打扰的环境下写代码,我觉得有人在我身边看着,会影响我的思路,还有我个人自尊心比较强,不太喜欢被人指指点点,所以每次都是,我写完代码之后,自己先找自己的bug,每当自己实在找不到之后,才会请教大神,但是有时候可能由于自己的能力不足,往往一个很简单的问题,我自己发现就会花费很久的时间,让

3. 蛤蟆的计算机组成原理笔记三系统总线

3. 蛤蟆的计算机组成原理笔记三系统总线 本篇名言:"公正,一定会打倒那些说假话和假作证的人. --赫拉克利特" 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47988545 1.  总线 总线是连接各个部件的信息传输线,是 各个部件共享的传输介质. 1.1             面向CPU 的双总线结构框图 1.2             单总线结构框图 1.3             以存储器为中心的双总线

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

NFC学习笔记——三(在windows操作系统上安装libnfc)

本篇翻译文章: 这篇文章主要是说明如何在windows操作系统上安装.配置和使用libnfc. 一.基本信息 1.操作系统: Windows Vista Home Premium SP 2 2.硬件信息: System: Dell Inspiron 1720 Processor: Intel Core 2 Duo CPU T9300 @ 2.5GHz 2.5GHz System type: 32-bit Operating System 3.所需软件: 在windows操作系统上安装软件需要下列

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①