Win32 GUI程序中的布局
Layout in Win32 GUI program
我有一个关于使用直接Win32进行GUI编程的抽象问题。由于我以前唯一的GUI经验是使用Swing的Java,我习惯了使用布局管理器,当窗口调整大小时,它会自动调整按钮和其他东西的大小。Win32 API中是否内置了类似的内容,或者是否必须在每次重新绘制时使用绝对位置手动重新计算大小和位置?我认为这实际上就是实现它的方法,因为我在MSDN文档中没有偶然发现任何看起来像布局管理的东西,但由于这些(在我看来)有点像迷宫,我可能错过了它。
谢谢你的帮助!
您需要了解ATL(随Visual C++一起提供),以及相应的WTL(未提供,需要下载)。
它们几乎完全编译为"直接Win32",同时提供了一个很好的C++包装器。它们非常轻(实际上几乎没有重量——99%的调用都是直接的Win32),但WTL是为了模仿MFC的功能而设计的,所以它仍然很有特点。
不过,你需要对C++有半熟练的掌握。
最简单的方法是在中使用CDialogResize<CYourDialog>
// Put ATL includes before here..
#include <atlcrack.h> // Include this from WTL for message map
#include <atlframe.h> // Include this from WTL for CDialogResize
class CYourDialog : CDialogImpl<CYourDialog>, CDialogResize<CYourDialog>
{
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
{
this->DlgResize_Init(); // Initialize the positions
}
BEGIN_MSG_MAP_EX(CYourDialog) // Learn about message maps if you haven't
MSG_WM_INITDIALOG(OnInitDialog)
CHAIN_MSG_MAP(CDialogResize<CYourDialog>) // Chain to the parent
END_MSG_MAP()
BEGIN_DLGRESIZE_MAP(CYourDialog)
DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_Y) // Layout for "OK" button
END_DLGRESIZE_MAP()
};
DLGRESIZE_CONTROL()
是布局的核心——例如,DLSZ_MOVE_Y
表示要垂直移动IDOK
。你也可以把它们分组,但这会很棘手(有时我也不明白发生了什么)。。。但一旦你做对了,其实也没那么糟糕
这里有一个独立的例子:
#pragma comment(linker, "/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
#include <atlbase.h>
extern CComModule _Module;
#include <atlapp.h>
#include <atlcrack.h>
#include <atlwin.h>
#include <atlframe.h>
#include "resource.h"
class CMyDialog : public CDialogImpl<CMyDialog>, CDialogResize<CMyDialog>
{
public:
enum { IDD = IDD_DIALOG1 };
private:
BOOL OnInitDialog(CWindow wndFocus, LPARAM)
{
this->DlgResize_Init();
return TRUE;
}
void OnOK(UINT, int, HWND) { this->EndDialog(ERROR_SUCCESS); }
void OnCancel(UINT, int, HWND) { this->EndDialog(ERROR_CANCELLED); }
BEGIN_MSG_MAP_EX(CMyDialog)
MSG_WM_INITDIALOG(OnInitDialog)
COMMAND_HANDLER_EX(IDOK, BN_CLICKED, OnOK)
COMMAND_HANDLER_EX(IDCANCEL, BN_CLICKED, OnCancel)
CHAIN_MSG_MAP(CDialogResize<CMyDialog>)
END_MSG_MAP()
BEGIN_DLGRESIZE_MAP(CMyDialog)
DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X | DLSZ_MOVE_Y)
END_DLGRESIZE_MAP()
};
CComModule _Module;
int WINAPI _tWinMain(
HINSTANCE hInstance, HINSTANCE hInstPrevious,
LPTSTR lpCmdLine, int nCmdShow)
{
_Module.Init(NULL, hInstance);
{
CMyDialog dialog;
dialog.DoModal();
}
_Module.Term();
}
要编译它,您还需要一个名为resource.h
的文件,该文件在同一项目文件夹中包含以下内容:
#define IDD_DIALOG1 101
#define IDR_RT_MANIFEST1 103
项目中添加了一个名为Sample.rc
的文件,该文件可以使用Visual Studio进行编辑,其中包含对话框布局:
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
#include "afxres.h"
#undef APSTUDIO_READONLY_SYMBOLS
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif
#ifdef APSTUDIO_INVOKED
1 TEXTINCLUDE
BEGIN
"resource.h "
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""rn"
" "
END
3 TEXTINCLUDE
BEGIN
"rn"
" "
END
#endif
IDD_DIALOG1 DIALOGEX 0, 0, 316, 180
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,205,159,50,14
PUSHBUTTON "Cancel",IDCANCEL,259,159,50,14
END
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 309
TOPMARGIN, 7
BOTTOMMARGIN, 173
END
END
#endif
#endif
#ifndef APSTUDIO_INVOKED
#endif
否。Win32 API不包含用于调整控件大小和重新定位控件的代码。你必须自己写或者使用图书馆。Microsoft在Visual Studio中提供了一个资源编辑器,并提供了MFC(API的C++包装器),但它们都不能解决实际问题(自动调整大小和重新定位)。我使用了wxWidgets,它比MFC(在我看来)更连贯,并且有一个名为"sizers"的概念,它确实解决了调整大小和重新定位的问题。
您可能需要研究MFC,它是win32的包装器,它将隐藏GUI设计中的大部分困难部分。它将为您提供一个资源编辑器,您可以在其中创建控件并将其定位为所见即所得。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- 应用程序如何检测缩放和监视Windows 10上的布局更改
- 如何保存MFC应用程序的布局设置
- 如何在运行时用C语言查看程序的内存布局
- 如何制作块生成器拖放布局程序
- 笔记应用程序的Qt复杂布局
- 关于一般程序布局的良好资源(最好是Python或C++)
- Win32 GUI程序中的布局
- 我应该如何为我的程序设置包含布局
- 将应用程序的主窗口 GUI 布局更改为在代码中
- GLSL - 程序链接错误:插槽 0 在布局位置请求中不可用
- c程序的内存布局,关于局部变量和全局变量的位置