正文

游戏编程起源(初学者)Ⅵ (一)2006-01-28 12:10:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/mroske/9906.html

分享到:

关闭你的应用程序(关闭窗口)

有三个消息看起来差不多,都是处理关闭的事情的。它们是WM_DESTROYWM_CLOSE,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,向用户提出是否真的退出。你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。消息框的制作是很容易的,由于它用途广泛,我们还是介绍一下:

int MessageBox(
    HWND hWnd,         // handle of owner window
    LPCTSTR lpText,    // address of text in message box
    LPCTSTR lpCaption, // address of title of message box
    UINT uType         // style of message box
);


这些参数,尤其是最后一个,需要一些解释:
HWND hWnd:过一会儿我将向你介绍一个不含有它的函数,我保证。
LPCTSTR lpText:这是将要显示在消息框里的文本。你可以用\n等调整一下格式。
LPCCTSTR lpCaption:这是显示在消息框标题栏里的文本。
UINT uType:这个参数可以联合使用几个不同的标记。这些标记可以根据你的目的选择,有好多MB_打头的标记供你选择,联合使用时要用“|”分隔开。下面列出了一些常用的:

……
按钮类
MB_ABORTRETRYIGNORE:建立有“Abort”“Retry”“Ignore”按钮的消息框。
MB_OK:建立有“OK”按钮的消息框。
MB_OKCANCEL:建立有“OK”“Cancel”按钮的消息框。
MB_RETRYCANCEL:建立有“Retry”、和“Cancel”按钮的消息框。
MB_YESNO:建立有“Yes”“NO”按钮的消息框。
MB_YESNOCANCEL:建立有“Yes”“No”“Cancel”按钮的消息框。

……
图标类
MB_ICONEXCLAMATION:加个惊叹号图标。
MB_ICONINFORMATION:加个消息图标。(好像是个问号)
MB_ICONQUESTION:加个问号图标
MB_ICONSTOP:加个停止图标。

……
默认按钮标志
MB_DEFBUTTON1:设置第一个按钮为默认按钮。(默认按钮即消息框弹出后,直接敲回车就被按下的那个按钮)
MB_DEFBUTTON2:第二个为默认按钮。
MB_DEFBUTTON3:第三个为默认按钮。
MB_DEFBUTTON4:第四个为默认按钮。

……
其它的标志
MB_HELP:添加一个帮助按钮。通常按下该按钮或者敲F1键都将产生WM_HELP消息。
MB_RIGHT:文本右对齐。
MB_TOPMOST:设置消息框总在窗口的最上面。

我不知道你是怎么想的,但是我想Microsoft一定有一个程序员除了一件事,其它什么都不做,那就是全天写#define声明!^_^ 如果消息框建立失败,返回值为0,否则是下列任一个值:
IDABORT“Abort”按钮被选择。
IDCANCEL“Cancel”按钮被选择。
IDIGNORE“Ignore”按钮被选择。
IDNO“No”按钮被选择。
IDOK“OK”按钮被选择。
IDRETRY“Retry”按钮被选择。
IDYES“Yes”按钮被选择。
以上说了这么多,我几乎都忘了我们原来的话题了。总之,当收到WM_CLOSE消息,你可以做两件事儿。一件是你接受默认的处理返回一个值,你若这样做了,应用程序或窗口按照计划关闭;再者,你返回0,应用程序或窗口将保持原样。以下是代码的基本部分:

if (msg == WM_CLOSE)
{
    if (MessageBox(hMainWindow, "Are you sure want to quit?", "Notice", MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
        return(0);

    // otherwise, let the default handler take care of it
}


WM_DESTROY
消息有点儿不同。它是窗口正在关闭时发出的。当得到WM_DESTROY消息的时候,窗口已经从视觉上被删除。一个主窗口被关闭,并不意味着应用程序结束了,它将在没有窗口的条件下继续运行。然而,当一个用户关闭了主窗口,也就意味着他要结束应用程序,所以如果你希望应用程序结束,在收到WM_DESTROY消息的时候,你必须发出一个WM_QUIT消息。你可以使用PostMessage()函数,但由于这是一个特殊的情况,就为它准备了一个特殊的函数:

VOID PostQuitMessage(int nExitCode);

参数nExitCode是你的应用程序返回给Windows的一个退出代码(通常是0)。记住,WinMain()返回的是一个int(实数),不是void(空的)。nExitCode参数的值被赋值给wparamWM_QUIT消息表示要关闭应用程序,所以得到这个消息后,你应跳出循环,把wparam返回给Windows。下面是一个简单的WinMain()函数实例:

int WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    // initialization stuff goes here

    // main loop - infinite!
    while (TRUE)
    {
        // check the message queue
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) // exit main loop on WM_QUIT
            break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        // main program logic goes here
    }

    // perform any shutdown functions here - releasing objects and such

    return(msg.wparam); // return exit code to Windows
}


对不起,罗罗嗦嗦讲了这么多,但这些都是你必须要了解的。继续你对我的耐心,让我们看看基础的GDI图形。

阅读(2809) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册