qq_29720391 2023-08-29 20:06 采纳率: 50%
浏览 4
已结题

动态库利用主程序传递的窗口句柄创建子对话框

目标实现在一个单文档视图View里创建一个tabcontrol,然后在动态库中实现各种自定义界面,在view里调用动态库接口,并传递主程序窗口指针,
在动态库中如何使用主程序传递的窗口句柄来为其创建一个子对话框呢? 现在使用这个指针能够给主程序传递消息,但在cdialog::create(IDD_X,parentWindow)这一步崩溃

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-08-29 20:51
    关注

    引用 皆我百晓生 小程序回复内容作答:
    在动态库中使用主程序传递的窗口句柄创建子对话框,您可以按照以下步骤进行操作:

    1. 在主程序中,调用动态库接口时,将主程序窗口的句柄作为参数传递给动态库的函数。

    2. 在动态库中的函数内部,保存主程序传递的窗口句柄。

    3. 在动态库的函数内部,使用保存的窗口句柄创建子对话框。可以通过调用CDialog::Create()函数来实现。

    下面是一种可能的实现方式:

    // 在动态库的头文件中定义一个指向主窗口的指针变量
    CWnd* g_pParentWnd;
    
    // 在动态库的函数中保存主窗口的句柄
    void SetParentWindow(CWnd* pParentWnd)
    {
        g_pParentWnd = pParentWnd;
    }
    
    // 在动态库的函数中使用主程序传递的窗口句柄创建子对话框
    void CreateChildDialog()
    {
        CDialog dlg;
        dlg.Create(IDD_X, g_pParentWnd);
        // 其他对话框相关操作...
    }
    

    在主程序中调用动态库函数并传递窗口句柄:

    // 在主程序中调用动态库函数,并传递窗口句柄
    CWnd* pMainWnd = AfxGetMainWnd();
    SetParentWindow(pMainWnd);
    CreateChildDialog();
    

    请注意,确保主程序的窗口句柄在动态库中有效。如果在调用cdialog::create(IDD_X, parentWindow)时出现崩溃,可能是因为窗口句柄无效或者资源ID为IDD_X的对话框资源不存在。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月6日
  • 创建了问题 8月29日