2012-04-06 5 views
2

이 질문은 모든 전문가가 쉽게 할 수 있지만 C++을 처음 사용하고 프로그램에서 "Option"대화 상자에 comboBox를 추가하려고 할 때 다음을 수행했습니다. 하지만 여전히 콤보 상자의 항목을 볼 수 없으므로 여기에 누락 된 내용을 알려주십시오. Resourse.h에서C++ win32 : ComboBox에 값 추가

: Project.rc에서 #define IDD_TRIGGER_MODE 201

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

나는 folliwng 코드가 .cpp 파일의 모든 :

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

나는 어떤 아이디어로도 풀 수있다.

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

또한 당신이 CreateWindow/Ex과 자원을 혼합하는 좋은 이유가 :

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

에 그의 문제는 당신

+0

((LPCTSTR) 모드 [COUNT])); 왜 모드를 지나는거야 [Count]? 그것은 옳지 않습니다. 그냥 생각. – octopusgrabbus

+0

배열에서 값을 전달해야하기 때문에. 너는 무엇을 제안 하는가? – user261002

+0

'GetDlgItem()'이 NULL이 아닌'HWND'를 반환하는지 확인 했습니까? 'SendMessage (CB_ADDSTRING)'의 반환 값은 무엇입니까? 성공하면 삽입 된 문자열의 색인을 반환합니다. 마지막으로,'char * '를'LPCTSTR'에 캐스트하고 있습니다. 앱이 유니 코드를 지원하도록 컴파일 된 경우,'LPCTSTR'은'char *'대신'wchar_t *'에 매핑 될 것입니다. 'char *'를'wchar_t * '에 캐스트 할 수 없다. 'char *'엔트리 대신'TCHAR *'엔트리를 저장하도록 배열을 변경해야한다. –

답변

4

도움을 주셔서 대단히 감사드립니다. 하지만 내 코드에 문제가 없다는 것을 알았습니다. 단순히 .rc 파일의 ComboBox 크기가 매우 작았습니다 (C++ API의 내 부족으로 인해). 그래서 42로 변경하여 이제는 내 항목을 볼 수 있습니다. 여기서 편집 코드 :이 reinterpret_cast 관한

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

+0

동일한 문제가 발생하여 정확한 문제를 해결했습니다. – abelito

+1

이것은 내 생각에 Win32에서 ComboBoxes를 사용하기위한 큰 문제입니다. Win32 ComboBox 예제 페이지에 대한 정보를 게시했습니다. 'ComboBox의 높이 요구 사항 - 처음에는 콤보 상자의 높이 매개 변수에 포함될 콤보 상자의 드롭 다운 크기입니다. 그렇지 않으면 모든 요소를 ​​차단합니다. 'https://msdn.microsoft.com/en-us/library/windows/desktop/hh298364(v=vs.85).aspx – phyatt

2

변경 감사? 내가 CreateWindow/Ex라고 가정하고 있기 때문에 당신은 WndProc을 첫 번째 cpp로 사용하고 있습니다. DialogProc이 아닙니다.

+0

안녕 Mike, 도와 줘서 고마워, 내가 SendMessage() 변경하고 나는 그 NULL 값을 반환 알림, 왜 그 이유를 아십니까?또한 CreateWindow/전에 대해서도 C++ 프로그래밍에 익숙하지 않은 이유는 무엇입니까? – user261002

+0

첫 번째 항목은 목록 상자에있는 문자열의 인덱스 (0부터 시작 함)를 나타 내기 때문에 0을 반환해야합니다. 문자열이 아직 시각적으로 보이지 않았습니까? –