发新话题
打印

白手起家Win32SDK应用程序6 显示你创建的窗口

白手起家Win32SDK应用程序6 显示你创建的窗口

知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070506

点击下面网址查看原文:
http://www.d-programming-language-china.org

by: 白云小飞 D语言论坛 http://www.d-programming-language-china.org 增加D语言实例教程

哈!到了显示窗口的时候啦!
看,下面这个函数就是用来显示窗口的:

QUOTE:
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程序吧!
具体代码如下(注意粗体字部分):( 本文出处: http://www.d-programming-language-china.org )

QUOTE:
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;    //这里设置一个断点,调试看看
}

D语言论坛 http://www.d-programming-language-china.org 按:
对应的D语言写法是这样:

extern (Windows):
int WinMain(HINSTANCE hinstance,
             HINSTANCE hprevinstance,
             LPSTR lpcmdline,
             int ncmdshow)
{
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wndclass;
    //……    这里省略了前面所述的注册窗口类的过程
    //
    hWnd=CreateWindowEx(NULL,std.string.toStringz(WND_CLS_NAME),
            std.windows.charset.toMBSz("D语言论坛 http://www.d-programming-language-china.org"),
            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程序的一个重要机制——消息处理机制。嘿嘿,到了关键一击的时候了!我请你务必带着这两个问题看下篇吧!

( lastupdate:20070506 最新文章请访问http://www.d-programming-language-china.org )

关于一大步成功社区:
yidabu提倡在交流中学习,在分享中提高
收集感兴趣的知识,写下心得,通过网络与别人一起分享
理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的
网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台

TOP

发新话题