分享
 
 
 

VC++技术内幕(第四版)笔记(第4章)

王朝vc·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

/******************************************/

第四章:基本事件处理、映射模式和滚动视图

1,消息映射:如在视窗中按下鼠标做键,会自动发送WM_LBUTTONDOWN消息,如果要对这消息有所反应的话,需

//{{AFX_MSG(CEx04aView)

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//头文件声明消息响应函数原型。

//}}AFX_MSG

DECLARE_MESSAGE_MAP()//头文件

BEGIN_MESSAGE_MAP(CDrawView, CView)//代码文件

//{{AFX_MSG_MAP(CEx04aView)

ON_WM_LBUTTONDOWN()//该消息映射宏将OnLButtonDown函数和应用程序框架联系在一起

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) //代码文件

{

//event processing code here

}

说明:

为了方便ClassWizard,AppWizard生成了一些注释行。它把消息映射函数原型放在两个AFX_MSG“刮弧对”之间,在AFX_MSG_MAP“刮弧对”之间添加消息映射入口,并在代码文件中给出完整的OnLButtonDown成员函数框架。

2,视图中的OnDraw()是根据视图当前状态来绘制图象的,用户的操作可以改变这中状态。在完整的MFC库应用程序中,文档的对象掌握在应用程序(视图)的状态。

3,如果用全程变量来保存视图状态,这将在多视图情况下会遇到麻烦;(待体会)

4,CWnd::InvalidateRect函数能够触发WM_PAINT消息,该消息被窗口类如CView映射后,引起对OnDraw函数调用,从而重绘无效矩形区域。

优化窗口的绘制过程:

1)设置的无效区域越小,重画的速度就越快;

2)执行无效区域外的绘制纯属于浪费时间,OnDraw函数可以调用CDC的成员函数GetClipBox得到无效区域大小。

注意:

OnDraw函数不仅仅响应InValidate*之类的调用,它也会在窗口改变大小和窗口显露时被调用。

5,本章重要介绍函数

PtInRect(..);//测试一个点是否落在某个矩形内。

PtInRegion(..);//判断一个点是否落在椭圆(CRgn对象)内//A region is an elliptical or polygonal area within a window.

GetClientRect(..);//获得客户矩形坐标并保持在CRect对象中

SelectStockObject(..);//选择the predefined stock pens, brushes, or fonts到DC中,函数返回先前的CGdiObject 对象指针。

6,在构造函数中对类数据成员初始化。

CEx04aView::CEx04aView() : m_rectEllipse(0, 0, 200, 200)//注意这种初试化方式,m_rectEllipse是CEx04aView类数据成员CRect类对象

{

m_nColor = GRAY_BRUSH;

}

7,[致WIN32程序员]:

标准的基于WINDOWS应用程序会首先登记一个窗口类(不同于C++类[补:实际是个_WNDCLASS结构体]),同时在处理过程中,还需要对每个类指定窗口过程(WINDOWS PROCEDURE)。每次应用程序调用CreateWindow建立一个窗口时候,都要指定一个窗口类做为参数,这样就把新建立的窗口和窗口过程函数连接起来了。每次Windows给窗口发送消息时候,这个函数就会被调用(补:消息循环中DispatchMessage(&msg)分派消息到窗口的回调函数处理,OS调用窗口回调函数进行处理),以检查用参数传送进来的消息码,并执行适当的代码来处理该消息。

MFC库应用程序框架有一个适用于大多数窗口类型的简单窗口类和窗口过程函数。该窗口过程函数会根据参数传进来的窗口句柄,在MFC的句柄映射表(handle map)中查找,从而得到对应的C++窗口对象指针。然后,该窗口过程函数用MFC运行时类(runtime class)系统来决定窗口对象的C++类。下一步,它从由消息分发映射函数生成的静态表中找到消息处理函数,最后用正确的窗口对象调用消息处理函数。

8,映射模式:

1)MM_TEXT映射模式:坐标被映射到象素,X值向右递增,Y值向下递增。可用它来表示[设备坐标]。

CDC::SetMapMode(..)//设置映射模式

CDC::GetMapMode(..)

CDC::SetViewportOrg(..)//设置视口原点

CDC::GetViewportOrg(..)

CDC::SetWindowOrg (..)//设置屏幕原点

CDC::GetWindowOrg(..)

2)固定比例映射模式(MM_HIENGLISH,MM_HIMETRIC ,MM_LOMETRIC ,MM_LOENGLISH,MM_TWIPS )

固定比例映射模式均X值向右递增,Y值向下递增,它们之间唯一差别是 实际的比例因子。如下:

MM_HIENGLISH Each logical unit is converted to 0.001 inch.

MM_HIMETRIC Each logical unit is converted to 0.01 millimeter.

MM_LOENGLISH Each logical unit is converted to 0.01 inch.

MM_LOMETRIC Each logical unit is converted to 0.1 millimeter.

MM_TWIPS Each logical unit is converted to 1/20 of a point(磅). (Because a point is 1/72 inch, a twip is 1/1440 inch.)

//MM_TWIPS常常用于打印机。

3)可变比例映射模式:(MM_ISOTROPIC ,MM_ANISOTROPIC )

这两种模式用许我们改变它们的比例因子和坐标原点。

应用这两中模式,如用户改变窗口的尺寸,绘制的图形大小也会发生响应的变化

具体如下:

The MM_HIENGLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC, and MM_TWIPS modes are useful for applications that must draw in physically meaningful units (such as inches or millimeters). The MM_ISOTROPIC mode ensures a 1:1 aspect ratio, which is useful when it is important to preserve the exact shape of an image. The MM_ANISOTROPIC mode allows the x- and y-coordinates to be adjusted independently

常一起使用的函数:

SetWindowExt(..)//Sets the x- and y-extents of the window associated with the device context.

SetViewportExt(..)//Sets the x- and y-extents of the viewport of the device context.

注意:

When the following mapping modes are set, calls to SetWindowExt and SetViewportExt functions are ignored:

MM_HIENGLISH,MM_HIMETRIC,MM_LOENGLISH,MM_LOMETRIC,MM_TEXT,MM_TWIPS

When MM_ISOTROPIC mode is set, an application must call the SetWindowExt member function before calling SetViewportExt.

9,坐标变换:(具体参见P54)

许多MFC库函数只能在设备坐标下工作(尤其CRect类成员函数)。可以认为CDC的所有成员函数都一逻辑坐标作参数。可以认为CWnd的成员函数都以设备坐标做参数。(所有在实际窗口上点击获得的坐标都是逻辑坐标)。在设置了设备环境的映射模式及相应的参数以后,CDC的LPtoDP和DPtoLP函数可以用来在逻辑坐标系和设备做表系之间进行转换。

在CView的虚函数OnPrepareDC中设置映射模式要比在OnDraw函数中要好。

//*注意:

CView::OnPrepareDC

virtual void OnPrepareDC( CDC* pDC, CPrintInfo* pInfo = NULL );

应用程序将在调用OnDraw之前调用OnPrepareDC函数。

(OnPrepareDC在为屏幕显示而调用OnDraw函数之前,或在为打印或打印预览每一页而调用OnPrint成员函数之前。)

10,CScrollView支持滚动条的滚动,但不支持键盘的滚动。通过使用CWnd的ScrollWindow和SetViewportOrg函数,CScrollView类允许将视口原点移到窗口中的任何一个位置,甚至包括窗口区域的上部或窗口的原点的左边。

键盘输入是分两步处理的。OS向窗口发送类如WM_KEYDOWN和WM_KEYUP消息时用的是虚拟键盘码,在消息到达窗口之前,被翻译成WM_CHAR消息,该消息带着正常的键码。

利用对WM_KEYDOWN消息进行响应,对按键分别调用OnVScroll就可以使应用程序支持键盘的滚动。

CWnd::OnVScroll

afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );

////

nSBCode:

SB_BOTTOM Scroll to bottom.

SB_ENDSCROLL End scroll.

SB_LINEDOWN Scroll one line down.

SB_LINEUP Scroll one line up.

SB_PAGEDOWN Scroll one page down.

SB_PAGEUP Scroll one page up.

SB_THUMBPOSITION Scroll to the absolute position. The current position is provided in nPos.

SB_THUMBTRACK Drag scroll box to specified position. The current position is provided in nPos.

SB_TOP Scroll to top.

////

The framework calls this member function(OnVScroll) when the user clicks the window’s vertical scroll bar.

11,CView::OnInitialUpdate

virtual void OnInitialUpdate( );

说明:

OnInitialUpdate是视图窗口完全建立后框架调用的第一个函数。框架在第一次调用OnDraw前会调用OnInitialUpdate。

具体参见下:

Called by the framework after the view is first attached to the document, but before the view is initially displayed. The default implementation of this function calls the OnUpdate member function with no hint information .

12,MFC对140种Windows消息直接直接提供了相应的消息控制函数,当然,我们还可以定义自己的消息和相应的消息控制函数。

五种特殊Windows消息:WM_CREATE,WM_CLOSE,WM_QUERYENDSESSION,WM_DESTROY,WM_NCDESTROY.(具体参见 p62-63页。这两页强烈建议看看,这里简要笔记三个最常用最重要的)

1)WM_CREATE消息:

The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. The window procedure of the new window receives this message after the window is created, but before the window becomes visible. The message is sent before the CreateWindowEx or CreateWindow function returns.

2)WM_CLOSE消息:

当关闭窗口或父窗口被关闭时,Windows都会发送WM_CLOSE消息。可以重新定义该消息响应函数OnClose来完全控制关闭过程。

3)WM_DESTROY消息:

Windows在发送WM_CLOSE消息之后,紧接着就会发送WM_DESTROY消息(响应这个消息的时候,窗口已经消失但还没有销毁)。

(可以响应这个消息来做一些销毁当前窗口后的一些事情,例如再弹出其它对话框发送其他的消息)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有