博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++技术内幕(三)
阅读量:6502 次
发布时间:2019-06-24

本文共 2329 字,大约阅读时间需要 7 分钟。

C*View <- Cview <- CWnd <- Cobject

C*View 两个最重要的基类:CView和CWnd,CWnd提供了C*View的”窗口属性”,CView则提供了它和应用程序框架其他部分间的联系。

在视窗内绘图:

OnDraw成员函数:

是CView类中的虚成员函数,每次视窗被重新绘制时,应用程序都将调用OnDraw。如果用户改变了窗口尺寸,或窗口需要恢复被遮盖部分,则应用程序会直接调用OnDraw;如果程序中某个程序修改了数据,则必须通过调用视图所继承的Invalidate(或者InvalidateRect)成员函数来通知Windows。调用Invalidate后会触发对OnDraw的调用。

Windows设备环境:

Windows不允许直接访问硬件,需通过与窗口相关联的”设备环境”跟显示硬件进行通信。MFC库中设备环境由C++的CDC类对象表示,该对象作为参数传给OnDraw函数。通过调用CDC的许多成员函数可完成各种各样的绘图工作。

OnDraw原型:void OnDraw(CDC* pDC);

示例:

void CEx3View::OnDraw(CDC* pDC)

{

    pDC->TextOut(0,0,"Hello World!");//默认字体,左上角输出

    pDC->SelectStockObject(GRAY_BRUSH);//把GRAY_BRUSH对象选入环境

    pDC->Ellipse(CRect(0,20,100,120));

//CRect一临时对象作为外接矩形参数传给Ellipse。

}

注:SelectStockObject只能把有限的几种对象选入环境,而SelectObject是可以把任意GDI对象选入设备环境。

-----------------------------------------------------------------

MS_DOS程序通过调用操作系统功能来获得用户输入,而Windows程序通过操作系统发送的消息处理用户输入。

MFC库消息映射机制:函数原型、函数体、消息映射中的入口。

eg:

函数体:

void CEx3View::OnLButtonDown(UINT nFlags, CPoint point)

{

}

类头文件中:函数原型

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

头文件中还要包含:DECLARE_MESSAGE_MAP()

afx_msg并没有用途,只是表明该原型是针对消息映射而言。

消息映射宏,将OnLButtonDown函数同应用程序框架联系起来。(消息映射入口)

BEGIN_MESSAGE_MAP(CEx3View, CView)

        ON_WM_LBUTTONDOWN()//映射项

END_MESSAGE_MAP()

示例:绘一椭圆,鼠标左键单击,如点在椭圆内,椭圆颜色在灰和白间轮换。

操作都是在C*View中进行:

添加两成员变量:

private:

int m_Color;//颜色

CRect m_rectEllipse;//椭圆外接矩形

C*View构造函数中对成员变量初始化:

C*View ::C*View :m_rectEllipse(0,0,200,200)

{

    m_nColor = GRAY_BRUSH;

}

OnDraw的重写:

void C*View::OnDraw(CDC* pDC)

{

    pDC->SelectStockObject(m_nColor);

    pDC->Ellipse(m_rectEllipse);

}

通过类向导添加消息控制函数:

类向导对话框->选择C*View类->Message列表框中选择WM_LBUTTONDOWN;

编辑OnLButtonDown:

void CEx3View::OnLButtonDown(UINT nFlags, CPoint point)

{

    if(m_rectEllipse.PtInRect(point))

    {

       if(m_nColor == GRAY_BRUSH)

       {

           m_nColor = WHITE_BRUSH;

       }else{

           m_nColor = GRAY_BRUSH;

       }

    }

    InvalidateRect(m_rectEllipse);

//代码中进行了修改,要调用InvalidateRect才会调用OnDraw进行重画。

}

注:m_rectEllipse.PtInRect(point)

判断point是否在椭圆外围矩形m_rectEllipse中。如要更精确判断point是否在椭圆中,代码如下:

void CEx3View::OnLButtonDown(UINT nFlags, CPoint point)

{

    CRgn rgn;//定义一对应椭圆的类CRgn对象

    rgn.CreateEllipticRgnIndirect(m_rectEllipse);//获得椭圆区域

    if(rgn.PtInRegion(point))//PtInRegion代替PtInRect

    {

       if(m_nColor == GRAY_BRUSH)

       {

           m_nColor = WHITE_BRUSH;

       }else{

           m_nColor = GRAY_BRUSH;

       }

    }

    InvalidateRect(m_rectEllipse);

}

转载于:https://www.cnblogs.com/lxshanye/archive/2013/05/20/3088571.html

你可能感兴趣的文章
盘点大数据商业智能的十大戒律
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>
如何在Windows查看端口占用情况及查杀进程
查看>>
一分钟秒懂公有云、私有云、混合云......
查看>>
云存储应用Upthere获7700万美元股权债务融资
查看>>
国家互联网应急中心何世平博士主题演讲
查看>>
洗茶,你误会了多少年?
查看>>
移动大数据“后市场”受青睐 亟需数据深度学习人才
查看>>
贵阳高新区力争打造“千亿级大数据园区”
查看>>
安防众筹不止于卖产品 思维拓展刺激消费
查看>>
OpenSSH曝高危漏洞 会泄露私钥
查看>>
艾特网能获2016APCA用户满意品牌大奖
查看>>
《软件工艺师:专业、务实、自豪》一2.4 《敏捷软件开发宣言》
查看>>
《CCNP TSHOOT 300-135学习指南》——第2章 结构化故障检测与排除进程
查看>>
《Java EE 7精粹》—— 2.5 非阻塞I/O
查看>>
《Python数据科学实践指南》一2.2 字符串
查看>>