第六篇 显示你所创建的窗口 白云小飞 哈!到了显示窗口的时候啦! 看,下面这个函数就是用来显示窗口的:BOOL ShowWindow( HWND hWnd, int nCmdShow);一 ShowWindow函数的参数及返回值 hWnd就是你要显示的窗口的句柄: nCmdShow是窗口的显示方式,其可能的值如下:SW_HIDE 隐藏应用程序窗口SW_SHOWNORMAL 激活并显示窗口,如果窗口被最大化或最不化,系统恢复窗口到原始大小和位置(与SW_RESTORE)SW_RESTORE 同SW_SHOWNORMALSW_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程序的一个重要机制——消息处理机制。嘿嘿,到了关键一击的时候了!我请你务必带着这两个问题看下篇吧!

评论