windows客户端开发--使你的客户端运行时记住上次关闭的大小和位置
2016-02-18 20:40
543 查看
几乎所有的windows客户端都可以调整大小,所以用户根据自己的喜好调整客户端的大小和位置。
但是当该客户端退出后,重新运行客户端的时候,我们往往又要调整自己喜好的大小和位置。
微信的windows客户端做了记住客户端退出时候的大小和位置,下次运行的时候直接,窗口直接显示为你喜好的大小和位置。
现在的任务就是八一八这个小小的功能。
首先,你肯定是想到了使用配置文件。再客户端退出的时候,把客户端窗口的信息记录在一个配置文件中,一般都是.ini文件。读写配置文件 很简单,这里就不再赘述了。
但是使用配置文件的一个致命缺点就是别人很容易发现这个文件,或许可以对其进行一定的修改。
所以,要来一个高大上的方法,让用户不容易找到这个信息。这就是写入到注册区,然后读取注册区,实现记住上次关闭时的windows信息。
你不需要单独存储客户端的width和height等变量,windows为我们提供了一个结构体:
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.
接下来就是如何从注册区中取数据了:
使用MFC中提供的函数:GetProfileBinary
这样就实现了MFC中存取windows的信息了。
接下来会讨论win32 application中如何实现上面的操作。
但是当该客户端退出后,重新运行客户端的时候,我们往往又要调整自己喜好的大小和位置。
微信的windows客户端做了记住客户端退出时候的大小和位置,下次运行的时候直接,窗口直接显示为你喜好的大小和位置。
现在的任务就是八一八这个小小的功能。
首先,你肯定是想到了使用配置文件。再客户端退出的时候,把客户端窗口的信息记录在一个配置文件中,一般都是.ini文件。读写配置文件 很简单,这里就不再赘述了。
但是使用配置文件的一个致命缺点就是别人很容易发现这个文件,或许可以对其进行一定的修改。
所以,要来一个高大上的方法,让用户不容易找到这个信息。这就是写入到注册区,然后读取注册区,实现记住上次关闭时的windows信息。
你不需要单独存储客户端的width和height等变量,windows为我们提供了一个结构体:
WINDOWPLACEMENT
原型:
[code]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.
[code]BOOL CMainFrame::DestroyWindow() { WINDOWPLACEMENT wp; GetWindowPlacement(&wp); AfxGetApp()->WriteProfileBinary("MainFrame", "WP", (LPBYTE)&wp, sizeof(wp)); return CMDIFrameWnd::DestroyWindow(); }
接下来就是如何从注册区中取数据了:
使用MFC中提供的函数:GetProfileBinary
[code]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中如何实现上面的操作。
相关文章推荐
- 凸包问题-蛮力法
- Linux笔记(4)——命令基本格式与文件处理命令
- 学习gtest笔记<1-VS2013环境搭建>
- oracle面试题
- 框架跟设计模式的区别
- iOS 在 ARC 环境下 dealloc 的使用、理解误区
- mysql之复制
- 802.11中OFDM中的CP设置以及覆盖范围
- ios- POST数据加密-安全
- 双摄像头立体成像(三)-畸变矫正与立体校正
- 比淘宝更接地气?农村市场为何爱上微商
- [转载]python的常用代码模板
- iOS多线程学习-NSThread、Cocoa NSOperation、GCD
- 关于MVC的理解
- [转载]存储过程
- 生成函数
- [POJ 3164][最小树形图]
- Unity3d 开发(八)复制内容到剪切板
- 修改nopCommerce中的实体
- 一些脚本