zoukankan      html  css  js  c++  java
  • windowsclient开发--使你的client执行时记住上次关闭的大小和位置

    差点儿全部的windowsclient都能够调整大小,所以用户依据自己的喜好调整client的大小和位置。

    可是当该client退出后,又一次执行client的时候。我们往往又要调整自己喜好的大小和位置。

    微信的windowsclient做了记住client退出时候的大小和位置,下次执行的时候直接,窗体直接显示为你喜好的大小和位置。

    如今的任务就是八一八这个小小的功能。

    首先,你肯定是想到了使用配置文件。再client退出的时候,把client窗体的信息记录在一个配置文件里。一般都是.ini文件。读写配置文件 非常简单,这里就不再赘述了。

    可是使用配置文件的一个致命缺点就是别人非常easy发现这个文件,也许能够对其进行一定的改动。

    所以,要来一个高大上的方法,让用户不easy找到这个信息。这就是写入到注冊区,然后读取注冊区。实现记住上次关闭时的windows信息。

    你不须要单独存储client的width和height等变量,windows为我们提供了一个结构体:
    WINDOWPLACEMENT
    原型:

    typedef struct tagWINDOWPLACEMENT
    { /* wndpl */
    UINT length;
    UINT flags;
    UINT showCmd;
    POINT ptMinPosition;
    POINT ptMaxPosition;
    RECT rcNormalPosition;
    } WINDOWPLACEMENT;

    意义:
    length
    length指定了结构的长度。以字节为单位。

    flags
    flags指定了控制最小化窗体的位置的标志以及复原窗体的方法。这个成员能够是以下列出的标志之中的一个。或都是: · WPF_SETMINPOSITION 表明能够指定最小化窗体的x和y坐标。假设是在ptMinPosition成员中设置坐标,则必须指定这个标志。

    showCmd
    WPF_RESTORETOMAXIMIZED表明复原后的窗体将会被最大化,而无论它在最小化之前是否是最大化的。这个设置仅在下一次复原窗体时有效。它不改变缺省的复原操作。

    这个标志仅当showCmd成员中指定了SW_SHOWMINIMIZED时才有效。
    showCmd 指定了窗体的当前显示状态。

    这个成员能够是下列值之中的一个: ·
    SW_HIDE 隐藏窗体,使其他窗体变为激活的。
    · SW_MINIMIZE 最小化指定的窗体,并激活系统列表中的顶层窗体。
    · SW_RESTORE 激活并显示窗体。假设窗体是最小化或最大化的,Windows将把它恢复到原来的大小和位置(与SW_SHOWNORMAL同样)。
    · SW_SHOW 激活窗体并依照当前的位置和大小显示窗体。
    · SW_SHOWMAXIMIZED 激活窗体并将其显示为最大化的。
    · SW_SHOWMINIMIZED 激活窗体并将其显示为图标。


    · SW_SHOWMINNOACTIVE 将窗体显示为图标。当前激活的窗体仍保持激活状态。
    · SW_SHOWNA 按当前状态显示窗体。当前激活的窗体仍保持激活状态。
    · SW_SHOWNOACTIVATE 按近期的位置和大小显示窗体。当前激活的窗体仍保持激活状态。


    · SW_SHOWNORMAL 激活并显示窗体。假设窗体是最小化或最大化的,Windows将它恢复到原来的大小和位置(与SW_RESTORE同样)。

    ptMinPosition
    ptMinPosition 指定了窗体被最小化时左上角的位置。

    ptMaxPosition
    ptMaxPosition 指定了窗体被最大化时左上角的位置。

    rcNormalPosition
    rcNormalPosition 指定了窗体处于正常状态(复原)时的坐标。

    那么我们怎样获得这个struct的信息呢:
    GetWindowPlacement函数能够做到:

    函数原型
    BOOL GetWindowPlacement(HWND hWnd,WINDOWPLACEMENT*lpwndpl);

    參数
    hWnd:窗体句柄。


    lpwndpl:指向WINDOWPLACEMENT结构的指针。该结构存贮显示状态和位置信息。


    在调用GetWindowPlacement函数之前。将WINDOWPLACEMENT结构的长度设为
    sizeof(WIDNOWPLACEMENT)。

    假设lpwndpl->length设置不对则函数GetWindowPlacement将失败。

    接下来的任务就是怎样写入注冊区了,这里我们首先使用MFC中的函数,这样能够更简单一些。

    The WriteProfileBinary() is part of the MFC class CWinApp which simply dumps the WINDOWPLACEMENT structure into the registry as a REG_BINARY value called “WP” in a key called MainFrame. A good idea, especially for child windows of the CMainFrame class, is to replace the hard-coded MainFrame with the caption of the frame.

    BOOL CMainFrame::DestroyWindow() 
    {
        WINDOWPLACEMENT wp;
        GetWindowPlacement(&wp);
        AfxGetApp()->WriteProfileBinary("MainFrame", "WP", (LPBYTE)&wp, sizeof(wp));
    
        return CMDIFrameWnd::DestroyWindow();
    }

    接下来就是怎样从注冊区中取数据了:
    使用MFC中提供的函数:GetProfileBinary

    void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus) 
    {
        CMDIFrameWnd::OnShowWindow(bShow, nStatus);
    
        static bool bOnce = true;
    
        if(bShow && !IsWindowVisible()
            && bOnce)
        {
            bOnce = false;
    
            WINDOWPLACEMENT *lwp;
            UINT nl;
    
            if(AfxGetApp()->GetProfileBinary("MainFrame", "WP", (LPBYTE*)&lwp, &nl))
            {
                SetWindowPlacement(lwp);
                delete [] lwp;
            }
        }
    }

    这样就实现了MFC中存取windows的信息了。

    接下来会讨论win32 application中怎样实现上面的操作。

  • 相关阅读:
    枚举类型总结
    正则表达式-Java
    java中Mongo
    cookie
    xsd解析
    水平分表的实现
    c#位运算小例子笔记
    c#设计模式之观察者模式(Observer Pattern)
    c#设计模式之代理模式(Proxy Pattern)
    .Net 数据缓存浅析
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7232400.html
Copyright © 2011-2022 走看看