对话框伸缩功能的实现
对话框的伸缩功能是指当触发某一操作时只显示部分对话框的内容,再次触发时显示全部的对话框范围,就比如画图软件上的选择颜色对话框,我们可以使用系统预定义的颜色,也可以选择自定义颜色,当点击自定义的按钮时,对话框出现原先隐藏的另一边,让用户填写颜色的RGB值。
为了实现这个功能,我们需要记录两个矩形范围:全部对话框的大小和我们希望显示的部分对话框的大小,利用函数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函数获取它的矩形大小,缩小时只保存控件之上的部分;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」