我不确定从GetWindowPlacement()函数的调用返回的某些返回值的含义,所以请得到您的帮助。
我将其称为获取隐藏窗口的正常尺寸。
首先,showCmd字段的值从何而来?在Microsoft文档的返回结构(WINDOWPLACEMENT structure中,所有可能值的描述都使用动词/操作词;例如,“ SW_MAXIMIZE:最大化指定的窗口”或“ SW_SHOWNOACTIVATE:以最新的形式显示窗口大小和位置。”
我想获取隐藏窗口的尺寸而不先取消隐藏/还原,所以使用动词似乎必须在调用GetWindowPlacement之前将showCmd设置为SW_SHOWNOACTIVATE的情况下调用SetWindowPlacement()。正确吗?
所以我能正确理解字段获得其各种值的主要(也许唯一)方法是在某处显式调用SetWindowPlacement()吗?
我的第二个问题与rcNormalPosition返回值有关。这些数据是否包括窗户装饰,或者它们是客户值?
谢谢您的时间!
答案 0 :(得分:3)
showCmd
结构的WINDOWPLACEMENT
成员的含义有点混乱,因为Win32重用了ShowWindow()
使用的SW_*
命令。
幸运的是,含义已记录在GetWindowPlacement()
函数中。
如果由hWnd参数标识的窗口最大化,则 showCmd成员为SW_SHOWMAXIMIZED。如果窗口最小化, showCmd为SW_SHOWMINIMIZED。否则为SW_SHOWNORMAL。
因此,基于这三个值中的哪一个,您可以判断窗口当前是最大化,最小化还是正常(还原)。而且,如果您想知道常规位置是什么,可以使用rcNormalPosition
成员。您完全不需要致电SetWindowPlacement()
。
不过,请注意GetWindowPlacement()
返回 workspace 坐标而不是 screen 坐标的警告,该坐标根据任务栏的位置和大小而有所不同。如果仅使用GetWindowPlacement()
返回的坐标来调用SetWindowPlacement()
,就没有问题。否则,您可能必须找到一种将工作空间转换为屏幕坐标的方法。
答案 1 :(得分:0)
我发现这两个功能对我有用。
void MyDialog::LoadDialogPlacement()
{
static WINDOWPLACEMENT last_wp = {};
// Load last stored DB version
WINDOWPLACEMENT *wp = new WINDOWPLACEMENT;
GetStoredWindowPlacement(&wp);
if (memcmp((void *)&last_wp, (const void *)wp, sizeof(WINDOWPLACEMENT)) == 0) return;
memcpy((void *)&last_wp, (const void *)wp, sizeof(WINDOWPLACEMENT));
SetWindowPlacement(wp);
delete[] wp;
}
void MyDialog::SaveDialogPlacement()
{
static WINDOWPLACEMENT last_wp = {};
if (IsWindowVisible())
{
WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(&wp);
if (memcmp((void *)&last_wp, (const void *)&wp, wp.length) == 0) return;
memcpy((void *)&last_wp, (const void *)&wp, wp.length);
StoreWindowPlacement(&wp);
}
}