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中怎样实现上面的操作。

  • 相关阅读:
    [转]对Lucene PhraseQuery的slop的理解
    Best jQuery Plugins of 2010
    15 jQuery Plugins To Create A User Friendly Tooltip
    Lucene:基于Java的全文检索引擎简介
    9 Powerful jQuery File Upload Plugins
    Coding Best Practices Using DateTime in the .NET Framework
    Best Image Croppers ready to use for web developers
    28 jQuery Zoom Plugins Creating Stunning Image Effect
    VS2005 + VSS2005 实现团队开发、源代码管理、版本控制(转)
    禁止状态栏显示超链
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7232400.html
Copyright © 2011-2022 走看看