2011-05-25 96 views
5

C++的Win32,如何將下拉菜單添加到一個Win32對話框C++的Win32,如何將下拉菜單添加到一個Win32對話框

嗨,

這是我第一次發佈quesiton到計算器。

我想添加combobox(在menu.cpp中)到Win32對話框(在fingerspell.cpp中)。我在Win32 編程中不太流利,大多數msdn示例代碼片段在窗口內繪製了一個組合框。儘管Dialogbox在技術上是一個窗口,但我在修改任何窗口示例代碼來處理DialogBox方面還沒有太多進展。我真的很感激一個工作的例子。

代碼的粗略草圖如下。 fingerspell.cpp創建實現WinMain函數,然後調用其他自定義類來繪製此DialogBox。沒有其他窗口控件,如按鈕,文本區域等,被使用。對於fingerspell.cpp

代碼爲menu.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; 
} 

代碼。文件,即時嘗試添加組合框。

#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); 
} 

謝謝。

+0

您正在使用的Visual Studio?它有一個編輯器,可以讓你拖放控件。 – Jay 2011-05-25 21:33:30

回答

相關問題