哈!到了显示窗口的时候啦!
看,下面这个函数就是用来显示窗口的:
BOOL ShowWindow( HWND hWnd, int nCmdShow);
一 ShowWindow函数的参数及返回值
hWnd就是你要显示的窗口的句柄:
nCmdShow是窗口的显示方式,其可能的值如下:
SW_HIDE 隐藏应用程序窗口
SW_SHOWNORMAL 激活并显示窗口,如果窗口被最大化或最不化,系统恢复窗口到原始大小和位置(与SW_RESTORE)
SW_RESTORE 同SW_SHOWNORMAL
SW_NORMAL
SW_SHOWMINIMIZED 激活并最小化窗口
SW_SHOWMAXIMIZED 激活并最大化窗口
SW_SHOW 激活窗口,并按其当前大小和位置显示
SW_MAXINIZE 最大化应用程序窗口
SW_MINIMIZE 最不化应用程序窗口
SW_SHOWNOACTIVATE 按最近大小和位置显示窗口,但不改变激活特性
SW_SHOWMINNOACTIVE 最小化窗口,但不改变其激活特性
SW_SHOWNA 按当前大小各位置显示窗口,但不改变其激活特性
返回值:成功则返回TRUE,不成功则返回FALSE。
二 先来两个例子
例一:现假设已经创建了一个窗口,并且该窗口句柄已保存在hWnd变量中。我希望将窗口最大化并使该窗口为当前窗口(即激活该窗口)。请写出ShowWindow函数的具体实现代码。(注:可不必处理它的返回值)
解:ShowWindow(hWnd, SW_SHOWMAXIMIZED);
例二:我希望隐藏一个原来是显示着的窗口。该窗口的句柄在hWnd变量中。应如何写ShowWindow函数呢?
解:ShowWindow(hWnd, SW_HIDE);
三 本系列程序中的实现
(快一点喽,我想马上动手啦!)
好,我们现在继续完善我们的这个Win32SDK程序吧!
具体代码如下(注意粗体字部分):
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;
//…… 这里省略了前面所述的注册窗口类的过程
//
hWnd=CreateWindowEx(NULL,WND_CLS_NAME,
"这是我的第一个窗口",
WS_OVERLAPPEDWINDOW|WS_VISIBLE ,
CW_USEDEFAULT, 0,
400,400,
NULL,
NULL,
hinstance,
NULL );
if (!hWnd)
return 0;
ShowWindow(hWnd, ncmdshow); //本篇只添加这一句
return 0; //这里设置一个断点,调试看看
}
一点说明:这里的ncmdshow就是WinMain主函数中的传入参数ncmdshow。当我们通过双击*.exe文件来执行程序时,ncmdshow里的值就会是SW_SHOWNORMAL。
四 调试看看
太棒啦!我终于可以亲眼所见我的窗口了!
好,让我们来调试一下吧!看看程序运行后会发生什么。(如果不这样调试而只是运行它,那么还来不及等你看清窗口,程序就会马上结束的。这不用我说明原因吧!)
请在最后一个return 0处设置一个断点(光标放在return 0处,按F9)。然后F5运行程序。
程序暂停在最后一个return 0处。
然后最小化桌面上所有其它无关窗口(包括VC6窗口)(这样才能看到这个程序的窗口噢!)。
认真研究,我发现目前的代码有以下几个问题:
1. 窗口虽然显示,但窗口不能自动被激活(即成为当前窗口)。只有最小化桌面上其它应用程序的窗口后,才能看到我们的这个窗口。(注意:在ShowWindow(hWnd, ncmdshow);函数中ncmdshow值我说过是SW_SHOWNORMAL值,应该会将窗口激活才对啊!这可是个大问题。)
2. 窗口无法进行调整大小,移动位置等的操作。
不过我并不想在这里解决这个问题(为什么?),那是因为这是一个大问题,它将引出Window程序的一个重要机制——消息处理机制。嘿嘿,到了关键一击的时候了!我请你务必带着这两个问题看下篇吧!
评论