关于SDL窗口程序添加MENU的一些问题和解决办法

昨天发现的影响fmod音乐播放的问题是错觉!-_-!!
第一个问题:点击菜单项时,DrawScene部分会卡住(这个问题在拖放窗口的时候也会出现!)
第二个问题:ClientArea需要调整,因为SetMenu增加了一部分Height,导致客户区大小不对,手动拖放一下窗口就会复原(这应该是SDL自己调整的)。
第三个问题:MENU中的&开始的加速键没有响应


第一个问题解决办法:用MultiThread,使用SDL_CreateThread()将处理消息的函数启一个线程,所有绘图和处理输入设备消息的部分全在线程里处理,这样就不会卡住了。(不过现在发现这样好像在拖动窗口的时候会导致桌面闪烁,这也可以理解,因为在拖动的时候DD还是在绘图,所以只能怪CPU不够强劲-_-!!)。
第二个问题解决方法:正好看到Andre LaMothe的书上提到的窗口模式的DD时,讲到了需要用AdjustWindowRect/Ex()这个函数调整客户区域大小,否则就会出现这第二个问题。
照搬大师的代码,自己又修改了一点,使窗口启动时居中!
All right,code time:
        [color=#008000]// 调整窗口大小,并使窗口居中[/color]
    [color=#0000D0]RECT[/color] window_rect = {0,0,640,480};
    [b][color=#000080]AdjustWindowRectEx[/color][/b](&window_rect,GetWindowStyle(g_hWnd),[b][color=#000080]GetMenu[/color][/b](g_hWnd)!=[color=#0000D0]NULL[/color],GetWindowExStyle(g_hWnd));
    [color=#0000D0]RECT[/color] desktop_rect;
    [b][color=#000080]GetWindowRect[/color][/b]([b][color=#000080]GetDesktopWindow[/color][/b](),&desktop_rect);
    [color=#008000]// 一定要repaint,否则会留下残像[/color]
    [b][color=#000080]MoveWindow[/color][/b](g_hWnd,((desktop_rect.right-desktop_rect.left)-(window_rect.right-window_rect.left))/2,((desktop_rect.bottom-desktop_rect.top)-(window_rect.bottom-window_rect.top))/2,window_rect.right-window_rect.left,window_rect.bottom-window_rect.top,[color=#0000D0]TRUE[/color]);
第三个问题:
解决方法有一部分用到问题一的解决方案,这个问题是由于没有TranslateMessage()这个,所以加上这个就OK了(如果没有MultiThread就惨了,画面会一卡一卡的)。
code:
        [color=#008000]// 启线程[/color]
        SDL_CreateThread(GameEvent,[color=#0000D0]NULL[/color]);
        [color=#008000]// 搬自MSDN[/color]
    MSG msg;
    [color=#0000D0]while[/color] ([b][color=#000080]GetMessage[/color][/b](&msg, [color=#0000D0]NULL[/color], 0, 0)) 
    {
        [color=#008000]//if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) [/color]
        [color=#008000]//{[/color]
                [color=#008000]// 处理退出[/color]
        [color=#0000D0]if[/color] (msg.message==WM_QUIT||bFlag==[color=#0000D0]true[/color])
        {
            [color=#0000D0]break[/color];
        }
        [color=#008000]// 需要trans,否则菜单快捷键无效[/color]
        [b][color=#000080]TranslateMessage[/color][/b](&msg);
        [b][color=#000080]DispatchMessage[/color][/b](&msg);
        [color=#008000]//}[/color]
    }

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。