『VC++技术内幕』学习笔记(6)(5)
第1行 CClientDC由CDC派生,它的对象dc是当前窗口的客户区域
第2行 OnPrepareDC是在OnDraw函数前调用的。
第3行 将m_rectEllipse赋给rectDevice矩形区域
第4行 将矩形区域的逻辑坐标转为设备坐标,LPtoDP是CDC类的成员函数,且是多态的,函数声明如下:
void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;
void LPtoDP( LPRECT lpRect ) const;
void LPtoDP( LPSIZE lpSize ) const;
第5-11行 CRect的成员函数PtInRect(point)用来判断鼠标当前位置(point)是否在当前矩形(rectDevice)内
第12行 InvalidateRect函数可以触发WM_PAINT消息,改消息又被映射,引起调用OnDraw调用。
■第六步:映射WM_KEYDOWN消息并编辑OnKeyDown消息处理函数。在Class Wizard中选择CMyApp6View类,在Message列表中选择WM_KEYDOWN双击。用下面代码替换Wizard生成的OnKeyDown消息处理函数。
void CMyApp6View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch (nChar) {
case VK_HOME:
OnVScroll(SB_TOP, 0, NULL);
OnHScroll(SB_LEFT, 0, NULL);
break;
case VK_END:
OnVScroll(SB_BOTTOM, 0, NULL);
OnHScroll(SB_RIGHT, 0, NULL);
break;
case VK_UP:
OnVScroll(SB_LINEUP, 0, NULL);
break;
case VK_DOWN:
OnVScroll(SB_LINEDOWN, 0, NULL);
break;
case VK_PRIOR:
OnVScroll(SB_PAGEUP, 0, NULL);
break;
case VK_NEXT:
OnVScroll(SB_PAGEDOWN, 0, NULL);
break;
case VK_LEFT:
OnHScroll(SB_LINELEFT, 0, NULL);
break;
case VK_RIGHT:
OnHScroll(SB_LINERIGHT, 0, NULL);
break;
default:
break;
}
}
问题5:此段代码详解:
先看OnVScroll和OnHScroll的函数原型
afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
主要参数 nSBCode是指滚动条移动方向。
再看OnKeyDown函数原型
afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
主要参数nChar是指Virtual Keys code 虚拟键码你可以在winuser.h文件中看到更多,这里只列出很小一部分。
#define VK_ESCAPE 0x1B
#define VK_SPACE 0x20
#define VK_PRIOR 0x21
#define VK_NEXT 0x22
#define VK_END 0x23
#define VK_HOME 0x24
......
/* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
/* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
#define VK_LWIN 0x5B
......
编译运行它,怎么样成功了吧,
■第七步:做一个更复杂的程序,例如屏幕上有多个圆,然后点其中一个,则点中的变色,其他的不变。
- 上一篇:『VC++技术内幕』学习笔记(7)
- 下一篇:『VC++技术内幕』学习笔记(5)