2011-05-07 54 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