博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对话框伸缩功能的实现
阅读量:5170 次
发布时间:2019-06-13

本文共 2338 字,大约阅读时间需要 7 分钟。

对话框的伸缩功能是指当触发某一操作时只显示部分对话框的内容,再次触发时显示全部的对话框范围,就比如画图软件上的选择颜色对话框,我们可以使用系统预定义的颜色,也可以选择自定义颜色,当点击自定义的按钮时,对话框出现原先隐藏的另一边,让用户填写颜色的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函数获取它的矩形大小,缩小时只保存控件之上的部分;

转载于:https://www.cnblogs.com/lanuage/p/7725760.html

你可能感兴趣的文章
【八枚银币】
查看>>
如何往一个指定的地址写入一个值呢
查看>>
点到圆弧的距离(csu1503)+几何
查看>>
Java Swing
查看>>
python检测文件的MD5值
查看>>
[COCI2009]Dvapravca
查看>>
SQL注入攻击和防御
查看>>
日志打印longging模块(控制台和文件同时输出)
查看>>
golang格式化输出---fmt包用法详解
查看>>
【转】12 TOP Command Examples in Linux
查看>>
今天起改用mac的marsedit写博
查看>>
FTP规范
查看>>
工作流图形设计器参考资料
查看>>
mysql基础以优化
查看>>
任务3,PSD切图
查看>>
8.最大滑动窗口问题
查看>>
[记录] web icon 字体
查看>>
java 利用同步工具类控制线程
查看>>
shiro 认证和授权原理
查看>>
为SIT Portal切换SIT所连接的数据库
查看>>