2011-05-07 55 views
1

如何在運行時更改使用資源定義創建的COMBOBOX控件的高度,以便我可以在組合框中插入新字符串?字符串插入代碼正在工作,但前提是我在資源定義中爲組合框設置了固定的高度(例如28個單位)。但這不方便,因爲字符串的數量是動態的。更改COMBOBOX的高度

我知道我可以在運行時創建的對話,但後來我不能使用對話框單位,和資源更加有效......

這裏是我的代碼精簡版本。

資源文件:主窗口和對話框

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控件的高度」和「在組合框中插入新字符串」是如何相關的? COMBOBOX窗口的固定高度僅取決於系統字體大小。 – 2011-05-07 20:50:39

+0

如果高度太小,則無法看到新插入的字符串。 COMBOBOX資源的高度參數包括下拉區域的高度。 – Midas 2011-05-07 20:58:22

回答

0

在此期間,我找到了解決方案。這是我現在使用的。我將資源文件中組合框的高度設置爲14 DLU(一個項目的高度),以便正確計算新高度。使用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,它將返回每個對話框單元的像素數。如果您使用的是非系統字體,則以下知識庫文章詳細介紹了計算 - How To Calculate Dialog Base Units with Non-System-Based Font

您可以通過使用SetWindowPos以編程方式更改組合框的大小。

+0

我嘗試使用'SetWindowPos',但後來我只想改變高度。不是x,y和寬度。我怎樣才能做到這一點? – Midas 2011-05-07 20:55:43

+0

SetWindowPos帶有一些控制哪些值有意義的標誌。例如'SWP_NOMOVE'指示SetWindowPos忽略'x,y'值,所以使用正確的標誌組合可以調整您想要調整的特定值。當然,您可以獲取當前窗口的寬度和高度,然後將其傳遞給SetWindowPos,只調整高度。例如GetWindowRect可用於獲取當前寬度等。 – 2011-05-07 21:18:36