对话框伸缩功能的实现
2015-09-21 22:07
288 查看
对话框的伸缩功能是指当触发某一操作时只显示部分对话框的内容,再次触发时显示全部的对话框范围,就比如画图软件上的选择颜色对话框,我们可以使用系统预定义的颜色,也可以选择自定义颜色,当点击自定义的按钮时,对话框出现原先隐藏的另一边,让用户填写颜色的RGB值。
为了实现这个功能,我们需要记录两个矩形范围:全部对话框的大小和我们希望显示的部分对话框的大小,利用函数SetWindowPos来设置显示的对话框的大小,该函数的原型如下:
下面是对该函数的补充:
1)hWndInsertAfter:除了给出具体的窗口句柄外还可以是这几个值:
HWND_BOTTOM、HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST;
2)uFlags主要的一些标志:
SWP_NOMOVE:调用该函数不改变窗口之前的顶点位置,当设置这个这个值的时候,x、y参数将被忽略;
SWP_NOZORDER:忽略Z序,这个标志被设置时将忽略hWndInsertAfter参数;
具体的信息可以在MSDN中查找;
以下是具体的实现代码:
IDC_SPERATOR是一个分割线的ID,分割线我们采用的是一个图片控件,将这个控件的高度尽量缩小,这个控件本身也是一个矩形,可以用GetWindowRect函数获取它的矩形大小,缩小时只保存控件之上的部分;
为了实现这个功能,我们需要记录两个矩形范围:全部对话框的大小和我们希望显示的部分对话框的大小,利用函数SetWindowPos来设置显示的对话框的大小,该函数的原型如下:
BOOL SetWindowPos( HWND hWnd, // 需要设置的窗口的句柄 HWND hWndInsertAfter, // Z序中下一个窗口的句柄 int X, // int Y, // 窗口所在矩形的顶点坐标(x, y) int cx, // 矩形宽 int cy, // 矩形高 UINT uFlags // 显示属性 );
下面是对该函数的补充:
1)hWndInsertAfter:除了给出具体的窗口句柄外还可以是这几个值:
HWND_BOTTOM、HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST;
2)uFlags主要的一些标志:
SWP_NOMOVE:调用该函数不改变窗口之前的顶点位置,当设置这个这个值的时候,x、y参数将被忽略;
SWP_NOZORDER:忽略Z序,这个标志被设置时将忽略hWndInsertAfter参数;
具体的信息可以在MSDN中查找;
以下是具体的实现代码:
//按钮的WM_COMMAND消息处理 case WM_COMMAND: { if (LOWORD(wParam) == IDC_BUTTON) { if (HIWORD(wParam) == BN_CLICKED) { TCHAR szBuf[255] = TEXT(""); GetWindowText(GetDlgItem(hDlg, IDC_BUTTON), szBuf, 255); if (0 == _tcscmp(szBuf, TEXT("收缩>>"))) { SetWindowText(GetDlgItem(hDlg, IDC_BUTTON), TEXT("扩张<<")); }else { SetWindowText(GetDlgItem(hDlg, IDC_BUTTON), TEXT("收缩>>")); } Extern(hDlg, szBuf); } } }
//改变对话框大小的函数 void Extern(HWND hWnd, const TCHAR *pszStr) { //保存对话框在扩张和收缩状态下的矩形大小 static RECT rtSmall; static RECT rtLarge; //当两个量不是有效值时,获取这两种状态下的矩形大小 if (IsRectEmpty(&rtLarge)) { RECT rtSpecrator; GetWindowRect(GetDlgItem(hWnd, IDC_SPERATOR), &rtSpecrator); rtSmall.left = rtLarge.left; rtSmall.top = rtLarge.top; rtSmall.right = rtSpecrator.right; rtSmall.bottom = rtSpecrator.bottom; } if (0 == _tcscmp(pszStr, TEXT("收缩>>"))) { SetWindowPos(hWnd, NULL, 0, 0, rtSmall.right - rtSmall.left, rtSmall.bottom - rtSmall.top, SWP_NOZORDER | SWP_NOMOVE); } else { SetWindowPos(hWnd, NULL, 0, 0, rtLarge.right - rtLarge.left, rtLarge.bottom - rtLarge.top, SWP_NOZORDER | SWP_NOMOVE); } }
IDC_SPERATOR是一个分割线的ID,分割线我们采用的是一个图片控件,将这个控件的高度尽量缩小,这个控件本身也是一个矩形,可以用GetWindowRect函数获取它的矩形大小,缩小时只保存控件之上的部分;
相关文章推荐
- win32下进程间通信(共享内存)实例分析
- WMI中的Win32_PingStatus类(ping命令实现)
- win32安装配置非安装版的MySQL
- 一个win32窗口创建示例
- iis Win32状态数值(sc-win32-status)说明
- nginx win32 版本静态文件测试 (Windows环境)
- C#利用win32 Api 修改本地系统时间、获取硬盘序列号
- C#通过WIN32 API实现嵌入程序窗体
- WIN32程序获取父进程ID的方法
- 实例分析一个简单的Win32程序
- VC程序在Win32环境下动态链接库(DLL)编程原理
- Win32应用程序(SDK)设计原理详解
- python使用win32com库播放mp3文件的方法
- WIN32 贪食蛇改进版,新增计分、等级及暂停功能
- WiFiAssistant 无线承载网络设置助手的开发历程
- Windows AppContainer 降权,隔离与安全
- Win32 调试接口设计与实现浅析
- 理解 Win32 "OutputDebugString"
- Win32串口编程
- VC++串口编程之基于Win32 API