对话框伸缩功能的实现

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

CSS魔法堂:再次认识font

一、前言                                 文字承载着站点内涵,而良好的字体、排版则为用户提供舒适的阅读体验。本文打算对字体稍微深...

29610
来自专栏前端黑板报

canvas-入门

定义 canvas是HTML5新增的一个重要元素,先看下它的定义: <canvas> is an HTML element which can be used ...

22810
来自专栏GIS讲堂

Geoserver2.11矢量切片与OL3中的调用展示

GIS的底图一直使用金字塔技术进行切图,使用户能够快速访问指定级别的地图或者影像。但是切图本身是一张图片,无法进行交互。于是又引入了矢量图层用来显示矢量点线面,...

1833
来自专栏微信小开发

小程序“圣诞帽”的实现思路

这两天朋友圈被“圣诞帽”刷屏,这个小程序连微信官方都出来辟谣了,又一个现象级的玩意儿。从产品角度而言无疑是非常成功,但从技术角度而言是确实习以为常,创意很重要!...

26310
来自专栏一“技”之长

AppleWatch开发入门九——Watch帧动画的实现

        动画一直是iOS系统的一大亮点,CoreAnimation和粒子效果的支持,开发者可以很容易的做出效果炫酷的动画特效。在watchOS中,由于性...

902
来自专栏格子的个人博客

Markdown语法学习记录

鉴于每次写博客,写文章的时候,总是要重复去查询Markdown的相关语法,这种闹心的感觉我再也不要了。

1072
来自专栏WindCoder

一个创建产品动画说明视频的新手指南

英文原文:A Step-by-step Guide to Creating Animated Product Explainer Videos

2001
来自专栏瞎说开发那些事

RPA与Excel(DataTable)

方法: 直接调用invokeCode,入参为已定义好的DataTable,出参为去重后的DataTable,代码如下

1172
来自专栏Android-薛之涛

Android-ConstraintLayout详解

现在还不用ConstraintLayout是有点守旧了,它是studio 2.2版本主要增加的功能之一,最大的好一句话概括就是:支持可视化编辑xml文件,解决多...

1601
来自专栏Sorrower的专栏

Android绘制(三):Path结合属性动画, 让图标动起来!

1792

扫码关注云+社区

领取腾讯云代金券