C++ Win32,如何在Win32 DialogBox中添加下拉菜单

5

C++ Win32,如何在Win32 DialogBox中添加下拉菜单

您好,

这是我第一次在stackoverflow上发布问题。

我正在尝试将组合框(在menu.cpp中)添加到Win32 Dialogbox(在fingerspell.cpp中)。我对Win32编程不是很熟练,大部分的msdn示例片段都是在窗口内绘制组合框。即使Dialogbox从技术上讲也是一个窗口,但我在修改任何窗口示例代码以处理DialogBox方面没有取得太多进展。我真的需要一个可行的示例。

以下是代码的草图。fingerspell.cpp创建并实现了WinMain函数,然后调用其他自定义类在此DialogBox内进行绘制。没有使用其他窗口控件,如按钮、文本区域等。

fingerspell.cpp的代码如下:

#include "fingerspell.h"
extern "C" __declspec(dllexport)bool isGloveDriverInstalled();
extern "C" __declspec(dllimport)bool initialize();

#define RUN( x ) if ( SUCCEEDED( result ) ) { result = x; }

BOOL g_fullscreen = FALSE;
bool portReady;

INT_PTR CALLBACK OptionDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{
    switch (uMsg) {
        case WM_INITDIALOG:
            if (wParam == IDOK)
                return TRUE ;
            else
                return FALSE ;
            break;

        case WM_COMMAND:
            if (HIWORD(wParam) == BN_CLICKED) {
                if (LOWORD(wParam) == IDOK) {
                    g_fullscreen = TRUE;
                    EndDialog (hwndDlg, 1) ;
                }
                else if (LOWORD(wParam) == ID_WINDOW_OPT) {
                    g_fullscreen = FALSE;
                    EndDialog (hwndDlg, 1) ;
                }
                else {
                    EndDialog (hwndDlg, 0) ;
                }

                return TRUE ;
            }

        default:
            return FALSE;
            break ;
    }
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    INT_PTR DispOption = DialogBox (hInstance, MAKEINTRESOURCE(IDD_DISPLAY_OPTIONS), NULL, OptionDialogProc) ;
    if (DispOption == 0)
        return 0 ;

    //srand( GetTickCount( ) );

    HRESULT result = S_OK;

    if (!isGloveDriverInstalled())
    {
        portReady = FALSE;
        MessageBox(NULL, "The Glove Driver is not istalled ", "Error", MB_OK );
    }
    else 
    {
        if (!initialize())
        {
            portReady = FALSE;
            MessageBox(NULL, "Error Opening Com Port", "Error", MB_OK );
        }
        else
        {
            portReady = TRUE;
        }
    }

    RUN( Words ::Create     ( "default.txt" ) );
    RUN( Window::Create     ( ) );
    RUN( Render::Create     ( ) );
    RUN( Art   ::Create     ( ) );
    RUN( Menu  ::Create     ( ) );
    RUN( Window::MessageLoop( ) );
    RUN( Menu  ::Destroy    ( ) );
    RUN( Art   ::Destroy    ( ) );
    RUN( Render::Destroy    ( ) );
    RUN( Window::Destroy    ( ) );
    RUN( Words ::Destroy    ( ) );

    if ( FAILED( result ) )
    {
        MessageBox( GetDesktopWindow( ), "Warning - Fail Code Detected", "Fingerspell 2002", MB_ICONWARNING | MB_OK );
    }

    return result;
}

这是一个menu.cpp文件的代码,我正在尝试添加一个组合框。

#include "fingerspell.h"

#include <windows.h>  //include all the basics
#include <tchar.h>    //string and other mapping macros
#include <string>

HRESULT Menu::Create(  )
{
    // set menu as the background
    Render::SetBackground( ART_MENU );
    // clear overlay
    Render::Reset( );
    Window::SetProc( Proc );
    return S_OK;
}

HRESULT Menu::Destroy( void )
{
    return S_OK;
}

LRESULT CALLBACK Menu::Proc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    DWORD i ;

    const static RECT button_rect[ 8 ] =
    {
        { 52,  139, 52 + 101,  139 + 50 }, //1. about
        { 55,  212, 55 + 85,  212 + 50 }, // 2. learn
        { 67,  280, 67 + 63,  280 + 50 }, // 3. exit
        { 397, 137, 397+ 233, 137 + 50 }, // 4. Add Delete List. 
        { 421, 187, 421+ 183, 187 + 50 }, // 5. add word
        { 413, 247, 413+ 201, 247 + 50 }, // 6. delete word
        { 450, 300, 450+ 124, 300 + 50 }, // 7. practice
        { 473, 349, 473 + 82,  349 + 50 }, // 8. test



    };

    // custom message processing

    switch ( uMsg )
    {
        case WM_CREATE:
            return OnCreate(hwnd,reinterpret_cast<CREATESTRUCT*>(lParam));



        case WM_MOUSEMOVE: // move is moved, see where  is it pointing to. 
        {
            int xPos = GET_X_LPARAM( lParam );
            int yPos = GET_Y_LPARAM( lParam );

            for ( i = 0; i < 8; i++ )
            {
                if ( xPos >= button_rect[ i ].left && yPos >= button_rect[ i ].top )
                {
                    if ( xPos < button_rect[ i ].right && yPos < button_rect[ i ].bottom )
                    {
                        // set selection

                        Render::SetOverlay( 0, (ART) ( ART_MENU_LEARN + i ), button_rect[ i ].left, button_rect[ i ].top );

                        break;
                    }
                }
            }

            if ( i == 8 )
            {
                 //remove selection

                Render::SetOverlay( 0, ART_NULL, 0, 0 );
            }

            return 0;
        }

        case WM_LBUTTONDOWN:
        {
            switch ( Render::GetOverlay( 0 ) )
            {
                case ART_MENU_EXIT: // done. 
                {
                    Menu::Destroy( );

                    Learn::Create( );

                    break;
                }

                case ART_MENU_LEARN: // done 
                {
                    Menu::Destroy( );

                    About::Create( );

                    break;
                }


                case ART_MENU_ABOUT: // done 
                {
                    Menu::Destroy( );

                    Test::Create( );

                    break;
                }

                case ART_MENU_TEST: // done. 
                {
                    Menu::Destroy( );

                    Practice::Create( );

                    break;
                }


                case ART_MENU_DELETEWORD: // done 
                {
                    Menu::Destroy( );

                    AddWord::Create( );

                    break;
                }

                case ART_MENU_ADDDELETELIST:
                {
                    //Menu::Destroy () ;

                    PostQuitMessage( 0 );

                    break;
                }

                case ART_MENU_ADD:
                {
                    Menu::Destroy( );

                    // About is place holder. should be AddDELETELIST
                    About::Create( );

                    break;
                }

                case ART_MENU_PRACTICE: // done. 
                {
                    Menu::Destroy( );

                    // About is place holder. shd be DELETEWORD. 
                    About::Create( );

                    break;
                }




            }

            return 0;


        }



    }

    // default message processing

    return DefWindowProc( hwnd, uMsg, wParam, lParam );
}

感谢您的选择。
谢谢。

你在用Visual Studio吗?它有一个编辑器可以让你拖放控件。 - Jay
2个回答

2

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接