金山界面库分析(8)

如何进行绘制


首先我们来看一下CBkDialogViewImpl类的绘制过程:

CBkDialogViewImpl含有一个CBkImage类成员m_imgMem用于双缓冲绘制,在WM_SIZE消息处理函数中进行创建:

m_imgMem.CreateBitmap(rcClient.Width(), rcClient.Height(), RGB(0,0, 0));

CBkDialogViewImpl含有一个CRgn类成员m_rgnInvalidate用于脏区域描述,在_InvalidateRect方法内创建(绘制之前):

m_rgnInvalidate.CreateRectRgnIndirect(rcInvalidate);

我们来看看CBkDialogViewImpl类的OnPrint方法,在处理WM_PAINT消息时会调用这个函数,首先获取一个兼容DC,并将双缓冲的图像渲染兼容DC:

            CDCdcMem;

            CDCHandledcMemHandle;

            HDChDCDesktop = ::GetDC(NULL);

            dcMem.CreateCompatibleDC(hDCDesktop);

            ::ReleaseDC(NULL, hDCDesktop);

            HBITMAPhbmpOld = dcMem.SelectBitmap(m_imgMem);

然后设置兼容DC的脏区域:

            dcMem.SelectClipRgn(m_rgnInvalidate);

之后在这个DC上面进行绘制操作,

            if(m_bHasHeader)

                m_bkHeader.RedrawRegion(dcMemHandle,m_rgnInvalidate);

            if(m_bHasBody)

                m_bkBody.RedrawRegion(dcMemHandle,m_rgnInvalidate);

            if(m_bHasFooter)

                m_bkFooter.RedrawRegion(dcMemHandle,m_rgnInvalidate);

最后将这个双缓冲图像整体绘制到窗口DC上面:

            m_imgMem.Draw(dc, 0, 0);

CBkDialogViewImpl的方法_InvalidateRect用于绘制指定区域,合并现有脏区域,重绘指定区域。_InvalidateControl方法用于重绘指定控件,即获取此控件位置并重绘此位置

 

可见现在绘制转入了控件层的RedrawRegion方法。

控件中用于处理绘制的方法有哪些呢:

CBkWindow:

RedrawRegion(只有控件在重绘区域内时才进行):调用DrawBkgnd,发送WM_PAINT消息

DrawBkgnd:在兼容DC中绘制背景,如果Skin存在,用Skin绘制,否则用Style中颜色绘制。

OnPaint:只有绘制文字的过程,一般不被调用

CBkPanel:

RedrawRegion:调用父类CBkWindow的RedrawRegion方法,重绘自身背景,循环调用每个子节点的RedrawRegion方法。

OnPaint:原来有处理,现在被return掉了。

在CBkPanel 类的RedrawRegion方法中调用了BeforePaint和AfterPaint两个方法,BeforePaint用来设置BkMode、BkColor、Font和TextColor并保存原始信息,AfterPaint用于将这些环境重置回原值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值