一个小问题本来是想通过调用一个全局函数给一个rich edit控件动态赋直的.下面是我在全局函数里面的代码
 CRichEditCtrl* RR=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT1);
RR->SetSel(RR->GetTextLength(),RR->GetTextLength());
RR->ReplaceSel("str");提示GetDlgItem函数少一个参数,即需要当前对话框的句柄.我不知道怎么获得,但是来了一个星期了,也没有人能真正告诉我怎么获得,
都是一些作用域错误的脚本给我看,
难道真没人知道吗?我是初学者,但是大家回答问题也太没耐心了啊,都是编译通不过的代码,跪求真知者

解决方案 »

  1.   

    hDlgHandle = (CYourDlg*)GetDlgItem(IDC_THEDLGID)->GetSafeHwnd();这是别人给的一句代码,可是出了同样的问题GetDlgItem()同样少参数,少当前窗口的句柄,而那正是我需要的,谁能告诉我啊.还有人给出this->m_hWnd,可是我是在全局函数里面,根本没有this指针.
    请大家指点我
      

  2.   

    想办法得到对话框对象的指针。可以用一个全局变量。
    比如你的对话框类叫  CMyDialog
    定义一个全局的 CMyDialog *g_pDlg ; 
    把你的“唯一的”对话框的地址赋值给 g_pDlg ; g_pDlg->m_hWnd 就是句柄。
      

  3.   

    把你的“唯一的”对话框的地址赋值给 g_pDlg ; 
    这句话正是我想要的啊,
    请问怎么表达啊
      

  4.   

    需要提醒的是:尽量少用全局变量和全局函数。CRichEditCtrl* RR=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(),RR->GetTextLength());
    RR->ReplaceSel("str");虽然功能可以实现,但总是感觉这种代码很别扭。最好不要让外面直接访问对话框中的控件,可以给对话框添加一个 SetRichEditText 方法
    通过这个方法动态改变控件的文本。
      

  5.   

    得到具体的对话框handle 视具体的情况例如:基于mfc的对话框应用程序,可以这样得到:
    AfxGetapp()-〉m_pMainWnd为对话框的指针我建议在你的全局函数的参数中传递一个对话框指针:
    myfunc(cdialog *pdia)
      

  6.   

    你的 CMyDialog 类型的变量(就是那个对话框)在哪里?总要有个地方定义吧。
    全局变量在当前工程中所有地方都可用。
    在任意一个 cpp 文件中(当然要选个合适的地方)定义 CMyDialog *g_pDlg = 0 ; 
                        // 定义,并赋初值 0 。定义变量的同时赋初值是个好习惯 :)在想要用的地方声明一下     // 比如你的“唯一的”对话框定义的地方
    extern CMyDialog *g_pDlg ; // 这样就可以用了
      

  7.   

    wangwwq(不开窍) : CRichEditCtrl* RR=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(),RR->GetTextLength());
    RR->ReplaceSel("str");我是说这种代码,就算是正确的,功能可以实现,也不好。
    在一个类的外面控制一个类里面的控件不是什么好习惯。实在不行的话,你干脆把所有代码都贴出来吧……
    这样反倒省事。
      

  8.   

    你对 C++ 和 windows 程序设计都不了解,应该好好补一下。
      

  9.   

    建议传对话框指针:
    void yourfunc(CYourDlg *pDlg)
    {
     ;
    }
      

  10.   

    你的 CMyDialog 类型的变量(就是那个对话框)在哪里?这些都是资源文件里定义的吧,上午有人告诉我了,我程序里没有的,
    定义 CMyDialog *g_pDlg = 0 ; 
                        // 定义,并赋初值 0 。定义变量的同时赋初值是个好习惯 :)在想要用的地方声明一下     // 比如你的“唯一的”对话框定义的地方
    extern CMyDialog *g_pDlg ; // 这样就可以用了
    另外这句话,还是没有获得当前对话框的句柄啊,因为你只是初试化指向NULL了吧(指针好象不能副0),大哥,你也是一知半解啊, 不过还是谢谢你,
    那些高手虽厉害,可是一点也不热心,也不负责啊, 浅点两句,搞得我这里火烧眉毛啊
      

  11.   

    建议传对话框指针:
    void yourfunc(CYourDlg *pDlg)
    {
     ;
    }这个方法我也想过了,但是我的全局函数  是又动态连接库函数回调的,没法加参数,否则格式不对啊
      

  12.   

    全局函数里面的代码
     CRichEditCtrl* RR=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(),RR->GetTextLength());
    RR->ReplaceSel("str");你在全局函数中用上面的代码,肯定通不过的!
    GetDlgItem()是窗口函数,要么在窗口类或其字类中使用,要么要指定窗口句柄。CTestWndDlg* pDlg = (CTestWndDlg*)AfxGetMainWnd();
    CRichEditCtrl* RR = (CRichEditCtrl*)pDlg->GetDlgItem(IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(), RR->GetTextLength());
    RR->ReplaceSel("str");
      

  13.   

    NULL 就是 0 。 哈哈,既然有对话框,不可能没有对话框对象。如果是基于对话框的程序,你的类视图里面应该有一个 ****App,里面有一个 InitInstance函数,里面应该有类似下面的代码 :BOOL CEditApp::InitInstance()
    {
    // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need. CMyDialog dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    // TODO: Place code here to handle when the dialog is
    //  dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: Place code here to handle when the dialog is
    //  dismissed with Cancel
    } // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return FALSE;
    }
      

  14.   

    再定义一个全局的HWND g_myhwnd = NULL;
    在你的对话框的OnInitDialog中,对g_myhwnd赋值:g_myhwnd = this->m_hwnd;
    在你的全局函数中加入:
    if (g_myhwnd != NULL)
    {
    CRichEditCtrl* RR=(CRichEditCtrl*)GetDlgItem(g_myhwnd, IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(),RR->GetTextLength());
    RR->ReplaceSel("str");
    }
      

  15.   

    唉!如果你的对话框为主窗口, 可以这样做
    CXXXDlg *pDlg = (CXXXDlg *)AfxGetMainWnd();
    pDlg->GetDlgItem();如果你的对话框不是主窗口, 只是弹出的另一窗口
    那 AfxGetMainWnd()失效, 你必须将它的指针另外储存起来
    全局变量就是一种方法
      

  16.   


    xxhfortrue(红叶)  说的应该可以了吧 !
    在你的对话框的OnInitDialog中,对g_myhwnd赋值:g_myhwnd = this->m_hwnd;
      

  17.   

    哥哥门,刚刚上不了网,一上来这么多惊喜,其实我知道csdn上强人很多,无法而出此下策.容我先去解决问题后再来道谢,我真是惭愧的无地自容了,
      

  18.   

    红叶大哥 和 快乐 机器大哥 去找我的帖子领分, 我在界面类里有个 rich edit 的问题,和基础类里也有个rich edit 问题未结  都是50分的,真的很感谢你们,困绕我n天了
      

  19.   

    CTestWndDlg* pDlg = (CTestWndDlg*)AfxGetMainWnd();
    CRichEditCtrl* RR = (CRichEditCtrl*)pDlg->GetDlgItem(IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(), RR->GetTextLength());
    RR->ReplaceSel("str");
    这段代码也是对的,我刚刚差点写对了,我写成
    CTestWndDlg* pDlg = (CTestWndDlg*)AfxGetMainWnd();
    CRichEditCtrl* RR = (CRichEditCtrl*)GetDlgItem(pDlg->GetSafeWnd(),IDC_RICHEDIT1);
    RR->SetSel(RR->GetTextLength(), RR->GetTextLength());
    RR->ReplaceSel("str");另外我想请教一下rich edit里面的内容动态现实有没有什么注意事项,比如说对话框需不需要domodule一下