为SDL窗口模式程序添加menu

一定要窗口模式的程序,还要有menu,找了很多资料都找不到相关内容。
老外说要hack sdl的库,进入底层,HOHO,好深奥,不解,但我就是要实现这个窗口加menu,所以主席说的好,自己动手,丰衣足食!


仔细研究了一下,给窗口加上菜单到不难。
我先用了FindWindow找到窗口handle,然后SetMenu(),搞定。
现在问题是如何响应MenuItem的Command,因为消息循环已经被SDL封装了,所以…没法处理WM_COMMAND。
思考中…
忽然想到前几天写KeyGen的时候用到的窗口子类化,于是由彼及此,想到是不是可以改写窗口过程?
于是动手尝试,OK,目的达到,就这么简单,虽然现在好像这样还有点问题,fmod的音乐播放好像被menu给搅乱了,一会再去研究一下。
It’s coding time!
[color=#008000]// 原窗口过程函数指针[/color]
[color=#0000D0]WNDPROC[/color] lpfnOldWndProc = [color=#0000D0]NULL[/color];
[color=#008000]// 窗口过程,处理菜单命令[/color]
[color=#0000D0]LONG[/color] FAR PASCAL fnWndProc([color=#0000D0]HWND[/color] hWnd,[color=#0000D0]UINT[/color] uMsg,[color=#0000D0]WPARAM[/color] wParam,[color=#0000D0]LPARAM[/color] lParam)
{
    [color=#0000D0]switch[/color](uMsg)
    {
    [color=#0000D0]case[/color] WM_COMMAND:
        [color=#0000D0]switch[/color]([color=#b000b0]LOWORD[/color](wParam))
        {
        [color=#0000D0]case[/color] IDM_NEWGAME:
            [b][color=#000080]MessageBox[/color][/b](hWnd,L[color=#808080]”asd”[/color],L[color=#808080]”asd”[/color],MB_ICONINFORMATION);
            [color=#0000D0]break[/color];
        [color=#0000D0]default[/color]:
            [color=#0000D0]return[/color] ([color=#0000D0]LONG[/color])[b][color=#000080]CallWindowProc[/color][/b](lpfnOldWndProc,hWnd,uMsg,wParam,lParam);
            [color=#0000D0]break[/color];
        }
        [color=#0000D0]break[/color];
    [color=#0000D0]default[/color]:
        [color=#0000D0]return[/color] ([color=#0000D0]LONG[/color])[b][color=#000080]CallWindowProc[/color][/b](lpfnOldWndProc,hWnd,uMsg,wParam,lParam);
        [color=#0000D0]break[/color];
    }
    [color=#0000D0]return[/color] [color=#0000D0]TRUE[/color];
}
[color=#008000]// SDL初始化部分[/color]
        [color=#008000]// 设置窗口标题[/color]
    SDL_WM_SetCaption([color=#808080]”弹球”[/color],[color=#808080]””[/color]);
    [color=#008000]// 窗口图标,暂时用这个[/color]
    SDL_WM_SetIcon(IMG_Load([color=#808080]”Images/empty.png”[/color]),[color=#0000D0]NULL[/color]);
    [color=#008000]// 设置菜单[/color]
    [b][color=#000080]SetMenu[/color][/b]([b][color=#000080]FindWindow[/color][/b]([color=#0000D0]NULL[/color],L[color=#808080]”弹球”[/color]),[b][color=#000080]LoadMenu[/color][/b]([color=#0000D0]NULL[/color],[color=#b000b0]MAKEINTRESOURCE[/color](IDR_MENU)));
    [color=#008000]// 设置屏幕分辨率,默认窗口模式[/color]
    sfMain = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
    [color=#008000]//SDL_ShowCursor(0);[/color]
    [color=#0000D0]if[/color](sfMain==[color=#0000D0]NULL[/color])
    {
        ShowErr(IDS_ERROR,IDS_SETRESFAILED);
    }
    [color=#008000]// 允许重复捕获相同的key的消息[/color]
    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
    [color=#008000]// 调用自己的窗口过程[/color]
    lpfnOldWndProc = ([color=#0000D0]WNDPROC[/color])[b][color=#000080]SetWindowLong[/color][/b]([b][color=#000080]FindWindow[/color][/b]([color=#0000D0]NULL[/color],L[color=#808080]”弹球”[/color]),GWL_WNDPROC,([color=#0000D0]DWORD[/color])fnWndProc);

博主友情提示:

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