【问题标题】:child window with rich edit controls not loading on menu item click inside main window具有丰富编辑控件的子窗口未加载到菜单项上单击主窗口内
【发布时间】:2013-06-04 14:17:34
【问题描述】:

我正在尝试在 win32 的主窗口中单击菜单项上实现聊天窗口。我创建了一个主窗口,并以下列方式处理聊天窗口:

    int CALLBACK TextChat::TextChatDlgProc(  HWND hwndDlg,  UINT uMsg,  WPARAM wParam, LPARAM lParam )
{
    LPDRAWITEMSTRUCT pdis;
    static HBRUSH hBrush;  
    static COLORREF GrayColor; 

    switch (uMsg) 
    {
        case WM_COMMAND:
            switch (LOWORD(wParam)) 
            {

            }
            break;
        case WM_CLOSE:
            EndDialog(hwndDlg, 1);
            return true;           
            break;





        case WM_INITDIALOG:
        {


            CentreWindow(hwndDlg);
            ShowWindow(hwndDlg,SW_SHOW);
            UpdateWindow(hwndDlg);
            return TRUE;

        }
    }   
    return 0;
}
int TextChat::DoDialog()
{

    //CreateWindowEx(


    return DialogBoxParam(this->m_pApp->m_instance,MAKEINTRESOURCE(IDD_CHAT_DIALOG), 
        NULL, (DLGPROC) TextChatDlgProc, (LONG) this->m_pCC);
}

从菜单项 clic 的主窗口中,我按照以下方式进行操作:

case WM_SYSCOMMAND:
        {
            switch (LOWORD(wParam))
            {
                case ID_TEXT_CHAT:
                    if(thisClass->m_pTextChat == NULL)
                        thisClass->m_pTextChat = new TextChat(thisClass->m_pApp,thisClass);
                    thisClass->m_pTextChat->DoDialog();

所以我使用的是 VS2008,在调试时,调试器进入 TextChatDlgProc 内部,但从未进入 WM_INITDIALOG 内部并像那样返回。因此,聊天窗口(资源 IDD_CHAT_DIALOG)永远不会显示。非常感谢任何解决此问题的指针。 TIA

问候, grv

【问题讨论】:

  • uMsg进入TextCharDlgProc时的值能看一下吗?
  • 无论如何,我的猜测是对话框的创建失败,要么是因为模板有些怪异,要么是因为它根本无法在指定的模块中找到。
  • @rodrigo:它从 48 开始,然后变化,但它永远不会进入 WM_INITDIALOG,我想知道我可能哪里出错了
  • @rodrigo :我想我已经找到了问题所在,这是因为我使用富编辑文本框作为聊天窗口内的对话区域。如果我取出丰富的编辑框,该对话框工作正常。有什么建议!!
  • 该问题具有误导性,因为该问题甚至在单击菜单之前就已发生。以后遇到相同问题的访问者将看不到此答案,因为标题与问题不匹配。

标签: c++ windows winapi visual-c++ mfc


【解决方案1】:

您在评论中说该对话框具有丰富的编辑控件。这才是关键!

在使用这些控件之前,您必须手动加载相关库。其中之一:

LoadLibrary(TEXT("Msftedit.dll")); // for MSFTEDIT_CLASS
LoadLibrary(TEXT("Riched32.dll")); // for RICHEDIT_CLASS 3.2
LoadLibrary(TEXT("Riched20.dll")); // for RICHEDIT_CLASS 2.0

您只需通过WinMain() 执行一次。

【讨论】:

    【解决方案2】:

    您的TextChatDlgProc() 需要unhandled messages 调用DefWindowProc()为未处理的消息返回 FALSE(默认值:switch case)

    【讨论】:

    • 这是DlgProc,而不是WndProc。对于未处理的消息,他应该只返回 FALSE0
    • 返回类型错误。它应该是 INT_PTR。否则在 64 位编译时会出现异常。
    • 问题出在富编辑控件上。无论如何,非常感谢您的建议。很有帮助!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2011-11-14
    • 2016-03-11
    相关资源
    最近更新 更多