标题:MFC 重绘图形闪烁问题
取消只看楼主
yijianhanmei
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-20
结帖率:87.5%
已结贴  问题点数:20 回复次数:0 
MFC 重绘图形闪烁问题
大家好,我的编程意图是在对话框中载入图片,然后添加按钮,点击按钮的时候在图片的某个位置绘制一个圆,下面是我的程序,问题是在点击按钮的时候,图片闪烁了一下。请问该如何消除?有方法说用双缓冲,我照着此方法更改(有几行代码已被我注释),但是程序运行产生中断。请问该如何解决图片重绘闪烁的问题?在我的程序上该如何更改?谢谢。

void CmapDlg::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();
        CPaintDC dc(this);
        CRect rect;
        CBitmap bmBackGround;
        CDC dcMem;
        GetDlgItem(IDC_MAP)->GetWindowRect(rect);                    //这里的IDC_STATIC_NAME是你要添加位图的范围
        ScreenToClient(rect);                                            //将屏幕坐标转换成客户区坐标   
        dcMem.CreateCompatibleDC(&dc);                                    //创建兼容DC
        bmBackGround.LoadBitmap(IDB_BITMAP1);
        BITMAP bitmap;
        bmBackGround.GetBitmap(&bitmap);                                //获取位图信息
    //    bmBackGround.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
        CBitmap *pbitold=dcMem.SelectObject(&bmBackGround);                //将位图选入DC中
    //    dcMem.FillSolidRect(rect,dc.GetBkColor());//按原来背景填充客户区,不然会是黑色
        SetStretchBltMode(dc, HALFTONE);
        dc.StretchBlt(rect.TopLeft().x,rect.TopLeft().y,rect.Width(),rect.Height(),
        &dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);                //以stretchBlt的方式添加位图到相应区域
        dcMem.SelectObject(pbitold);
        dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
    //    dcMem.DeleteDC();                                      //删除DC
    //    bmBackGround.DeleteObject();                                       //删除位图
        CBrush brush;
        brush.CreateSolidBrush(RGB(255, 0, 0));
        dc.SelectObject(brush);
        if (m_draw)
        {
            dc.Ellipse(rect.left+m_x-5, rect.top+m_y-5, rect.left+m_x+5, rect.top+m_y+5);
        }
        m_draw=false;   
    }
}
void CmapDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    m_draw=true;
    m_x=527;
    m_y=337;
    CRect rect;
    GetDlgItem(IDC_MAP)->GetWindowRect(rect);                    //这里的IDC_STATIC_NAME是你要添加位图的范围
    ScreenToClient(rect);   
    InvalidateRect(rect);
}
搜索更多相关主题的帖子: 上下文 对话框 图片 如何 
2013-08-23 16:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-419567-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.142900 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved