我住包子山

this->blog.MoveTo("blog.baozishan.in")

vc++技术内幕学习心得1

这篇心得关于技术内幕第五章,比较的基础..
我是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坐标是Viewclient坐标,如果需要全局坐标需要转换

 

第二个例子关于映射模式

 

不同的映射模式,对应的坐标是有区别的,而且他们的逻辑单位比例都不同

 

固定比例的映射模式有

 

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_ANISOTROPICMM_TEXTx轴左向右,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

posted on 2007-11-23 16:37 Gohan 阅读(1279) 评论(0)  编辑 收藏 引用 所属分类: MFC/SDK


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理