zoukankan      html  css  js  c++  java
  • 对话框伸缩功能的实现

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

  • 相关阅读:
    进程与线程
    the art of seo(chapter seven)
    the art of seo(chapter six)
    the art of seo(chapter five)
    the art of seo(chapter four)
    the art of seo(chapter three)
    the art of seo(chapter two)
    the art of seo(chapter one)
    Sentinel Cluster流程分析
    Sentinel Core流程分析
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725760.html
Copyright © 2011-2022 走看看