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中怎样实现上面的操作。
windowsclient开发--使你的client执行时记住上次关闭的大小和位置的更多相关文章
- windowsclient开发--为你的client进行国际化
之前博客讲过函数: GetUserDefaultUILanguage Returns the language identifier for the user UI language for the ...
- [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题
这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪. 首先,写了一个新的lua脚本,载入,执行.在执行的时候,出了这么一个莫名其妙的问题: EXC_BAD_ACCES ...
- 【NX二次开发】指定矢量控件,记住上次选择的方向
block UI控件如果有RetainValue属性,就用这个属性.没有这个属性可以参考下面这种方法.以矢量控件为例: 1.在apply_cb回调中,将控件值保存到文本中 double TopForT ...
- WPF编程,窗口保持上次关闭时的大小与位置。
原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...
- IOS -执行时 (消息传递 )
一 函数调用概述 Objective-C不支持多重继承(同Java和Smalltalk),而C++语言支持多重继承. Objective-C是动态绑定,它的类库比C++要easy操作. Ob ...
- .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)
Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...
- 使你的ActiveX控件执行时不弹出安全性提示(转载)
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...
- Dev环境中的集成测试用例执行时上下文环境检查(实战)
Dev环境中的集成测试用例执行时上下文环境检查(实战) Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术 ...
- Android 6.0及以上版本号的执行时权限介绍
执行时权限(Runtime Permission)是Android 6.0( 代号为 Marshmallow,API版本号为 23)及以上版本号新增的功能.相比于以往版本号,这是一个较大变化. 本文将 ...
随机推荐
- Mark Down 简单标记语言
MarkDown介绍=============== ## 1.标题分级介绍 #一级标题###三级标题######六级标题 一级标题============== 二级标题---------------- ...
- 骨牌覆盖问题总结!hihoCoder/ NYOJ-1273宣传墙1151
本想着做一下第九届河南省省赛题,结果被这个类似骨牌覆盖的题卡住了,队友然我去hihoCoder上老老实实把骨牌覆盖一.二.三做完,这题就没什么问题了.虽然很不情愿,但还是去见识了一下. 骨牌覆盖问题 ...
- IE7中a标签包含img,点击img,链接失效的bug
在做列表时,我们经常会这样写: <ul class="works-list"> <li> <a href=""> <d ...
- [POJ1155]TELE
[POJ1155]TELE 试题描述 A TV-network plans to broadcast an important football match. Their network of tra ...
- caffe编译新问题
我在一台机子上,配置第二个caffe的时候,复制之前的Makefile文件,直接 make all 居然报错了报错如下 ndefined reference to cv::imread(cv::Str ...
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...
- 为了防止detailsview中修改后,而girdview却没立即更新显示
原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] 可以在detailsview的事件中添加如下语句,即增加一个头,让它在0秒的时候刷新: Response.AddH ...
- 标准C程序设计七---54
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 20深入理解C指针之---程序的栈和堆
一.程序在内存中的存储分段: 程序段主要包括:code段.data段.内核段.堆段和栈段 1.code段: 1).存储程序汇编后程序指令 2).此段中的数据是只读的 3).不能用于存储变量,可以存储常 ...
- 第6章 I/O多路复用
前一章节客户端同时处理两个输入:标准输入和TCP套接字,然而问题在于客户端阻塞于fgets调用期,服务器进程被杀死后,服务器tcp虽然可以正确发送一个fin,但进程正阻塞于标准输入,它无法看到eof, ...