目的:
提供颜色选择选项,添加了一个button按钮,在按钮旁边放了一个edit box,点击按钮后,弹出ccolordialog,将选择的颜色以编辑框背景色的形式显示出来。
该怎么显示?是在MFC的ACtivex控件中做。还有没有更好的显示方法?谢谢。还有一个有关刷新的问题:
对话框上添加了一个picture控件,加载图片后,在picture上画线,或矩形其它的等,鼠标移动时重画,要求动态更新。采用的刷新方法是在OnMouseMove()函数中:
(1)InvalidateRect(前一次画的矩形)
(2)InvalidateRect(本次画的矩形),并将本次的矩形保存为前一次的矩形变量,供下一次用。结果,在刷新的上面一小块,或者下边一小块,会闪。请问这是怎么回事?有什么办法解决吗?
InvalidateRect()函数只能是对话框调用吗?m_picture.Invalidate()或者m_picture.InvalidateRect(),不灵,不会刷新图片。
能帮我解释一下吗?谢谢。

解决方案 »

  1.   

    1、添加函数WM_CTLCOLOR
    HBRUSH CTestHScrollDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here if (pWnd->GetDlgCtrlID()==IDC_EDIT2) //IDC_EDIT2换成你的编辑框ID
    {
    pDC->SetBkColor(RGB(0,255,255)); //RGB(0,255,255)换成ccolordialog中你选中的颜色
    HBRUSH B=CreateSolidBrush(RGB(0,255,255)); 
                    //RGB(0,255,255)换成ccolordialog中你中的颜色
    return B;
    }
    return hbr;
    }2、画图防止闪烁时用双缓冲吧。
      

  2.   

    去看我的blog。里面有关于CEdit背景自绘的详细步骤及注意事项。
      

  3.   

    这个用到3个函数:
    CColorDlg的GetColor
    CDC的SetBkColor,
    CEdit的Invilate。
      

  4.   

    1.OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 在你的ccolordialog中把选定的RGB值接收过来,然后pDC->SetBkColor(RGB(R,G,B)
    大概就是这样了。 2.不闪屏的条件: 
        a.   你不能让   WM_ERASEBACKGROUND   动作 
        b.   WM_PAINT   时,   要有内存镜象直接BitBlt 
    也就是视觉上不存在顿时的画面清除 而所有   Windows   Common   Control   都没有做到这两点
      

  5.   

    对于第2个问题
    有2个简单的方法: 
    1.   Invalidate(FALSE); 
    2.   计算出要重画的区域,形成一个RECT,然后调用InvalidateRect(&rect); 
      

  6.   

    (1)第一个问题解决了,非常感谢各位。但没明白OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
    这个函数的具体意思。什么时候触发这个函数。pDC pWnd代表什么意思,能解释一下么?(2)第二个问题,我明白各位的意思,我也一直是这么做的,但还是有点闪。重绘区域有点闪。
    InvalidateRect(&rect)
    能否控制OnEraseBkgnd()函数,不刷新图片区域?