2011年2月10日星期四

ShowWindow的疑问

本 文:[转寄][转贴][删除][修改][回复][作者:novice][人气:81]
发信人: novice (Android), 信区: VC 
标  题: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月06日23:59:04 星期天), 站内信件 WWWPOST 

BOOL WINAPI ShowWindow( 
  __in  HWND hWnd, 
  __in  int nCmdShow 
); 
中 nCmdShow,MSDN中有这么段话: 
This parameter is ignored the first time an application calls ShowWindow, if  
the program that launched the application provides a STARTUPINFO structure.  
Otherwise, the first time ShowWindow is called, the value should be the  
value obtained by the WinMain function in its nCmdShow parameter. 

要怎么理解??? 

我的理解是,如果我用CreateProcess创建某程序,该程序就是创建个窗口,别无其他功 
能,调用CreateProcess时提供了STARTUPINFO si,并将相应的标志位设置si.dwFlags = 
 STARTF_USESHOWWINDOW,si.wShowWindow = SW_SHOWMINIMIZED. 
这样的话,即使被创建的程序第一次调用ShowWindow时传入参数 SW_SHOWMAXIMIZED ,程 
序也应该刚开始是最小化的。因为按照文档说明,参数该被忽略。 

但实际试验了一下,还是会出现最大化得窗口。不知道我哪里理解错误? 

-- 

本 文:[转寄][转贴][删除][修改][回复][作者:CrLF][人气:7]
发信人: CrLF (CrLF(落羽猫)), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月07日13:26:12 星期一), 站内信件 WWWPOST 

注意认真读文档:if the program that launched the application provides a  
STARTUPINFO structure. 

典型的提供STARTUPINFO的方法如:建立一个快捷方式,通过双击快捷方式启动。 

-- 

本 文:[转寄][转贴][删除][修改][回复][作者:novice][人气:2]
发信人: novice (Android), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月07日21:04:18 星期一), 站内信件 WWWPOST 

调用CreateProcess时,给 STARTUPINFO 赋值,不算提供STARTUPINFO 么? 

-- 


本 文:[转寄][转贴][删除][修改][回复][作者:CrLF][人气:5]
发信人: CrLF (CrLF(落羽猫)), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月08日13:40:44 星期二), 站内信件 WWWPOST 

之前理解错了。查了一下,使用STARTUPINFO 里提供的wShowWindow的条件是: 

第一种情况:ShowWindow的参数设为SW_SHOWDEFAULT 

第二种情况:满足以下条件,系统认定为主窗口: 
1. 设置了 STARTF_USESHOWWINDOW.  
2. 窗口是顶级窗口、无所有者、有WS_CAPTION、不是系统模态窗口 
这种情况下若ShowWindow 的参数为 SW_SHOWNORMAL 或 SW_SHOW,则使用你给定的参数. 
  

于是SW_MAXIMIZE不在此列………… 

好吧,MSDN的文档不全…… 
-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 60.18.151.157] 
※ 修改:・CrLF 于 2011年02月09日17:24 修改本文・[FROM: 60.18.151.188]
novice
69307364
本 文:[转寄][转贴][删除][修改][回复][作者:novice][人气:6]
发信人: novice (Android), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月08日16:27:05 星期二), 站内信件 WWWPOST 

不好意思,没明白你的意思。我能理解,在你列举的两种情况下,如果给ShowWindow提 
供SW_SHOWDEFAULT或者SW_SHOWNORMAL使得窗口按照STARTUPINFO的wShowWindow显示。 

我不能明白的是,MSDN文档里说的,第一次调用ShowWindow忽略nCmdShow参数的情况。 
对于“忽略”一词,我的理解是不管传入什么值,它都按照固定的方式显示。 

调用CreateProcess时给STARTUPINFO赋值,不算提供STARTUPINFO么? 

【 在 CrLF (CrLF(落羽猫)) 的大作中提到: 】 
: 之前理解错了。查了一下,使用STARTUPINFO 里提供的wShowWindow的条件是:
: 第一种情况:ShowWindow的参数设为SW_SHOWDEFAULT
: 第二种情况:满足以下条件,系统认定为主窗口:
: 1. 设置了 STARTF_USESHOWWINDOW. 
: 2. 窗口是顶级窗口、无所有者、有WS_CAPTION、不是系统模态窗口
: 3. ShowWindow 的参数为 SW_SHOWNORMAL 或 SW_SHOW. 
: 于是SW_MAXIMIZE不在此列…………
: 好吧,MSDN的文档不全……
-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 125.78.224.32] 
※ 修改:・novice 于 2011年02月08日16:28 修改本文・[FROM: 125.78.224.32]
CrLF
53453131364

本 文:[转寄][转贴][删除][修改][回复][作者:CrLF][人气:5]
发信人: CrLF (CrLF(落羽猫)), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月08日18:11:36 星期二), 站内信件 WWWPOST 

不是,我查给你的规则是实际的规则(系统实际是这样做的)。msdn文档写的含糊 :) 

信我查的好了。写msdn文档的人肯定没有写windows的人知道的清楚:P 


【 在 novice (Android) 的大作中提到: 】 
: BOOL WINAPI ShowWindow(
:   __in  HWND hWnd,
:   __in  int nCmdShow
: );
: 中 nCmdShow,MSDN中有这么段话:
: This parameter is ignored the first time an application calls ShowWindow, if 
: the program that launched the application provides a STARTUPINFO structure. 
: Otherwise, the first time ShowWindow is called, the value should be the 
: value obtained by the WinMain function in its nCmdShow parameter.
: 要怎么理解???
: 我的理解是,如果我用CreateProcess创建某程序,该程序就是创建个窗口,别无其他功
: 能,调用CreateProcess时提供了STARTUPINFO si,并将相应的标志位设置si.dwFlags =
:  STARTF_USESHOWWINDOW,si.wShowWindow = SW_SHOWMINIMIZED.
: 这样的话,即使被创建的程序第一次调用ShowWindow时传入参数 SW_SHOWMAXIMIZED ,程
: 序也应该刚开始是最小化的。因为按照文档说明,参数该被忽略。
: 但实际试验了一下,还是会出现最大化得窗口。不知道我哪里理解错误?

-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 60.18.151.146]
novice
69307364
本 文:[转寄][转贴][删除][修改][回复][作者:novice][人气:3]
发信人: novice (Android), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月08日20:18:32 星期二), 站内信件 WWWPOST 

那意思是 ShowWindow第一次调用与后续调用没区别? 

【 在 CrLF (CrLF(落羽猫)) 的大作中提到: 】 
: 不是,我查给你的规则是实际的规则(系统实际是这样做的)。msdn文档写的含糊 :)
: 信我查的好了。写msdn文档的人肯定没有写windows的人知道的清楚:P
: 【 在 novice (Android) 的大作中提到: 】
: : BOOL WINAPI ShowWindow(
: :   __in  HWND hWnd,
: :   __in  int nCmdShow
: : );
: : 中 nCmdShow,MSDN中有这么段话:
: : This parameter is ignored the first time an application calls ShowWindow, if 
: : the program that launched the application provides a STARTUPINFO structure. 
: : Otherwise, the first time ShowWindow is called, the value should be the 
: : value obtained by the WinMain function in its nCmdShow parameter.
: : 
: : 要怎么理解???
: : 
: : 我的理解是,如果我用CreateProcess创建某程序,该程序就是创建个窗口,别无其他功
: : 能,调用CreateProcess时提供了STARTUPINFO si,并将相应的标志位设置si.dwFlags =
: (以下引言省略...)

-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 125.78.224.32]
CrLF
53453131364

本 文:[转寄][转贴][删除][修改][回复][作者:CrLF][人气:3]
发信人: CrLF (CrLF(落羽猫)), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月09日17:28:30 星期三), 站内信件 WWWPOST 

不不,你还是没明白我的意思。 

首先是,不一定是*第一次*调用ShowWindow~  而是第一次对符合主窗口条件(见上面) 
的窗口调用ShowWindow 的时候。 

这个时候如果你用SW_SHOW或SW_SHOWNORMAL,系统会替换。 

你的程序系统认为它是主窗口了,但是你给的是最大化,系统就不管了~ 

【 在 novice (Android) 的大作中提到: 】 
: 那意思是 ShowWindow第一次调用与后续调用没区别?
: 【 在 CrLF (CrLF(落羽猫)) 的大作中提到: 】
: : 不是,我查给你的规则是实际的规则(系统实际是这样做的)。msdn文档写的含糊 :)
: : 
: : 信我查的好了。写msdn文档的人肯定没有写windows的人知道的清楚:P
: : 
: : 
: : (以下引言省略...)

-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 60.18.151.188]
novice
69307364
本 文:[转寄][转贴][删除][修改][回复][作者:novice][人气:5]
发信人: novice (Android), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月09日20:12:03 星期三), 站内信件 WWWPOST 

抱歉在这个问题上纠缠这么久。 

再说说我现在的理解。你的意思是:在满足主窗口条件时,第一次调用ShowWindow时使 
用SW_SHOW或SW_SHOWNORMAL,会使窗口按照STARTUPINFO的信息显示? 

MSDN里文档里说的“忽略”就是上述意思?“This parameter is ignored the first  
time an application calls ShowWindow, if the program that launched the  
application provides a STARTUPINFO structure.”感觉另有深意啊。 

那为什么要称为“ignored”呢? 因为是上述说法的话,那等同于在SW_SHOW或SW_ 
SHOWNORMAL时,使用STARTUPINFO的信息。而其他参数也按照各自本来的效果显示,并没 
有被忽略。 

感觉你的意思是在说明在什么条件下使用STARTUPINFO的信息,而我最大的疑惑是MSDN文 
档里的“忽略”二字。不对之处请指正。 

【 在 CrLF (CrLF(落羽猫)) 的大作中提到: 】 
: 不不,你还是没明白我的意思。
: 首先是,不一定是*第一次*调用ShowWindow~  而是第一次对符合主窗口条件(见上面)
: 的窗口调用ShowWindow 的时候。
: 这个时候如果你用SW_SHOW或SW_SHOWNORMAL,系统会替换。
: 你的程序系统认为它是主窗口了,但是你给的是最大化,系统就不管了~
: 【 在 novice (Android) 的大作中提到: 】
: : 那意思是 ShowWindow第一次调用与后续调用没区别?
: : 
-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 222.77.201.102] 
※ 修改:・novice 于 2011年02月09日20:25 修改本文・[FROM: 222.77.201.102]
CrLF
53453131364

本 文:[转寄][转贴][删除][修改][回复][作者:CrLF][人气:2]
发信人: CrLF (CrLF(落羽猫)), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月09日23:00:37 星期三), 站内信件 WWWPOST 

it is "ignored" becuase it is "overridden" :) 

MSDN只是没说识别的细节而已。实际上你从设计意图上理解比较好。它之所以这么设计 
,就是为了让写程序的人不用考虑到底该用什么参数。你只要主窗口的ShowWindow用 
WinMain参数里给定的那个,根本不用考虑这些。如果需要在前面显示对话框,就该是模 
态的。如果同时显示对话框,主窗口一般是所有者……总之,为了方便,你什么都不做 
,交给Windows就好。 

【 在 novice (Android) 的大作中提到: 】 
: 抱歉在这个问题上纠缠这么久。
: 再说说我现在的理解。你的意思是:在满足主窗口条件时,第一次调用ShowWindow时使
: 用SW_SHOW或SW_SHOWNORMAL,会使窗口按照STARTUPINFO的信息显示?
: MSDN里文档里说的“忽略”就是上述意思?“This parameter is ignored the first 
: time an application calls ShowWindow, if the program that launched the 
: application provides a STARTUPINFO structure.”感觉另有深意啊。
: 那为什么要称为“ignored”呢? 因为是上述说法的话,那等同于在SW_SHOW或SW_
: SHOWNORMAL时,使用STARTUPINFO的信息。而其他参数也按照各自本来的效果显示,并没
: 有被忽略。
: 感觉你的意思是在说明在什么条件下使用STARTUPINFO的信息,而我最大的疑惑是MSDN文
: 档里的“忽略”二字。不对之处请指正。
: 【 在 CrLF (CrLF(落羽猫)) 的大作中提到: 】
: : 不不,你还是没明白我的意思。
: : 
: : 首先是,不一定是*第一次*调用ShowWindow~  而是第一次对符合主窗口条件(见上面)
: (以下引言省略...)
-- 
※ 来源:・瀚海星云 bbs.ustc.edu.cn・[FROM: 60.18.151.188] 
※ 修改:・CrLF 于 2011年02月09日23:08 修改本文・[FROM: 60.18.151.188]
novice
69307364
本 文:[转寄][转贴][删除][修改][回复][作者:novice][人气:0]
发信人: novice (Android), 信区: VC 
标  题: Re: ShowWindow 的疑问 
发信站: 瀚海星云 (2011年02月10日09:59:17 星期四), 站内信件 WWWPOST 

it is "ignored" becuase it is "overridden" 。了解了。 

哦哦,那结论是第一次调用时乖乖用WinMain的nCmdShow啦。 

多谢! 

【 在 CrLF (CrLF(落羽猫)) 的大作中提到: 】 
: it is "ignored" becuase it is "overridden" :)
: MSDN只是没说识别的细节而已。实际上你从设计意图上理解比较好。它之所以这么设计
: ,就是为了让写程序的人不用考虑到底该用什么参数。你只要主窗口的ShowWindow用
: WinMain参数里给定的那个,根本不用考虑这些。如果需要在前面显示对话框,就该是模
: 态的。如果同时显示对话框,主窗口一般是所有者……总之,为了方便,你什么都不做
: ,交给Windows就好。
: 【 在 novice (Android) 的大作中提到: 】
: : 抱歉在这个问题上纠缠这么久。
: : 
: : 再说说我现在的理解。你的意思是:在满足主窗口条件时,第一次调用ShowWindow时使
: : 用SW_SHOW或SW_SHOWNORMAL,会使窗口按照STARTUPINFO的信息显示?
: : 
: : MSDN里文档里说的“忽略”就是上述意思?“This parameter is ignored the first 
: : time an application calls ShowWindow, if the program that launched the 
: : application provides a STARTUPINFO structure.”感觉另有深意啊。
: : 
: : 那为什么要称为“ignored”呢? 因为是上述说法的话,那等同于在SW_SHOW或SW_
: : SHOWNORMAL时,使用STARTUPINFO的信息。而其他参数也按照各自本来的效果显示,并没
: (以下引言省略...)

没有评论:

发表评论