65.9K
CodeProject 正在变化。 阅读更多。
Home

十个 WTL 技巧和窍门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.10/5 (30投票s)

2002年6月12日

4分钟阅读

viewsIcon

208955

downloadIcon

2490

在开发 WTL 应用程序时使用的十个快速简便的技巧和窍门。

WTL Splitters and Panes Image

引言

本文档介绍了在开发 WTL 应用程序时使用的十个(实际上是十一个,还有一个是奖励技巧)快速简便的技巧。这些技巧的范围从如何控制应用程序主窗口的大小和位置,到在控件中显示字符串和整数。可从上面的链接下载实现所有技巧的示例项目。这十个技巧是:

  • 设置主窗口创建大小
  • 启动时居中主窗口
  • 限制主窗口的最小/最大尺寸
  • 动态加载主窗口标题
  • 设置工具栏为扁平样式
  • 设置对话框文本和背景颜色
  • 交换对话框按钮位置
  • 为 ListView 设置扁平式标题
  • 在控件中显示整数值
  • 在控件中显示资源字符串

主窗口技巧

以下技巧适用于 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);

对话框技巧

以下技巧适用于任何对话框或基于对话框的应用程序。下图显示了我们示例项目中的“关于”对话框,它实现了这两个技巧。

About Dialog

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

使用条款

本文提供的示例项目是免费的。您可以随意使用此代码。

本软件按“现状”分发,不提供任何形式的担保。

© . All rights reserved.