• 对话框伸缩功能的实现


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

  • 相关阅读:
    【笔记】模电lesson04 晶体管
    [笔记]模电如何判断和识别二极管的正负极
    [笔记]模电用数字万用表判断三极管管脚
    【笔记】模电lesson06 放大电路分析方法I
    【笔记】模电lesson07 放大电路分析方法II
    【翻译】在Verilog设计中使用参数化模块库(Quartus II)(Verilog)
    【原创】DE2实验练习解答—lab5 Clocks and Timers 【Verilog】【Digital Logic】
    【笔记】模电lesson 02 常用半导体器件
    【翻译】modelsim指南 I 之基本仿真(digital logic)
    【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725760.html
Copyright © 2020-2023  润新知