IT老混混
2015-11-06 05:54
采纳率: 60%
浏览 1.6k
已采纳

请教一个问题,关于GDI画图闪动的

用GDI在窗口画图的时候,当窗口收到画图消息,总是先画背景再画贴图,
所以画出来的东西只要你拖动窗口改变它的尺寸他就要闪烁,可是像什
么视频播放器之类的东西,放视频的时候,你改变他的窗口大小,他却从来
不闪,那么这个视频播放器画图是用什么东西画的,难道是直接操作硬件
驱动?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • IT老混混 2015-11-09 13:46
    已采纳

    双缓冲我会,比你这代码简单,5行代码就搞定,我是说那个主窗口每次绘制的时候都要先画背景,然后再画我贴的图中间就会闪一下,不过我已经解决了
    就是挡住WM_ERASEBKGND这个消息;
    case WM_ERASEBKGND:
    return 0;这样就不会画背景了

    已采纳该答案
    打赏 评论
  • wunaidepao 2015-11-06 08:09

    弄个双缓冲就可以了,百度百度

    打赏 评论
  • ysuwood 2015-11-08 15:54
     void CTestDlg::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
        {
        //-------------------------------------------------------------------------
            rsDrawPileBox();
    
        //-------------------------------------------------------------------------
    
            CDialogEx::OnPaint();
        }
    
    }
     void CTestDlg::rsDrawPileBox()
    {   //双缓冲
        CPaintDC dc(this);
        CRect rectClient;
        GetClientRect(&rectClient);
        CDC dcMem;
        CBitmap bmpMem;
    
        dcMem.CreateCompatibleDC(&dc);
        bmpMem.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height());
        dcMem.SelectObject(&bmpMem);
    //---------------------------------------------------------       
    //你的的绘图放这里,使用dcMem
    //dcMem.Rectangle( int(x), int(y), int(x+dx), int(y+dy) );
    
    //--------------------------------------------
        dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &dcMem, 0, 0, SRCCOPY);
        bmpMem.DeleteObject();
        dcMem.DeleteDC(); 
    }
    
    打赏 评论

相关推荐 更多相似问题