在Win32上如何开始使用Winforms风格的应用程序?

有一点背景:我主要是一名C ++程序员,但是我所做过的唯一的GUI工作就是.NET的WinForms平台。 我对Windows GUI编程完全陌生,尽pipePetzold出色的书,我感到非常困惑。

也就是说,大多数关于Win32入门的参考都是关于绘制线条,曲线和事物的 – 关于哪个(至less现在这个时候)我不在乎的话题。

我需要一个检查列表框,一个分离器和一个文本框 – 这些工作在Winforms域中需要不到10分钟的时间。 我build议使用WTL库,它提供了所有这三个控件的实现 – 但是我一直在简单的事情,例如让控制使用正确的字体 ,并获得高DPI工作正确 。 我已经花了两天时间了,我不禁想到这些东西比我所能find的更好。 Petzold的书很好,但从Windows 95开始就没有更新过,而且自从发行以来,应用程序应该如何正确开发,已经发生了很大的变化。

我想我正在寻找的是一本现代的Petzold书。 我在哪里可以find这样的资源,如果有的话?

首先,几乎没有任何文档(我可以找到)解释如何使用WTL。 这似乎是由专家为专家图书馆。

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

但是,不要从代码创建控件:本机Windows API对“WinForm”最接近的模拟是一个对话框。 对话框放在链接到您正在开发的EXE或DLL期间嵌入的资源文件中。 对话资源需要一个字体设置,自动应用于对话框上的所有控件,对话框按照对话框单位排列,而不是像素,允许它们相对于字体自动缩放,用户系统上的dpi设置。

如果您创建了一个对话框资源,并将其添加到一个简单的应用程序中,则只需点击确定按钮即可将对话框拖到屏幕上,而不需要更复杂。

#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); } 

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

我个人使用MFC。 其他的选择是有效的,但我真的不质疑使用任何类似的库。 尤其是当你遇到你所遇到的问题时。

你可以把它们放在对话框中,或者你在常规窗口中做一些不寻常的事情吗? 通常情况下,大多数控件是通过在对话框设计器上绘制它们而创建的。 不要弄乱所需的字体。

你能通过你想要做的事情和你遇到的问题吗?

Win32 API加重难以直接使用,所以不要。 大多数人使用一些GUI框架。 我试图给出我个人的意见更流行的选择:

  • WTL 。 它在Win32 API上太薄了一层,十年来一直没有更新。 如果您尝试使用简单的库存示例进行操作,您将很快面对Win32 API本身。 与竞争相比,奖金是非常快的。
  • MFC 。 由于VS 2008 SP1 MFC允许您制作相对现代的GUI。 如果你能忍受它奇怪的编码习惯和繁重的宏观使用,那么它是宜居的。 它由VS IDE支持,但比WinForms弱得多。
  • WxWidgets 。 最初觉得有点像MFC,另外便携。 在Python开始使用它之后,它变得更好了。
  • QT 。 它们是最灵活和最强大的。 不幸的是,它已经开始很久以前了,所以有一些遗留的奇怪。 它在地方很慢,并产生大的可执行文件。 最好的办法就是将它作为隔离的GUI层使用,而不是混合使用STL和提升到那个层。