重绘

MFC的机制是窗口被遮挡(最小化)后,恢复视图时,自动产生WM_PAINT消息发送给视图刷新窗口。该消息会触发OnPaint()函数。如果绘图语句是放在一个自定义函数中,并且不是在上述函数中调用的话(比如在按钮的处理函数中调用),就只能在屏幕上出现一次,窗口一旦更新就消失了。但是,如果在OnPaint()、函数中直接或间接绘制这些图形对象,这样每次窗口更新都不会“丢失”之前绘制的图形。 
具体解决的办法就是在void CMFCDemoDlg::OnPaint() 函数里加上自己的绘图代码。

void CMFCDemoDlg::OnPaint() 函数如下:

void CMFCDemoDlg::OnPaint()  
{  
    if (IsIconic())  
    {  
        CPaintDC dc(this); // 用于绘制的设备上下文  

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  

        // 使图标在工作区矩形中居中  
        int cxIcon = GetSystemMetrics(SM_CXICON);  
        int cyIcon = GetSystemMetrics(SM_CYICON);  
        CRect rect;  
        GetClientRect(&rect);  
        int x = (rect.Width() - cxIcon + 1) / 2;  
        int y = (rect.Height() - cyIcon + 1) / 2;  

        // 绘制图标  
        dc.DrawIcon(x, y, m_hIcon);  
    }  
    else  
    {  
        CDialogEx::OnPaint();  
    }  
   } 

else  
{  
    CDialogEx::OnPaint();  
}  

之后加上你的绘图代码,具体事例如下:

void CMFCDemoDlg::OnPaint()  
{  
    if (IsIconic())  
    {  
        CPaintDC dc(this); // 用于绘制的设备上下文  

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  

        // 使图标在工作区矩形中居中  
        int cxIcon = GetSystemMetrics(SM_CXICON);  
        int cyIcon = GetSystemMetrics(SM_CYICON);  
        CRect rect;  
        GetClientRect(&rect);  
        int x = (rect.Width() - cxIcon + 1) / 2;  
        int y = (rect.Height() - cyIcon + 1) / 2;  

        // 绘制图标  
        dc.DrawIcon(x, y, m_hIcon);  
    }  
    else  
    {  
        CDialogEx::OnPaint();  
    } 
    //以下为自己的绘图代码 
    if (R)  //R为布尔值,比如说你需要按一个按钮使对话框显示一幅图片,R可以在你的按钮激发事件里取真,然后激活绘图事件,当然在你的按钮激活事件里需要先绘图一次,OnPaint()里的绘图代码只是在窗口被遮挡(最小化)后才会生效,生效的前提也是你已经希望有图像绘制在对话框的那个事件前提下
    {  
       ......
       自定义的绘图代码,显示图片到MFC picture 控件  
    }  
}  

上面代码里的R为布尔值,比如说你需要按一个按钮使对话框显示一幅图片,R可以在你的按钮激发事件里取真,然后激活绘图事件,当然在你的按钮激活事件里需要先绘图一次,OnPaint()里的绘图代码只是在窗口被遮挡(最小化)后才会生效,生效的前提也是你已经希望有图像绘制在对话框的那个事件前提下。
--------------------- 
作者:小红ML 
来源:CSDN 
原文:https://blog.csdn.net/weixin_39449570/article/details/78960826 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值