Win32 Api 如何设置 Combo-box下拉列表的高度

我使用Win32Api写一个窗口小程序,建立了一个对话框,里面有一个Combo-box控件,然后在Combo-box中添加了若干条string,但是点击下拉三角时,下拉列... 我使用Win32 Api 写一个窗口小程序,建立了一个对话框,里面有一个Combo-box控件,然后在Combo-box中添加了若干条string,但是点击下拉三角时,下拉列表的高度很短,只能勉强显示一条数据,我想把所有数据都显示出来,就是让下拉列表的高度变大,我试过很多属性设置,都没能实现,求问大神,我该如何实现呢?我的代码如下void SetComboxItemList(HWND hDlg){static std::vectorstd::string vecNameList;// 设置下拉菜单HWND hwndCombox = GetDlgItem(hDlg, IDC_COMBO_KEY);if (vecNameList.empty()){ Config::GetInst()->GetNameList(vecNameList); }TCHAR szText[64];for (const std::string &name : vecNameList){CharToW(name.c_str(), szText, 64);SendDlgItemMessage(hDlg, IDC_COMBO_KEY, CB_ADDSTRING, 0, (LPARAM)szText);}SendMessage(hwndCombox, CB_SETITEMHEIGHT, (WPARAM)0, (LPARAM)15); //设置每条宽度SendMessage(hwndCombox, CBS_DROPDOWNLIST, (WPARAM)0, (LPARAM)0); // 设置StyleSendMessage(hwndCombox, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); //设置当前选中第0行} 展开
 我来答
GetSafeHwnd
2016-11-02 · TA获得超过918个赞
知道大有可为答主
回答量:1068
采纳率:76%
帮助的人:747万
展开全部

CreateWindow的时候nHeight参数设置足够大,如果Create的时候指定的高度不大

可在后面用MoveWindow再来重设其Height

(需要GetWindowRect 、ScreenToClient配合)

举例  

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    PSTR szCmdLine, int iCmdShow)

{

     static TCHAR szAppName[] = TEXT ("HelloWin") ;

     HWND         hwnd ;

     MSG          msg ;

     WNDCLASS     wndclass ;


     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;

     wndclass.lpfnWndProc   = WndProc ;

     wndclass.cbClsExtra    = 0 ;

     wndclass.cbWndExtra    = 0 ;

     wndclass.hInstance     = hInstance ;

     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;

     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;

     //wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_BTNFACE);

     wndclass.lpszMenuName  = NULL ;

     wndclass.lpszClassName = szAppName ;


     if (!RegisterClass (&wndclass))

     {

          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 

                      szAppName, MB_ICONERROR) ;

          return 0 ;

     }

     hwnd = CreateWindow (szAppName,                  // window class name

                          TEXT ("设置COMBO控件高度"), // window caption

                          WS_OVERLAPPEDWINDOW,        // window style

                          CW_USEDEFAULT,              // initial x position

                          CW_USEDEFAULT,              // initial y position

                          CW_USEDEFAULT,              // initial x size

                          CW_USEDEFAULT,              // initial y size

                          NULL,                       // parent window handle

                          NULL,                       // window menu handle

                          hInstance,                  // program instance handle

                          NULL) ;                     // creation parameters

     ShowWindow (hwnd, iCmdShow) ;

     UpdateWindow (hwnd) ;

     

     while (GetMessage (&msg, NULL, 0, 0))

     {

          TranslateMessage (&msg) ;

          DispatchMessage (&msg) ;

     }

     return msg.wParam ;

}


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     HDC         hdc ;

     PAINTSTRUCT ps ;

     RECT        rect ;

     static HWND hEdit;

static HWND hBtn;

static HWND hCombo;

TCHAR buf[1000];

int i;

switch (message)

{

case WM_CREATE:

hCombo = CreateWindow("COMBOBOX", "Combo1",CBS_DROPDOWNLIST|WS_CHILD|WS_VSCROLL, 10,20,80,50,hwnd, NULL, NULL, NULL);//高50

for(i=1;i<11;i++)

{

sprintf(buf, "第%d项", i);

SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)buf);

}

ShowWindow(hCombo, SW_SHOW);

hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), 

WS_CHILDWINDOW, 100, 100, 200, 30,

hwnd, NULL, NULL, NULL);

ShowWindow(hEdit, SW_SHOW);

hBtn = CreateWindowEx(WS_EX_WINDOWEDGE, TEXT("BUTTON"), TEXT("按钮"), 

WS_CHILDWINDOW, 340, 100, 100, 30,

hwnd, NULL, NULL, NULL);

ShowWindow(hBtn, SW_SHOW);

return 0 ;

case WM_COMMAND:

if(lParam == (LPARAM)hBtn)

{

RECT rt;

POINT p1;

int width;

int height;

GetWindowRect(hCombo, &rt);

p1.x= rt.left;

p1.y= rt.top;

width = rt.right-rt.left;

height = (rt.bottom-rt.top)*5;

ScreenToClient(hwnd, &p1);

MoveWindow(hCombo, p1.x, p1.y, width,height,TRUE); 

}

return 0;

case WM_DESTROY:

DestroyWindow(hCombo);

DestroyWindow(hEdit);

DestroyWindow(hBtn);

PostQuitMessage (0) ;

return 0 ;

     }

     return DefWindowProc (hwnd, message, wParam, lParam) ;

}

追问
太棒了,你的回答完美的解决了我的问题!非常感谢你!^_^
我还想再问一句,如果只想用户从我的下拉列表中选择内容,而不想让他们编辑内容,该怎么设置呢?
追答
如上 所示,dwStyle 参数 设置  用位运算 中的 按位或 |  添加上 CBS_DROPDOWNLIST
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式