2012-04-06 97 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