2011-05-07 17 views
1

コンボボックスに新しい文字列を挿入できるように、実行時にリソース定義で作成されたCOMBOBOXコントロールの高さを変更するにはどうすればよいですか?文字列挿入コードは動作していますが、コンボボックスの固定高さをリソース定義(たとえば28単位)に設定した場合のみです。しかし、文字列の数が動的なので、これは便利ではありません。コンボボックスの高さの変更

私は、実行時にダイアログを作成することができることを知っているが、その後、私は、ダイアログ単位を使用することはできません、とリソースがはるかに効率的です...ここで

は私のコードを簡略化したバージョンです。

リソースファイル:

IDD_SETTINGS DIALOG 0, 0, 100, 100 
BEGIN 
    COMBOBOX IDC_COMBO, 0, 0, 100, 14, CBS_DROPDOWNLIST 
END 

メインウィンドウやダイアログのウィンドウプロシージャ:

BOOL CALLBACK WndProcSettings(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    switch (message) { 
     case WM_INITDIALOG: 
      //... 
      break; 
     default: 
      return FALSE; 
    } 
    return TRUE; 
} 

LRESULT CALLBACK WndProcMain(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    switch (message) { 
     case WM_COMMAND: 
      switch (LOWORD(wParam)) { 
       case IDC_SETTINGS: 
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_SETTINGS), hWnd, WndProcSettings); 
        break; 
      } 
      break; 
     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return(0L); 
} 
+0

意味が明確ではありません。 この「コンボボックスコントロールの高さを変更する」と「コンボボックスに新しい文字列を挿入する」とはどのように関連していますか? COMBOBOXウィンドウの高さは、システムのフォントサイズにのみ依存します。 –

+0

高さが小さすぎると、挿入された新しい文字列は表示されません。 'COMBOBOX'リソースの高さパラメータには、ドロップダウン領域の高さが含まれます。 – Midas

答えて

0

その間、私は解決策を見つけました。ここで私は今使っているものです。私は、新しい高さが正しく計算されるように、リソースファイル内のコンボボックスの高さを14 DLU(1アイテムの高さ)に設定しました。 GetClientRectを使用して、この高さを得て、MapDialogRectでピクセルに変換します。

HWND hCtl; 
RECT rect; 

hCtl = GetDlgItem(hWnd, IDC_COMBO); 
GetClientRect(hCtl, &rect); 
MapDialogRect(hCtl, &rect); 
SetWindowPos(hCtl, 0, 0, 0, rect.right, (n_choices + 1) * rect.bottom, SWP_NOMOVE); 
1

私はあなたがコンボボックスのドロップダウン部分の高さに言及していると仮定します。

まだダイアログユニットで作業することができます。GetDialogBaseUnitsを見てください。ダイアログ単位ごとのピクセル数が返されます。非システムフォントを使用して作業している場合は、次のKBアーティクルで計算の詳細が示されます(How To Calculate Dialog Base Units with Non-System-Based Font)。

SetWindowPosを使用すると、プログラムによってコンボボックスのサイズを変更できます。

+0

'SetWindowPos'で試しましたが、高さを変更したいだけです。 x、y、幅ではありません。どうやってやるの? – Midas

+0

SetWindowPosは、意味のある値を制御するいくつかのフラグを取ります。たとえば 'SWP_NOMOVE'はSetWindowPosに' x、y'の値を無視するように指示します。正しいフラグの組み合わせを使うと、調整したい特定の値だけを調整できます。もちろん、現在のウィンドウの幅と高さを取得して、それらをSetWindowPosに渡すだけで高さを調整することができます。たとえば、GetWindowRectを使用して現在の幅などを取得できます。 –

関連する問題