这篇心得关于技术内幕第五章,比较的基础..
我是VC++的初学者
vc++技术内幕这本书我是去年暑假开始看的,那时候刚学windows编程,虽然之前用过c#,vb,不过都没怎么练习,这本书我大概看了前面的80%,不过都未曾动手,近日打算从头练习一下,在这里记些笔记
第五章第一个例子很简单
一个单文档MFC应用程序,View类中一个CRect类型变量保存矩形的信息,一个int型保存矩形颜色的属性
WM_LBUTTONDOWN响应函数判断单击左键时鼠标位置是不是在之前那个矩形区域内,是的话变换矩形颜色的属性,而且命令矩形区域重绘..
OnDraw()中用dc选取矩形颜色,绘制矩形的内切椭圆
应用的函数有:
virtual CGdiObject* CDC::SelectStockObject(
int nIndex
);//选取颜色,这里只选画刷大概有如下画刷
BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH WHITE_BRUSH
BOOL CDC::Ellipse(LPCRECT lpRect);//画矩形对应的内切椭圆
BOOL CRECT::PtInRect(
POINT point
) const throw( );//判断point是否在矩形中
注意一点就是CView::OnLButtonDown(UINT nFlags, CPoint point)
这里的Point坐标是View的client坐标,如果需要全局坐标需要转换
第二个例子关于映射模式
不同的映射模式,对应的坐标是有区别的,而且他们的逻辑单位比例都不同
固定比例的映射模式有
Mapping Mode
|
Logical Unit
|
MM_LOENGLISH
|
0.01 inch
|
MM_HIENGLISH
|
0.001 inch
|
MM_LOMETRIC
|
0.1 mm
|
MM_HIMETRIC
|
0.01 mm
|
MM_TWIPS
|
1/1440 inch
|
可变比例的映射模式
MM_ISOTROPIC and MM_ANISOTROPIC
我自己写了一个Demo看了一下,好像只有MM_ANISOTROPIC跟MM_TEXT是x轴左向右,y轴上到下,DC原点为0,0
其他的映射模式x轴一样,y轴变成了从下至上,DC原点还是0,0
CDC的几个函数这里有必要说说
virtual int CDC::SetMapMode(
int nMapMode
);
int CDC::GetMapMode() const;
设置/读取DC的映射模式
virtual CSize CDC::SetWindowExt(
int cx,
int cy
);//设置窗体范围
virtual CSize CDC::SetViewportExt(
int cx,
int cy
);//设置视口范围
virtual CPoint CDC::SetViewportOrg(
int x,
int y
);//设置(0,0)点的位置
窗体范围和视口范围的设置会影响可变比例映射
可变比例映射的x,y计算方法参看下面的公式
x scale factor = x viewport extent / x window extent
y scale factor = y viewport extent / y window extent
device x = logical x* x scale factor + x origin offset
device y = logical y* y scale factor + y origin offset
CDC成员函数的参数大都是用逻辑坐标,但是CWnd的成员却以设备坐标为参数
但是CDC成员中有函数
LPtoDP,将逻辑坐标转换为设备坐标
void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const; void LPtoDP( LPRECT lpRect ) const; void LPtoDP( LPSIZE lpSize ) const;
DPtoLP,刚好相反
void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const; void DPtoLP( LPRECT lpRect ) const; void DPtoLP( LPSIZE lpSize ) const;
第三个例子关于滚动条
文档视图的工程建立向导中可以让View继承自CScrollView,使得View带有滚动条
OnInitialUpdate函数在视图建立后,OnDraw执行之前执行,所以对于滚动条的初始化可以放在这个函数中
void CScrollingViewWindowView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: 计算此视图的合计大小
sizeTotal.cx = 20000; //20cm
sizeTotal.cy = 30000; //30cm
CSize sizePage(sizeTotal.cx/2,sizeTotal.cy/2);
CSize sizeLine(sizeTotal.cx/50,sizeTotal.cy/50);
SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
}
虽然是初始化了滚动条,但是不能够使用快捷键(上下左右,pagedown啥的),需要手动重载afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
需要用到CWnd::OnVScroll, CWnd::OnHScroll,分别控制纵向与横向两个滚动条
nSBCode
Specifies a scroll-bar code that indicates the user's scrolling request. This parameter can be one of the following:
· 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.
by gohan 11.23