以前也问个,但没有满意答案我用的是 vs2008 新建一个CDialog project 然后在OnPaint里面画一张图片(Bmp Jpeg Png),做为程序客户区的背景程序界面大小为 600*750,有兴趣的可以试下已经使用了双缓冲了,请不要直接回答使用双缓冲,如果你使用双缓冲解决了此问题,可以把你的代码分享下吗
然后程序运行 用别的程序,在我的程序界面上面晃动的时候,我的程序界面会花掉如果在OnPaint里面我用 GetDC 得到的cdc去画图,可以解决上面的问题但是新问题出来了..所有控件不能正常显示,鼠标放在控件区域,才显示,移开又看不到了.相关代码如下 CPaintDC dc(this);
CDC* pDC=GetDC();
Graphics g(dc.m_hDC);//用这个,就出现我说的,程序界面花掉
Graphics g(pDC->m_hDC);//用这个呢,就出现控件不能正常显示
g.DrawImage(m_bkJpeg,0,m_Pic_top.GetImageSize().cy+m_Pic_Button.GetImageSize().cy);
ReleaseDC(pDC);

解决方案 »

  1.   


    class CTestDlg : public CDialog
    {
    // 构造
    public:
    CTestDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
    enum { IDD = IDD_TEST_DIALOG }; protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
    // 实现
    protected:
    HICON m_hIcon;
    CBitmap m_bmpBack; // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    };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
    {
    CPaintDC dc(this);
    CDC MemDC;
    BITMAP bm;
    CRect rect; MemDC.CreateCompatibleDC(&dc);
    MemDC.SelectObject(&m_bmpBack);  // m_bmpBack在OnInitDialog时Load。
    GetClientRect(&rect);
    m_bmpBack.GetBitmap(&bm);
    dc.SetStretchBltMode(COLORONCOLOR);
    dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    MemDC.DeleteDC();
    }
    }BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
    {
    return TRUE; // 防止闪烁。
    }新建的工程,没有动任何其它代码。测试通过,没有任何问题(包括闪烁、花掉、控件被遮盖之类)。
      

  2.   

    从你说的内容来看,你的绘图应该只是在DIALOG的某个区域进行绘图,
    这样的绘图建议你在要进行绘图的区域放一个STATIC,
    再从CSTATIC类继承一个新类,在这个新类中的ONPAINT进行绘图,
    应该会好一些。
      

  3.   

    又开了一帖?在上一个帖子中已经回了,我用GDI做没有任何问题,另外,在OnPaint中当然应该用CPaintDC了。
      

  4.   

    用PaintDC的话,你只能每次画无效的区域
    比如:OnPaint时无效区域是{a,b,c,d},那么你应该把BMP的{a,b,c,d}画到Dialog的{a,b,c,d}上去
      

  5.   

    谢谢各位,我等会结贴,红猪,我看了你的帖子了,那个CDialog::OnPaint(); 这个一定要注释掉暂时还不清楚为什么要清楚注释掉,至于注释掉会出什么问题,暂时也没有发现画bmp图片的时候,不会那么明显的,但是CDialog::OnPaint(); 不注释掉,现象还是会出来,要多试,从不同方位进入你的程序界面晃动..刚才很试了会,发现 CDialog::OnPaint(); 去掉,就没那问题了,谢谢各位非常感谢
      

  6.   

    SetWindowLong GWL_STYLE WS_CLIPCHILDREN 试试
      

  7.   

    偷偷的告诉LZ一下,你的那个绘图的操作应该放在WM_ERASEBKGND消息响应函数里的,你可不要再告诉别人了哟,要是被我们BOSS知道了我就惨了,因为在我们这里就只有BOSS和我知道这个小秘密的哟,LZ千万不要再告诉别人了啊
      

  8.   

    OnPaint() 会自动刷新整个客户区。对view试图有用。对dialog不要为好.
      

  9.   


    BOOL CdddsdsdswDlg::OnEraseBkgnd(CDC* pDC)
    {
        // CDialog::OnEraseBkgnd(pDC);    // TODO: 在此添加消息处理程序代码和/或调用默认值
         RECT rc;
        GetClientRect(&rc);    pDC->FillSolidRect(&rc, RGB(200, 210, 180));    return TRUE;
    }