【问题标题】:How to show a simple modeless Window from a native C DLL如何从本机 C DLL 显示简单的无模式窗口
【发布时间】:2012-01-12 10:08:31
【问题描述】:

我必须在本机 C DLL 中创建一个简单的提示符。 我从来不用 C 语言创建窗口,所以我不知道存在哪些可能性。

窗口应该包含一个文本框和一个按钮。当用户按下按钮时,我应该能够获得该文本框的值。显示时,窗口不应中断程序流程,它应该是无模式的。我必须能够从 DLL 中的代码关闭窗口。

我一直在考虑使用 MFC,直到我意识到它是用于 C++ 的。所以我想我可以编写一个包装器,然后像那样使用它,但显然必须重构项目的某些部分才能正常工作(比如更改入口点)。我对如何使用任何“GUI-Frameworks”有点困惑,但如果有一个简单的解决方案那就太好了。

解决方案应该尽可能简单。

编辑:

DLL 的用途...

我们有一个使用 SCC 接口的应用程序套件(我将称之为 IDE)。我们有一个 SVN 存储库,因此我们使用 PushOk 将查询从 IDE 转换为 SVN 命令。 PushOk 和 IDE 对 SCC 接口的定义并不总是一致的,因此 IDE 会因某些操作而崩溃。由于我们不拥有 PushOk 的源代码,因此我们编写了自己的代理 dll 来解决我们遇到的特定问题。

现在,PushOk 在指定修订时没有获取文件的选项(它可以,但在我们的案例中不起作用)。所以我们必须自己实现它。前面提到的窗口是可以输入修订版的窗口,然后我们会得到带有该修订版的文件。

【问题讨论】:

  • DLL 可能永远不应该显示用户界面。为什么不创建一个标准应用程序呢?
  • 在这种情况下,最好由 DLL 实现窗口。但是,我可以创建一个单独的应用程序,然后从 DLL 调用它,尽管我更喜欢不同的解决方案。
  • 更多关于你的“情况”的信息会很有帮助。我无法想象 DLL 应该显示 UI 的这种情况。
  • 您不应该使用 DLL 中的 GUI 框架,这会导致灾难。坚持使用普通的 win32 api(CreateDialog() 和朋友,一切都应该很好)。
  • @CodyGray:我注意到问题中的“情况”

标签: c windows winforms


【解决方案1】:

您不应该使用 DLL 中的 GUI 框架,这会导致灾难。坚持使用普通的 win32 api(CreateDialog() 和朋友,一切都应该很好)。

(该短语是从评论中复制的,所以我会详细说明)。

这个功能其实很好用:

  • 首先,您需要将 DIALOG 资源编译到您的 DLL 中。 VisualStudio 集成资源编辑器在这里会派上用场。

  • 然后写一个DLGPROC函数

.

BOOL CALLBACK MyDialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_INITDIALOG:
           /* ... */
        default:
            return FALSE;
    }
}
  • 然后在您导出的函数中调用,并保存句柄供以后使用:

.

 HWND hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(ID_MY_DIALOG), NULL);
  • 如果要销毁对话框,只需调用:

.

DestroyWindow(hWnd);

查找所有您想了解的有关 Win32 对话框(以及更多)here

【讨论】:

  • 我刚读到一个在处理对话框时应该使用 EndDialog() 而不是 destroyWindow()。
  • @R34lthing EndDialog() 用于模式对话框,使用DialogBox() 或类似方法运行,因为它处理本地消息循环的中断。如果你的对话框是无模式的,那么它应该用DestroyWindow() 作为一个普通的窗口来销毁。查找有关 Win32 对话框(以及更多)的所有信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2011-01-17
  • 2018-04-19
相关资源
最近更新 更多