【问题标题】:How does one gets started with Winforms style applications on Win32?如何开始在 Win32 上使用 Winforms 风格的应用程序?
【发布时间】:2011-06-02 10:02:49
【问题描述】:

一些背景知识:我主要是一名 C++ 程序员,但我做过的唯一 GUI 工作是在 .NET 的 WinForms 平台之上。我对 Windows GUI 编程完全陌生,尽管 Petzold 的书很棒,但我还是非常困惑。

也就是说,似乎大多数关于 Win32 入门的参考资料都是关于绘制直线、曲线和事物的——这是我(至少目前)不在乎的话题。

我需要一个选中的列表框、一个拆分器和一个文本框——这些东西在 Winforms 领域不到 10 分钟就可以完成。有人建议我使用 WTL 库,它提供了所有这三个控件的实现——但我一直对简单的事情感到困惑,例如 getting the controls to use the right fontgetting High DPI working correctly。我在这上面花了两天时间,我不禁认为对于这类事情,必须有比我能找到的更好的参考。 Petzold 的书很好,但自 Windows 95 天以来就没有更新过,而且 w.r.t 发生了很多变化。自发布以来应如何正确开发应用程序。

我想我要找的是现代 Petzold 书。如果有的话,我在哪里可以找到这样的资源?

【问题讨论】:

  • +1 我不止一次地想知道同样的事情,当然也感受到了你的挫败感。 MFC 似乎是最好的解决方案,但它并不完全是一个全新应用程序的现代解决方案。
  • 当我开始编写 Win32 GUI(用 C 语言)时,我的想法与您的想法完全一致。我无法让字体工作,并且当我调整窗口大小时控件闪烁等等。通常它们是由非常细微的错误或误解的 Win32 习惯用法造成的。
  • @mr calendar:不幸的是,这不是一个选项。

标签: c++ windows user-interface


【解决方案1】:

首先,几乎没有文档(我能找到)解释如何使用 WTL。它似乎是专家图书馆,专家图书馆。

然后您的选择是:使用 MFC 应用程序向导创建应用程序,或采用 Win32 API 路线。 Win32 API 本身是 C API,MFC 是 C Win32 API 的 C++ 包装器,并添加了文档视图应用程序模型。

但是,不是从代码创建控件:本机 Windows API 与“WinForm”最接近的模拟是对话框。对话框布置在资源文件中,这些资源文件是在链接到您正在开发的 EXE 或 DLL 期间嵌入的。对话框资源采用自动应用于对话框上所有控件的字体设置,并且对话框按照对话框单位而非像素进行布局,允许它们相对于字体自动缩放,以及用户系统上的 dpi 设置.

如果您创建一个对话框资源,并将其添加到一个简单的应用程序中,它不需要看起来比这更复杂,就可以将对话框显示在屏幕上,并在单击 OK 按钮时关闭。

#include <windows.h>
#include "resource.h"

BOOL CALLBACK MyDialogProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
  switch(uMsg){
  case WM_INITDIALOG:
    return TRUE;
  case WM_COMMAND:
    switch(LOWORD(wParam){
    case IDOK:
      EndDialog(hwnd,wParam);
    }
    return TRUE;
  }
  return FALSE;
}

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hNull,LPCTSTR strCmdLine,int nCmdShow)
{
  return DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,&DialogProc,0l);
}

【讨论】:

  • +1。 Win32 对话框最接近于其他框架和 IDE 提供的“WinForms”或“Visual”风格的编程。在 Visual Studio 中的普通(非 mfc)C++ 项目中按您希望的方式布局对话框并将其保存到 RC 文件中。使用 Chris 上面提供的代码编译 RC 文件。您可能还想 #include 并调用 InitCommonControls();在调用上面的 DialogBoxParam 之前。这样,您就可以使用资源编辑器提供的 Trackbar 和其他一些高级控件。
【解决方案2】:

肯定有更好的方法。对于初学者来说,今天的 Windows 应用程序有望具有一些复杂而酷炫的功能。如果您打算从头开始实施所有这些,您将花费大量时间在您的项目上。

就个人而言,我使用 MFC。其他选择是有效的,但我真的会质疑根本不使用任何类似的库。 尤其是当您遇到您所遇到的问题类型时。

您可以将它们放在对话框中,还是在常规窗口中做一些不寻常的事情?通常,大多数控件是通过将它们放在对话框设计器上来创建的。不需要弄乱所需的字体。

您能否逐步了解您正在尝试做的事情以及您遇到的问题?

【讨论】:

  • 对话框不能有拆分器控件或选中的列表框控件。由于二进制大小的原因,我真的不想使用 MFC(MFC 库是我的程序的十倍)
  • 对话框只不过是带有特殊窗口类的POPUP窗口。可以在其上放置任何子控件。
  • 好吧,当然你可以在对话框中添加一个分隔符,尽管这样做可能没有意义。我不在我的开发计算机上,无法轻松检查我是如何做到这一点的。基本上,我相信我得到了一种常用的 GUI 字体并在控件上使用 setfont。你试过吗?请注意,对话框使用对话框单元,可针对不同的分辨率进行调整。在普通窗口中,默认值为像素。这可能会给您带来一些额外的工作。
  • @Billy:拆分器控件不存在,因此您必须在 CodeProject 或其他地方找到一个。至于选中的列表框 - 只需使用带有复选框的列表视图(LVS_EX_CHECKBOXES)。
  • MFC 程序员不喜欢 MFC ;-) 这只是效率问题。您需要 Win32 API 上的 C++ 包装类,您需要随时可用的控件实现。 MFC的杀手锏就是网上有很多参考资料和免费源代码。
【解决方案3】:

Win32 API 很难直接使用,所以不要。大多数人使用一些 GUI 框架。我尝试就更受欢迎的选择发表个人意见:

  • WTL。它在 Win32 API 上有点太薄了,并且有 十年没有更新太多。 你很快就会面对 Win32 API 本身 如果你尝试做某事就足够了 上面有简单的股票例子。奖金 是它非常快 与竞争相比。
  • MFC。 由于 VS 2008 SP1 MFC 允许您 使看起来比较现代 图形用户界面。如果你能忍受它的奇怪 编码约定和繁重的宏 使用那么它是宜居的。它受 VS IDE 支持,但远比 WinForms 弱。
  • WxWidgets。最初感觉有点像 额外制作的MFC 便携的。它变得好多了 在人们开始使用它之后 在 Python 中也是如此。
  • QT。这是最 他们灵活而强大。 不幸的是它已经开始很久了 前段时间也有一些遗产 其中的陌生感。它很慢 放置并生成大型可执行文件。 最好是使用它作为隔离良好 GUI层和不要混合大量使用 STL 并提升到该层。

【讨论】:

  • +1:Win32 API 极度缺乏 GUI 开发的基础知识。没有布局工具、不知道其首选大小的控件、缺少一些常用控件(拆分器?列表树视图?)——仅举几例——所有这些都导致程序员体验不佳。遗憾的是,MS 并未将这些添加到核心 API 本身,而是添加到它之上的层(例如 .Net)。我唯一要添加到该列表中的是 GTK+。 (尽管人们通常将它与 Linux 联系起来,但 Pidgin 和 GIMP 都是出色的 Windows GTK 应用程序。)
  • @Thanatos:作为一个整体的 Windows API 并不是一个 GUI 工具包。它旨在成为操作系统的一个相对低级的应用程序编程接口,提供文件处理、用户界面原语、线程原语等非常基础的内容。当然,您必须使用框架来处理任何重要的事情。
  • 本来打算用wxWidgets的,结果HUGE binaries :(
  • 二进制文件的大小在 WTL 中最小,然后在 MFC 中。 QT、WxWidgets 甚至 GTK+ 制作更大的二进制文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多