在Dialogbox后我调用下面的回调函数,在WM_ERASEBKGND中修改对话框背景色,在WM_CTLCOLOR中修改check box的背景色;运行界面,在控件之间切换时造成闪烁;如果我只响应WM_ERASEBKGND那么背景色改变,控件是默认的灰色,这时控件切换就不闪烁;如果两个消息都响应就造成控件闪烁;刚试了下在初始化中修改颜色,好像不行!我也试过计算除控件之外的空白区域,刷新的时候只刷新需要刷新的部分,但是还是不行,不知道怎么回事!
LRESULT CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam, LPARAM lParam)
{ switch (message)
{
case WM_INITDIALOG:
{
}
return true;
case WM_TIMER:
{
}
break;
case WM_COMMAND:
{
}
break;
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC)wParam;
SetBkColor(hdc,BK_BRUSH);
SetTextColor(hdc,TEXT_BRUSH); return (int)g_hBgBrush;
}
case WM_ERASEBKGND:
{
HDC hdc = (HDC)wParam;
RECT rectClient;
GetClipBox(hdc,&rectClient) ;
FillRect(hdc,&rectClient, g_hBgBrush);

return true;
}
case WM_DESTROY:
KillTimer(hDlg,1);
PostQuitMessage(0);
            break;
case WM_CLOSE:
DestroyWindow(hDlg);
            break;

}
return false;
}
十分感谢!

解决方案 »

  1.   

    就是通过TAB键切换焦点,选择控件进行响应操作;
    自制键盘和鼠标信息是通过COM3口获得
      

  2.   

    我遇到过类似问题,解决方法是:操作前使对话框失去焦点,操作后恢复焦点,就不闪烁了。
    楼主可试一下。
    SetFocus
      

  3.   

    WM_ERASEBKGND不放在回调函数内处理,用另外一个DC绘制,看效果如何?
      

  4.   

    因为设计很多子对话框,用内存绘图应该不是很好得选择。我试过计算刷新区域,但是视乎也行不同。
    但是采用触摸得方式操作界面就没问题,只是通过自制键盘和鼠标操作得时候出现闪烁。(所有界面没有使用到MFC类)4楼得能否说详细点,焦急等待!
      

  5.   

    SetFocus(hwndEditOut);  //焦点设置为其他窗口
    ... ...  //进行你的操作
    SetFocus(hWnd);  //焦点设置为当前窗口我这样做时,效果不错,没有闪烁了,不知你的如何?
      

  6.   

    C/C++ code
    SetFocus(hwndEditOut);  //焦点设置为其他窗口
    ... ...  //进行你的操作
    SetFocus(hWnd);  //焦点设置为当前窗口根据你的意思,我把焦点在WM_INITDIALOG中通过某一子对话框句柄来设置,然后在WM_COMMAND中在把焦点设置到当前窗口,然后创建一个子对话框,不知道这样是不是你的意思?如何是,好像没效果,如果不是还请帮我更正下,这个问题把我弄得思维都短路了,一上班就想到这问题。
      

  7.   

    SetFocus(hwndEditOut);  //焦点设置为其他窗口 
    应该放在WM_COMMAND开始的地方,SetFocus(hWnd);  //焦点设置为当前窗口 
    应该放在WM_COMMAND结束的地方.
      

  8.   

    SetFocus(hwndEditOut);  //焦点设置为其他窗口 
    应该放在WM_COMMAND开始的地方, SetFocus(hWnd);  //焦点设置为当前窗口 
    应该放在WM_COMMAND结束的地方.
      

  9.   

    C/C++ code 
    SetFocus(hwndEditOut);  //焦点设置为其他窗口 (WM_COMMAND起始位置)
    ... ...  //进行你的操作 
    SetFocus(hWnd);  //焦点设置为当前窗口 (WM_COMMAND结尾位置)这样设置后,没能解决闪烁的问题,有没有其他解决方法?或者我那样响应消息是在哪造成的闪烁.
    Thank you!
      

  10.   

    用触摸的方式操作界面的时候,焦点也在不停改变,但是界面没有出现闪烁的情况。只有用TAB键切换焦点的时候会造成界面的闪烁!如果我屏蔽掉WM_CTLCOLORSTATIC,使用系统默认色来设置check按钮,在切换的时候界面就不会闪烁。
      

  11.   

    设置对话框WS_CLIPCHILDREN属性可以一试,不过不知道具体代码,闪烁原因实在难说。
      

  12.   

    基本就是调用dialogbox创建对话框,然后调用相应的回调函数处理消息!我认为是我对界面不熟,所以造成对界面背景色及控件颜色的修改没完善造成的。
      

  13.   

    对话框与对话框之间没有存在明显的父子关系,只是在消息相应中,不同的消息响应不同的对话框(dialogbox).
      

  14.   


    建议独立处理开,各自对话框用不同的DC绘制。
    目前你是靠回调函数传入一个公用的hDC句柄去绘制的,
    所以很可能这个就是在切换的时候产生闪烁的原因。
    你再看看,有没有可能有资源泄露,每次创建DC后是否有创建后完整地消毁资源?
      

  15.   

    楼上能否详细说下如何使用在DIALOGBOX创建对话框过程中用不同的DC
      

  16.   

    每个对话框都继承于CDialog
    成为一个独立的窗体类,
    然后重载内的WM_ERASEBKGND不要放在回调函数内使用。
      

  17.   

    问题是我没有使用MFC类,完全是用DIALOGBOX来创建对话框,通过消息循环来不断向消息队列你添加消息,在回调函数里对消息就行处理。没有涉及到XXXDialog::CDialog,是一个WIN32程序,里面很多是WINAPI。
      

  18.   

    就是通过TAB键切换焦点,选择控件进行响应操作; 
    自制键盘和鼠标信息是通过COM3口获得