不知道是什么原因,上次发的帖子“MFC制作的界面运行的时候如果不处于选中状态就会变成白色 ???”打不开,总是出现错误,而且打开我发帖的列表也没有看到这个帖子,未结的帖子里也没有这个帖子,不知道什么问题
所以只有再次求教次问题了我做了一个mfc对话框,点击按钮运行,在运行过程中,如果进行了其它的操作,再让此对话框处于被选中状态的时候,就看不到按钮了,是白色的一片,什么都没有,也不能点击,等程序运行完毕,就又可以看到对话框的界面了。请问,这是什么问题啊?该如何让它像别的程序那样在运行过程中不变成白色的呢?
这是运行前的对话框这是运行时的对话框请高手指教,多谢!

解决方案 »

  1.   

    多线程处理或者在处理程序中加PeekMessage
      

  2.   

    原因很简单,咱们说windows就是一个while循环,里面执行了所有的用户交互UI操作
    你的程序的绘制,就是一次while
    你的按钮按下也是一次,
    当你的按钮按下这一次处理的太久了,那么界面的绘制,就没有机会处理了(要推迟排队)
    所以你的界面没人画了,白了呗解决方法:如果按钮里面的操作要很久(就是会阻塞),那么把这个操作整理一下,丢给线程,保证主线程畅通
      

  3.   

    AfxBeginThread()创建线程,把对话框的窗口句柄作为线程的参数传递进入,在线程中计算,最后发送消息给对话框窗口,通知该对话框去更新控件
    例如:在Button的响应函数中,创建线程
    void CXXDlg::OnButtonClick()
    {
     AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());
    }UINT __cdecl ThreadProc(LPVOID lParam)
    {
     HWND hWnd = (HWND)lParam;
     ...
     // 计算
     ... //计算完成以后发送自定义的消息给对话框,通知该对话框去更新
     ::SendMessage(hWnd, UM_MSG, ..., ...);
     return 0;
    }afx_msg LRESULT OnMsg(WPARAM wParam, LPARAM lParam);
    #define UM_MSG WM_USER+111BEGIN_MESSAGE_MAP(CXXDlg, CDialog)
    ...
    UM_MESSAGE(UM_MSG, OnMsg)
    END_MESSAGE_MAP()LRESULT CXXDlg::OnMsg(WPARAM wParam, LPARAM lParam)
    {
     // 更新控件
     return 0;
    }
      

  4.   


    不好意思,我没有编过消息传递的东西,所以,一些地方看不懂,麻烦再解释一些阿
    //这是函数的声明吗?跟定义其他函数的方法是不是一样的?
    afx_msg LRESULT OnMsg(WPARAM wParam, LPARAM lParam);//这个宏是什么意思?
    #define UM_MSG WM_USER+111//下面的代码是什么意思?
    BEGIN_MESSAGE_MAP(CXXDlg, CDialog)
    ...
    UM_MESSAGE(UM_MSG, OnMsg)
    END_MESSAGE_MAP()谢谢,不胜感激!!!
      

  5.   

    这些代码动作有就是实现了一个自定义消息
    如果不懂你可以参考一些相关资料
    例如http://wenku.baidu.com/view/62beb7360b4c2e3f572763a4.html