WTL 学习笔记 -- ResizeDialog

WTL 学习笔记 -- ResizeDialog

 

记得以前写过一个ActiveX控件,只要把它放在对话框上,它遍历对话框上的所有控件,并把它们管理起来,只要对话框大小变化时,它自动调整各个控件的大小和位置。这可能是我写的第一个ActiveX控件,比较失败,虽然功能实现了,但只是无条件的缩放控件的大小和位置,结果是有的控件变得很难看。

 

WTL里已经内置这种功能,不用我们自己实现了。它提供了一个CdialogResize类,帮助实现自动调整对话框上控件的大小和位置。这个功能很好用,简单有效。可以按下列步骤进行:

 

1.         让对话框从CdialogResize类继承过来:

class CMainDlg : public CDialogImpl<CMainDlg>, public CDialogResize<CMainDlg>

2.         定义自动调整大小的控件列表

         BEGIN_DLGRESIZE_MAP(CMainDlg)

                   DLGRESIZE_CONTROL(IDC_LIST, DLSZ_SIZE_Y )

                   DLGRESIZE_CONTROL(IDC_EDIT, DLSZ_SIZE_X | DLSZ_SIZE_Y)

                   DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X)

                   DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X)

                   DLGRESIZE_CONTROL(ID_APP_ABOUT, DLSZ_MOVE_X)

         END_DLGRESIZE_MAP()

3.         在消息处理中加入消息转发功能

         BEGIN_MSG_MAP(CMainDlg)

                   MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)

                   COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)

                   COMMAND_ID_HANDLER(IDOK, OnOK)

                   COMMAND_ID_HANDLER(IDCANCEL, OnCancel)

                   CHAIN_MSG_MAP(CDialogResize<CMainDlg>)

         END_MSG_MAP()

4.         OnInitDialog里做点初始化工作

         LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

         {

                   // center the dialog on the screen

                   CenterWindow();

 

                   // set icons

                   HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),

                            IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);

                   SetIcon(hIcon, TRUE);

                   HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),

                            IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);

                   SetIcon(hIconSmall, FALSE);

 

                   ATLASSERT(GetDlgItem(IDOK) != NULL);

                   ATLASSERT(GetDlgItem(ID_APP_ABOUT) != NULL);

 

                   DlgResize_Init();

                   return TRUE;

     }

 

OK,搞定!

 

06-18
概要<br>对于具有窗口, 只能是某些规模有时非常有用。 例如, MicrosoftWord 和 Microsoft Visual C++® 有工具栏是大小可调整到最适合控件工具栏中特定大小。 这样做, 最好授予用户可视提示有关可用窗口大小。 通过示例 RESIZE 示例代码显示如何修改 Windows 窗口以便当用户使用鼠标来调整窗口边框跳转到下一个可用大小自动调整方式。 <br>更多信息<br>可用于从 Microsoft 下载中心下载下列文件:<br><br>Resize.exe (http://download.microsoft.com/download/platformsdk/sample52/1/w9xnt4/en-us/resize.exe)<br>有关如何下载 Microsoft 支持文件请单击下列文章编号以查看 Microsoft 知识库中相应: <br>119591 (http://support.microsoft.com/kb/119591/EN-US/) 如何从联机服务获取 Microsoft 支持文件 <br>此文件进行病毒扫描 Microsoft。 Microsoft 使用最新病毒检测软件, 投递文件日期上的可用。 文件存储, 有助于防止对文件进行任何未经授权更改安全性增强的服务器上。 当用户单击的窗口, 调整边框 Windows 进入 PeekMessage 循环以捕获所有鼠标消息发生直到已释放鼠标左键。 而在此循环, 每当鼠标移动移动矩形, 显示新窗口大小以向用户与新窗口大小将是什么提供可视提示。 <br><br>通过进入消息循环以捕获鼠标消息直到是左按钮释放其自己 RESIZE 示例代码修改调整操作。 不用每次接收鼠标移动, 更新矩形 RESIZE 代码检查以查看如果当前鼠标位置会使窗口大小之一可能窗口宽度和高度大小由应用程序所定义。 由此, RESIZE 应用程序提供更准确的可视提示有关调整操作将采取哪些。 <br><br>通过同时用于 Windows 和 RESIZE 应用 WM_NCLBUTTONDOWN 邮件触发调整操作。 当收到此消息, 消息循环输入来过滤掉除对两, WM _ MOUSEMOVE 和 WM _ LBUTTONUP 所有鼠标消息。 RESIZE 应用程序接收到 WM _ MOUSEMOVE 消息, 时检查以查看放大或缩小如果当前鼠标位置将使窗口。 如果窗口是小, 调整矩形移到下一个小维度由应用程序定义。 如果窗口是大, 程序将检查以是否会对下可能维度足够新大小以及相应更新矩形。 接收到 WM _ LBUTTONUP 消息, 时通过窗口大小更新到当前位置由鼠标完成调整操作并删除矩形。 <br><br>RESIZE 应用程序还利用了一部分由处理 WM_NCHITTEST 消息提供了灵活性。 Windows 向应用程序与鼠标位置发送此消息并期望应用程序能够描述的窗口, 包括鼠标位置部分。 经常, 应用程序传递到 DefWindowProc() 此消息并让默认计算是什么鼠标是顶部告诉系统负责。 RESIZE 应用允许 DefWindowProc() 来处理消息, 但然后检查以确定是否将鼠标置于某个在工作区或调整转角。 为了简化调整操作, RESIZE 不让调整从窗口角, 以便 HTTOPRIGHT 点击测试代码并返回 HTBOTTOM 或 HTTOP 替代 HTBOTTOMLEFT HTTOPLEFT, HTBOTTOMRIGHT, 应用程序和用户。 由此, 鼠标光标准确反映调整的方向。 当 HTCLIENT 命中返回测试代码, RESIZE 变为这 HTCAPTION 以便窗口以移动即使它没有标题栏。 <br><br>尽管此方法将使用 Windows 95, 就没有必要。 Windows 95 提供新消息 WM_SIZING, 将启用程序不处理 WM_NCxxx 消息或进入 PeekMessage() 循环进行完全相同。 <br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值