2012-04-06 23 views
2

この質問はあなたの専門家にとってはとても簡単ですが、私はC++を初めて使っていて、自分のプログラムの「オプション」ダイアログにcomboBoxを追加しようとしています。コンボボックスに項目が表示されない場合は、ここで不足していることを教えてください。 Resourse.hでC++ win32:コンボボックスに値を追加する

:Project.rcで#define IDD_TRIGGER_MODE 201

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機能:

私はfolliwngコードを持っている.cppファイル内 COMBOBOX IDD_TRIGGER_MODE, 64,22,68,14,WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN

任意の

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)モードは、[カウント]))。あなたはなぜモードを通過していますか?それは正しく見えません。ちょっとした考え。私は配列から値を渡したいので、 – octopusgrabbus

+0

です。何を指示してるんですか? – user261002

+0

'GetDlgItem()'がNULLでない 'HWND'を返すことを確認しましたか? 'SendMessage(CB_ADDSTRING)'の戻り値は何ですか?成功した場合は、挿入された文字列のインデックスを返します。最後に 'char * 'を' LPCTSTR'にキャストします。あなたのアプリケーションがUnicodeを有効にしてコンパイルされている場合、 'LPCTSTR'は' char * 'の代わりに' wchar_t * 'にマップされます。 'char *'を 'wchar_t * 'にキャストすることはできません。 'char *'エントリの代わりに 'TCHAR *'エントリを保持するように配列を変更する必要があります。 –

答えて

4

ご協力いただきありがとうございます。私は私のコードでは問題がないことに気付きました.CompoBoxのサイズが.rcファイルのComboBoxのサイズがかなり小さかったので、私は自分のアイテムを見ることができるように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と仮定しています。私はあなたがDialogProcではなく、最初のcppにWndProcを使用しているのを見ているからです。

+0

こんにちはマイク、あなたの助けてくれてありがとう、私はSendMessage()を変更し、私はNULL値を返す通知、私はなぜ知っていますか?また、CreateWindow/Exについて私はC++プログラミングの新人です、どうしてあなたは何をやっているのですか? – user261002

+0

リストボックス内の文字列の0から始まるインデックスを表すので、最初の項目は0を返します。文字列はまだ視覚的に見えませんでしたか? –

関連する問題