2012-04-06 188 views
2

我確定這個問題對於所有的專家來說都是如此的容易,但我是C++的新手,並試圖在我的程序中添加一個組合框到「選項」對話框中,我做了以下工作,但仍然無法看到組合框中的任何項目,請告訴我我在這裏錯過了什麼。C++ win32:將值添加到組合框

在Resourse.h

#define IDD_TRIGGER_MODE 201

在Project.rc

COMBOBOX IDD_TRIGGER_MODE, 64,22,68,14,WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN

任何.cpp文件我有folliwng代碼:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ 
int wmId, wmEvent; 
PAINTSTRUCT ps; 
HDC hdc; 

switch (message) 
{ 
case WM_COMMAND:  
    ///Other codes/// 
     case IDM_OPTIONS:  

    g_hToolbar = CreateDialog(hInst, MAKEINTRESOURCE(IDD_OPTION_BOX), hWnd, ToolDlgProc); 
    if(g_hToolbar != NULL) 
    { 
     ShowWindow(g_hToolbar, SW_SHOW); 
    }   
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    break; 
///Other codes/// 
} 

的ToolDlgProc功能:

INT_PTR CALLBACK ToolDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
UNREFERENCED_PARAMETER(lParam); 
HWND fgModes; 

switch (message) 
{ 
case WM_INITDIALOG: 
    fgModes = ::GetDlgItem(hDlg, IDD_TRIGGER_MODE); 
    fgModes = GetDlgItem(hDlg, IDD_TRIGGER_MODE); 
    if(fgModes!=NULL){ 
    if(SendMessage(fgModes,CB_ADDSTRING,0, reinterpret_cast<LPARAM (_T("FreeRun")))==NULL){    
     return (INT_PTR)FALSE ;   
    }     
    return (INT_PTR)TRUE; 
    } 

case WM_COMMAND: 
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
    { 
     EndDialog(hDlg, LOWORD(wParam)); 
     return (INT_PTR)TRUE; 
    } 
    break; 
} 
return (INT_PTR)FALSE; 
} 

我用它來解決任何想法來解決t他的問題,謝謝

+0

關於此的reinterpret_cast ((LPCTSTR)模式[COUNT]));你爲什麼傳遞模式[Count]?它看起來不正確。只是一個想法。 – octopusgrabbus 2012-04-06 18:54:48

+0

,因爲我想傳遞數組中的值。你有什麼建議? – user261002 2012-04-06 18:57:25

+0

您是否驗證了'GetDlgItem()'返回了一個非NULL'HWND'? SendMessage(CB_ADDSTRING)'的返回值是什麼?如果成功,它將返回插入字符串的索引。最後,你正在將'char *'投射到'LPCTSTR'。如果您的應用程序是啓用Unicode編譯的,則'LPCTSTR'將映射到'wchar_t *'而不是'char *'。您不能將'char *'強制轉換爲'wchar_t *'。你應該改變你的數組來保存'TCHAR *'條目而不是'char *'條目。 – 2012-04-06 19:34:53

回答

4

非常感謝你的幫助。但我注意到我的代碼沒有問題,只是.rc文件中ComboBox的大小很小(因爲我在C++ API中缺乏實驗),所以現在將其更改爲42,現在可以看到我的項目。這裏是編輯的代碼:

COMBOBOX IDD_TRIGGER_MODE, 64,22,69,42,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST

+0

有同樣的問題,解決了我的確切問題。 – abelito 2012-12-01 13:30:46

+1

在我看來,這是在Win32中使用ComboBoxes的一個大問題。我在Win32 ComboBox示例頁面上發佈了關於它的信息:'ComboBox上的高度要求 - ComboBox下拉的大小首先包含在組合框的高度參數中。否則,它將切斷任何下拉元素。「https://msdn.microsoft.com/en-us/library/windows/desktop/hh298364(v=vs.85).aspx – phyatt 2015-03-09 19:11:04

2

變化:

SendMessage(fgModes,CB_ADDSTRING,0, reinterpret_cast<LPARAM>("FreeRun")); 

要:

SendMessage(fgModes,CB_ADDSTRING,0, reinterpret_cast<LPARAM>(_T("FreeRun"))); 

也就是有你混合CreateWindow/Ex和資源的好理由?我假設CreateWindow/Ex,因爲我看到你使用WndProc作爲第一個cpp,而不是DialogProc

+0

嗨邁克,謝謝你的幫助,我改變了SendMessage(),我注意到它返回NULL值,你知道爲什麼嗎?也關於CreateWindow/Ex我是C++編程的新手,這就是爲什麼林不知道我在做什麼,你在推薦什麼? – user261002 2012-04-07 09:46:52

+0

它應該爲第一項返回0,因爲它表示列表框中字符串的從零開始的索引。一串字符串沒有出現在視覺上嗎? – 2012-04-07 13:58:55