文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » vc++技术内幕学习心得1       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] vc++技术内幕学习心得1  ( 查看:429  回复:2 )   
 
tiapp
助理工程师  点击可查看详细



帖子 358
精华 0
无忧币 1725
积分 1272
阅读权限 40
注册日期 2007-8-15
最后登录 2008-4-14 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-12-12 14:25   标题:vc++技术内幕学习心得1
上一帖 |
作者BLOG:Gohan's work?


这篇心得关于技术内幕第五章,比较的基础..
我是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:tInRect(
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

[ 本帖最后由 tiapp 于 2007-12-12 14:49 编辑 ]



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-12-12 14:251楼
[ 顶部 ]
 
ncrr
初级工程师  点击可查看详细



帖子 2798
精华 0
无忧币 2846
积分 3203
阅读权限 50
来自 (保密)
注册日期 2006-11-8
最后登录 2008-10-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-12-12 14:44 
感谢分享,回贴支持一下.



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-12-12 14:442楼
[ 顶部 ]
 
noto2008
新新人类  点击可查看详细



帖子 151
精华 0
无忧币 62
积分 166
阅读权限 20
注册日期 2006-9-6
最后登录 2008-8-21 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-12-13 10:30 
看不懂,还得加紧学习才是



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-12-13 10:303楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号