十个 WTL 技巧和窍门






4.10/5 (30投票s)
2002年6月12日
4分钟阅读

208955

2490
在开发 WTL 应用程序时使用的十个快速简便的技巧和窍门。
引言
本文档介绍了在开发 WTL 应用程序时使用的十个(实际上是十一个,还有一个是奖励技巧)快速简便的技巧。这些技巧的范围从如何控制应用程序主窗口的大小和位置,到在控件中显示字符串和整数。可从上面的链接下载实现所有技巧的示例项目。这十个技巧是:
|
|
主窗口技巧
以下技巧适用于 SDI 或 MDI 应用程序。
1. 创建大小
在应用程序的 .cpp 文件 Run()
函数中使用以下技术来控制主窗口的创建大小。首先,使用所需主窗口大小的 rect 进行初始化,然后将 rect 作为第二个参数传递给 CreateEx()
,如下所示。新增的代码以粗体显示。
RECT rc = {0, 0, 380, 265}; if(wndMain.CreateEx(NULL, rc) == NULL)
2. 居中桌面
要将主窗口居中显示在桌面区域,请在应用程序的 .cpp 文件 Run()
函数中,在 ShowWindow()
命令之前添加以下行。
wndMain.CenterWindow();
3. 限制最小/最大尺寸
如果您想控制主窗口的最小和最大窗口大小,请在主窗口的 .h 头文件中,将以下消息处理程序添加到 CMainFrame
的消息映射中。
MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)
要完成实现,请将此处理程序例程添加到文件中
LRESULT OnGetMinMaxInfo(UINT, WPARAM, LPARAM lParam, BOOL&) { // load size structure with lParam values LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam; // change the values in the size structure to desired values lpMMI->ptMinTrackSize.x = 200; // min width lpMMI->ptMinTrackSize.y = 150; // min height lpMMI->ptMaxTrackSize.x = 600; // max width lpMMI->ptMaxTrackSize.y = 450; // max height return 0; }
4. 动态设置标题
可以通过将资源 ID 传递给 CString
来动态加载字符串资源到标题栏,然后使用该字符串设置主窗口的文本。将以下代码添加到主窗口的 OnCreate()
例程中即可完成此任务。将 atlmisc.h
添加到项目中,以便定义 CString
。使用 LoadString()
最多可以加载 255 个字符。
CString str; str.LoadString(IDS_EDITSTRING); SetWindowText(str);
5. 扁平式工具栏
WTL 应用程序向导创建的工具栏具有标准按钮,除非还选择了 rebar 选项。如果您想要一个不带 rebar 的扁平式工具栏,请在工具栏创建后,将以下代码添加到主窗口的 OnCreate()
例程中。
CToolBarCtrl tool = m_hWndToolBar;
tool.ModifyStyle(0, TBSTYLE_FLAT);
对话框技巧
以下技巧适用于任何对话框或基于对话框的应用程序。下图显示了我们示例项目中的“关于”对话框,它实现了这两个技巧。
6. 对话框文本和背景颜色
此技巧提供了一种快速简便的方法来更改对话框的文本颜色和/或背景颜色。在本文章附带的示例项目中,“关于”对话框中,我们使用 SetTextColor
将文本颜色设置为白色。背景颜色使用所谓的“stock brush”(预定义画笔)设置为黑色。第一步是将这两个消息处理程序添加到对话框的消息映射中。
MESSAGE_HANDLER(WM_CTLCOLORDLG, OnCtrlColor) MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtrlColor)
更改文本和背景颜色的第二步显示在以下 OnCtrlColor()
处理程序中。背景模式设置为透明,以便静态控件和分组框控件的文本能够正确显示。接下来,将文本设置为所需的 RGB 颜色,最后,返回所需的背景画笔阴影供绘制例程使用。
将 atlmisc.h
添加到项目中,以便可以使用 AtlGetStockBrush()
。预定义画笔的选择包括 WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH 和 BLACK_BRUSH。对于其他颜色,您需要创建非预定义画笔。
LRESULT OnCtrlColor(UINT, WPARAM, LPARAM, BOOL&) { // set background mode and text color SetBkMode((HDC)wParam, TRANSPARENT); // transparent background SetTextColor((HDC)wParam, RGB(255, 255, 255)); // white text return (LRESULT)AtlGetStockBrush(BLACK_BRUSH); }
7. 动态交换按钮位置
以下来自 OnInitDialog()
方法的代码交换了“关于”对话框上“确定”和“取消”按钮的位置。关键点是将绝对屏幕位置转换为相对于客户端的值。
CButton bOk = GetDlgItem(IDOK)); CButton bCancel = GetDlgItem(IDCANCEL)); // get the button rects RECT rcOk, rcCancel; bOk.GetWindowRect(&rcOk); ScreenToClient(&rcOk); bCancel.GetWindowRect(&rcCancel); ScreenToClient(&rcCancel); // swap the button positions bOk.SetWindowPos(NULL, &rcCancel, SWP_NOZORDER | SWP_NOSIZE); bCancel.SetWindowPos(NULL, &rcOk, SWP_NOZORDER | SWP_NOSIZE);
控件技巧
技巧 8 针对报表样式的 listview 控件,而技巧 9 和 10 适用于任何接受文本的控件,例如编辑控件和富文本编辑控件。
8. 扁平式 ListView 标题
为了将与报表样式的 listview 控件(设置了 LVS_REPORT
样式)关联的标题控件更改为外观更整洁的扁平样式,请获取标题控件对象并按如下所示修改其样式。
CHeaderCtrl hdr = MyListView.GetHeader();
hdr.ModifyStyle(HDS_BUTTONS, 0);
9. 显示整数
将 atlmisc.h
添加到项目中,以便定义 CString
,然后使用以下代码在控件中显示整数值。
int nValue = 9999; CString sInteger; sInteger.Format("%i", nValue); MyControl.SetWindowText(sInteger);
10. 显示资源字符串
使用 AtlLoadString 辅助函数(可在 atlmisc.h
中找到)将超过 255 个字符的资源字符串加载到控件中。示例项目使用以下代码将字符串加载到编辑控件中。在字符串表中输入字符串时,请使用 \r\n 来表示换行,因为单独的 \n 只显示为竖线,并且不会换行。
TCHAR cArray[1000]; AtlLoadString(IDS_EDITSTRING, cArray, 1000 + 1); MyControl.SetWindowText(cArray);
附加提示
以下技巧适用于控件。
11. 默认字体
当控件放置在对话框上时,它会自动采用对话框使用的字体。然而,当控件在视图或拆分窗格等窗口实现中使用时,它会使用 SYSTEM_FONT
,这并不太吸引人。将 atlmisc.h
添加到项目中,以便可以使用 AtlGetStockFont
,然后使用此技巧选择 DEFAULT_GUI_FONT
,这是一个 TrueType 字体对象。
MyControl.SetFont(AtlGetStockFont(DEFAULT_GUI_FONT), TRUE);
使用条款
本文提供的示例项目是免费的。您可以随意使用此代码。
本软件按“现状”分发,不提供任何形式的担保。