我在 OnInitDialog 里 调用 SetDlgItemText  给编辑框 赋初值 时没问题。。 但是在 程序运行时。  我在 其它函数里调用 SetDlgItemText  时,, 在 SetDlgItemText  里卡住 不动了。 不知道原因 。 很久没用MFC了。。 请求大家帮助。

解决方案 »

  1.   

    再说一下。我是这样做的。 我定义了一个全局变量HWND   g_hDlg;在 OnInitDialog 里让 g_hDlg = m_hWnd然后我定义了一个全局函数。 
    void AccountResCallBack(GSBsipAccountResDef *pRes)
    {
         SetDlgItemText( g_hDlg, RESULT, "aaa");
    }
    在这个全局函数里调用  SetDlgItemText,, 调用 方法如上。 但是 在 SetDlgItemText处程序 卡住 了。谁知道为什么。。
      

  2.   

    你是不是在非类成员函数里调用了类的成员?即SetDlgItemText所在函数不是对话框类的成员函数。你可以把此函数改成类成员函数。
      

  3.   

    AccountResCallBack是非类成员函数
      

  4.   

    是非类成员 函数 。 可是我 得到 对话框的句柄然后 调用 也不可以吗?AccountResCallBack是回调函数。不能改成 成员函数
        请问在 非成都函数 如果 调用 SetDlgItemText
      

  5.   

    楼主,非成员函数,用全局的 SetDlgItemText ,第二个参数写 对应控件的 ID 号,你的 RESULT 有写对吗?如果RESULT 是对应控件ID号的话, 你整个代码都是对的, 你所说的卡住,是什么情况?死机?
      

  6.   


    RESULT 就是我的赋值 的  编辑框的ID。我确定我写对了。我说的卡住 不是死机。 是单步调试执行到  SetDlgItemText的时候, 按 F10执行下一步操作不动了。
      

  7.   

    按照你上面说的话,应该不会有问题的贴一下你怎么调用的AccountResCallBack函数的
      

  8.   

    GSCallbackFuncDef callbackFun;
    memset(&callbackFun, 0, sizeof(GSCallbackFuncDef));
    callbackFun.CallbackAuthorRes = AuthorResCallBack;AuthorResCallBack是回调函数
      

  9.   

    另外我用 线程 函数调用 也是 出现同样的问题。DWORD WINAPI CROTestDlg::SendWorkerThread(LPVOID lpParameter)
    {
    CROTestDlg *pThis = (CROTestDlg *)lpParameter; while(true)
    {
    if ( finish)
    {
    pThis->SetDlgItemInt( RESULT,res);
    finish = false;
    }
    Sleep(1000);
    } return 1;
    }
      

  10.   

    楼主,我运行过你的程序.void CDlgTestDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CreateThread(0,0,SendWorkerThread,(LPVOID)this,0,0);
    }BOOL finish = 1;DWORD WINAPI CDlgTestDlg::SendWorkerThread(LPVOID lpParameter)
    {
        CDlgTestDlg *pThis = (CDlgTestDlg *)lpParameter;

        while(true)
        {
            if(finish)
            {
                pThis->SetDlgItemInt(IDC_EDIT_SET,10);
                finish = false;            
            }
            Sleep(1000);
        }
        return 1;
    }
    没有你所说的情况出现喔.会不会是你的其他代码有影响啊?
    要不要发个工程来大家研究一下?
      

  11.   

    SetDlgItemInt 其实是通过消息SendMessage来设置文体
    不同线程发送消息时会用到消息队列
    如果主界面的线程阻塞的时候(如waitfor..., 循环...)SetDlgItem就会卡死主线程阻塞的时候消息队列就没办法处理, SendMessage会等待到消息处理完毕才返回
      

  12.   

    14楼说得很有道理.我试了一下这样的代码.
    出现了楼主所说的卡住的现象.void CDlgTestDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CreateThread(0,0,SendWorkerThread,(LPVOID)this,0,0);
    while(1);// 加上这个,阻死窗口主线程.
    }BOOL finish = 1;DWORD WINAPI CDlgTestDlg::SendWorkerThread(LPVOID lpParameter)
    {
        CDlgTestDlg *pThis = (CDlgTestDlg *)lpParameter;

        while(true)
        {
            if(finish)
            {
                pThis->SetDlgItemInt(IDC_EDIT_SET,10);//这里就卡住响应不了了.
                finish = false;            
            }
            Sleep(1000);
        }
        return 1;
    }