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

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

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

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

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

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

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

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

WINDOWPLACEMENT

原型:

  1. typedef struct tagWINDOWPLACEMENT
  2. { /* wndpl */
  3. UINT length;
  4. UINT flags;
  5. UINT showCmd;
  6. POINT ptMinPosition;
  7. POINT ptMaxPosition;
  8. RECT rcNormalPosition;
  9. } 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.

  1. BOOL CMainFrame::DestroyWindow()
  2. {
  3. WINDOWPLACEMENT wp;
  4. GetWindowPlacement(&wp);
  5. AfxGetApp()->WriteProfileBinary("MainFrame", "WP", (LPBYTE)&wp, sizeof(wp));
  6. return CMDIFrameWnd::DestroyWindow();
  7. }

接下来就是怎样从注冊区中取数据了:

使用MFC中提供的函数:GetProfileBinary

  1. void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
  2. {
  3. CMDIFrameWnd::OnShowWindow(bShow, nStatus);
  4. static bool bOnce = true;
  5. if(bShow && !IsWindowVisible()
  6. && bOnce)
  7. {
  8. bOnce = false;
  9. WINDOWPLACEMENT *lwp;
  10. UINT nl;
  11. if(AfxGetApp()->GetProfileBinary("MainFrame", "WP", (LPBYTE*)&lwp, &nl))
  12. {
  13. SetWindowPlacement(lwp);
  14. delete [] lwp;
  15. }
  16. }
  17. }

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

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

windowsclient开发--使你的client执行时记住上次关闭的大小和位置的更多相关文章

  1. windowsclient开发--为你的client进行国际化

    之前博客讲过函数: GetUserDefaultUILanguage Returns the language identifier for the user UI language for the ...

  2. [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题

    这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪. 首先,写了一个新的lua脚本,载入,执行.在执行的时候,出了这么一个莫名其妙的问题: EXC_BAD_ACCES ...

  3. 【NX二次开发】指定矢量控件,记住上次选择的方向

    block UI控件如果有RetainValue属性,就用这个属性.没有这个属性可以参考下面这种方法.以矢量控件为例: 1.在apply_cb回调中,将控件值保存到文本中 double TopForT ...

  4. WPF编程,窗口保持上次关闭时的大小与位置。

    原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...

  5. IOS -执行时 (消息传递 )

    一 函数调用概述      Objective-C不支持多重继承(同Java和Smalltalk),而C++语言支持多重继承. Objective-C是动态绑定,它的类库比C++要easy操作. Ob ...

  6. .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...

  7. 使你的ActiveX控件执行时不弹出安全性提示(转载)

    我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...

  8. Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Dev环境中的集成测试用例执行时上下文环境检查(实战) Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术 ...

  9. Android 6.0及以上版本号的执行时权限介绍

    执行时权限(Runtime Permission)是Android 6.0( 代号为 Marshmallow,API版本号为 23)及以上版本号新增的功能.相比于以往版本号,这是一个较大变化. 本文将 ...

随机推荐

  1. C语言总结(3)

    1.字符输入函数getchar 输入一个字符 char ch; ch=getchai(); 字符输出函数putchar 输出一个字符 putchar(输出参数): 2.调用scanf和printf输入 ...

  2. MySQL可供选择的存储引擎

    备注:以下关于5.7版本的内容是来源于官方文档:https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html 以下关于5.6版本的内容,一部 ...

  3. asp.net的Context.Cache缓存过期策略

    最近使用Context.Cache需要了解Cache的缓存过期策略. 文章:ASP.NET缓存中Cache过期的三种策略

  4. iOS学习笔记27-摄像头

    一.摄像头 在iOS中,手机摄像头的使用有以下两种方法: UIImagePickerController拍照和视频录制 优点:使用方便,功能强大 缺点:高度封装性,无法实现一些自定义工作 AVFoun ...

  5. HDU——5667Sequence(矩阵快速幂+费马小定理应用)

    Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S ...

  6. Educational Codeforces Round 11——A. Co-prime Array(map+vector)

    A. Co-prime Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  7. 【CCF】地铁修建 改编Dijkstra

    [题意] 给定有n个点,m条边的无向图,没有平行边和自环,求从1到n的路径中,最长段的最小值(最短路不再是路径和,而是所有段中的最大值) [AC] #include<iostream> # ...

  8. java面试题之谈谈你对java的理解

    平台无关性:一处编译到处运行 GC:不用像c++那样手动释放堆内容 语言特性:泛型.反射.lamda表达式 面向对象:封装.继承.多态 类库:集合.并发库.网络库.IO库 异常处理

  9. django无法同步数据库 Error loading MySQLdb module: No module named ‘MySQLdb‘

    最近在学习Python,打算先看两个在线教程,再在github上找几个开源的项目练习一下,在学到“被解放的姜戈”时遇到django同步数据库时无法执行的错误,记录一下. 错误现象: 执行python ...

  10. hdu 4671 异面直线的距离

    题目大意:空间中有许多无限长的棒子(圆柱体),求棒子间最小距离. #include <iostream> #include <cstdio> #include <cstr ...