如下图所示,显示了三种不同风格的Combo Box样式。当然,现在这样看不出第一种与第三种之间的区别,但是第二种与其他两种的区别是明显的,第二种的列表框始终是出于现实状态的。

Combo Box: 
一个下拉组合框控件拥有文本框及列表框的功能。
它允许用户通过输入文本到下拉组合框中或者从
下拉列表中选择相应的条目。
Combo Box拥有三种风格
Drop-down combo box   可输入文本或在下拉列表中选择,当鼠标点击右方的下拉箭头时显示下拉列表框  (CBS_DROPDOWN)
Simple combo box      可输入文本或在列表中选择,列表框一直显示  (CBS_SIMPLE)
Drop-down list box      只能在下拉列表中选择,当鼠标点击右方的下拉箭头时显示下拉列表框  (CBS_DROPDOWNLIST)

有了直观的感受,现在来就来看如何实现它。其实它的实现并不是很困难,通过一个CreateWindow函数即可实现,如果需要对它的功能进行添加或者是美化外观之类的,可能就需要对它的窗口过程进行重写了(只是推测,并未实现,有兴趣的话可以动手试一试),在CreateWindow之后调用SetWindowLong设置其窗口过程处理函数。说了这么多,先来看看代码吧!

  1. #include <WINDOWS.H>
  2. #include <COMMCTRL.H>
  3. #pragma comment(lib, "comctl32.lib")
  4. #define DROP_DOWN_COMBO     1
  5. #define SIMPLE_COMBO        2
  6. #define DROP_DOWN_LIST      3
  7. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  8. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  9. {
  10. WNDCLASS wc;
  11. HWND hwnd;
  12. HWND drop_down_hwnd, simple_combo, drop_down_list;
  13. MSG msg;
  14. int i;
  15. wc.cbClsExtra = 0;
  16. wc.cbWndExtra = 0;
  17. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  18. wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
  19. wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
  20. wc.hInstance = hInstance;
  21. wc.lpfnWndProc = WndProc;
  22. wc.lpszClassName = TEXT("TEST");
  23. wc.lpszMenuName = NULL;
  24. wc.style = CS_HREDRAW | CS_VREDRAW;
  25. if (!RegisterClass(&wc))
  26. {
  27. MessageBox(NULL, TEXT("Register class error!"), TEXT("ERROR"), MB_ICONERROR | MB_OK);
  28. return 0;
  29. }
  30. hwnd = CreateWindow(TEXT("TEST"), TEXT("TEST"), WS_OVERLAPPEDWINDOW, 10, 10, 300, 400, NULL,
  31. NULL, hInstance, NULL);
  32. if (hwnd == NULL)
  33. {
  34. MessageBox(NULL, TEXT("Create window error!"), TEXT("ERROR"), MB_ICONERROR | MB_OK);
  35. return 0;
  36. }
  37. /* Create drop-down combo box */
  38. drop_down_hwnd = CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWN | CBS_HASSTRINGS,
  39. 10, 20, 80, 100, hwnd, (HMENU)DROP_DOWN_COMBO, hInstance, NULL);
  40. /* Add some text into the drop-down combo box */
  41. for (i=0;i<=20;i++)
  42. {
  43. char temp[10];
  44. SendMessage(drop_down_hwnd,CB_ADDSTRING,0,(LPARAM)itoa(i,temp,10));
  45. }
  46. /* Create simple combo box */
  47. simple_combo = CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SIMPLE | CBS_HASSTRINGS,
  48. 100, 20, 80, 100, hwnd, (HMENU)SIMPLE_COMBO, hInstance, NULL);
  49. /* Add some text into the simple combo box */
  50. for (i=0;i<=20;i++)
  51. {
  52. char temp[10];
  53. SendMessage(simple_combo,CB_ADDSTRING,0,(LPARAM)itoa(i,temp,10));
  54. }
  55. /* Create drop-down list combo box */
  56. drop_down_list = CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
  57. 190, 20, 80, 100, hwnd, (HMENU)DROP_DOWN_LIST, hInstance, NULL);
  58. /* Add some text into the drop-down list combo box */
  59. for (i=0;i<=20;i++)
  60. {
  61. char temp[10];
  62. SendMessage(drop_down_list,CB_ADDSTRING,0,(LPARAM)itoa(i,temp,10));
  63. }
  64. ShowWindow(hwnd, nShowCmd);
  65. UpdateWindow(hwnd);
  66. while (GetMessage(&msg, NULL, 0, 0))
  67. {
  68. TranslateMessage(&msg);
  69. DispatchMessage(&msg);
  70. }
  71. return 0;
  72. }
  73. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  74. {
  75. switch (msg)
  76. {
  77. case WM_CREATE:
  78. return 0;
  79. case WM_DESTROY:
  80. PostQuitMessage(0);
  81. return 0;
  82. }
  83. return DefWindowProc(hwnd, msg, wParam, lParam);
  84. }

可以看到在程序的一开始我引入了COMMCTRL.H这个头文件,需要说明一下,在这个头文件中包含了windows的一些通用控件,比如说上面创建的combo box就是其中之一。在创建combo box窗口时,分别用到了CBS_DROPDOWN、CBS_SIMPLE和CBS_DROPDOWNLIST三种风格,接下来就是给控件发送CB_ADDSTRING消息添加条目,对于更多的消息可以在MSDN上面去查看。此外,还有一个当时没注意的问题,把我给困扰了很久,那就是窗口的高度,之前写程序的时候,没有注意这个问题,写出来的控件下拉框始终弹不出来,有种说法是要重写窗口处理函数,在其中处理WM_LBUTTONDOWN消息,并发送CB_SHOWDROPDOWN消息来显示,还需处理CBN_SELCHANGE消息,其实并没有必要。默认的就可以到达那样的效果,如果是下拉列表未弹出来,检查你的窗口高度是否合理。当然,在combo box插入的条目可能会很多,固定的窗口高度并不可行,因为这时只能通过键盘的上下箭头来移动选取,使用起来不是很方便。这时就需要加入垂直滚动条了,在创建时加入WS_VSCROLL即可,这下使用起来就方便多了

Win32 SDK Combo Box的更多相关文章

  1. Combo Box的简单使用(Win32)

    1 SendMessage函数向窗口发送消息 LRESULT SendMessage( HWND hWnd,     // handle to destination window UINT Msg, ...

  2. Win32 SDK程序创建一些控件(简单调用InitCommonControlsEx,并指定ICC_LISTVIEW_CLASSES控件就可以了)

    在Win32 SDK中创建一些控件的时候需要注意一下(具体是哪些控件请参看MSDN文档中列出来的) /* MSDN:Carries information used to load common co ...

  3. 【转】VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)

    原文网址:http://www.jizhuomi.com/software/189.html 上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常 ...

  4. 下拉列表框Combo Box

    Combo Box/Combo Box Ex 组合窗口是由一个输入框和一个列表框组成.创建一个组合窗口可以使用成员函数: BOOL CListBox::Create( LPCTSTR lpszText ...

  5. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  6. Win32 SDK:ListBox 为什么不整个 LB_SETTEXT

    Win32 & SDK: ListBox 有个 LB_GETTEXT,为什么没有 LB_SETTEXT,想修改指定Item的Text,还真不容易. 自已写了一个,支持单选和多选模式,部分代码: ...

  7. Check Box、Radio Button、Combo Box控件使用

    Check Box.Radio Button.Combo Box控件使用 使用控件的方法 1.拖动控件到对话框 2. 定义控件对应的变量(值变量或者控件变量) 3.响应控件各种消息 Check Box ...

  8. VC++、Win32 SDK、MFC的区别

    这是一个初进行开发人员都可能遇到过的概念不清的问题,自己当年也同样有过误解,做技术我感觉一定要专,但是,不代表毫不关心相关的知识,至少概念层次上要知道,所以,这里还是再把这些内容纪录下来,好记性不如烂 ...

  9. Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou

    android无法静态显示ui效果. Missing styles. Is the correct theme chosen for this layout? Use the Theme combo ...

随机推荐

  1. 明天学习一下验证码的匹配和thinkphp第十三章

    333333333 js 冒泡排序 var arr=[17,19,5,90,3];window.onload=function(){// alert(arr[0]);var len=arr.lengt ...

  2. ubuntu下pip install mysql-python 失败的解决方案

    ubuntu连接mysql 需要安装mysql-python 出现can not find mysql-config 文件错误 先安装 sudo apt-get install libmysqld-d ...

  3. hdu_5858_Hard problem(数学题)

    题目链接:hdu_5858_Hard problem 题意: 让你求阴影部分面积 题解: 推推公式就行 #include<stdio.h> #include<math.h> # ...

  4. 如何自定义JSR-303标准的validator

    在web应用中为了保证数据的有效性而对用户提交的表单数据是必需的,而前台客户端的验证例如javascript并不总是那么安全和可靠,这样我们就需要一个健壮的后台验证框架来处理这个问题.好在java发布 ...

  5. informix建临时表索引

    对于特殊字段,比如外键,主键,在不知道外键主键名的情况下,需要如下操作select constrname from sysconstraints where constrtype='R' and ta ...

  6. BestCoder Round #86 A B C

    这次BC终于不像上次一样惨烈 终于A了三题…… 终测ing…… 发一波题解…… A.Price List A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了…… ...

  7. Smarty 注册变量

    关于smarty类的一些解析 特别注意左右分隔符<{}>,display------显示模板的内容(里面是.html文件),assign-------注册变量 <?php //是一个 ...

  8. 安卓手机微信页面position: fixed位置错误

    今天做项目的时候发现动用position: fixed做弹窗时,用margin-top:50%这样外边距来响应式的控制位置时,在微信里打开页面的弹窗,弹窗在手机上显示的位置和实际上在手机上的位置不一样 ...

  9. Python 学习笔记8

    在最想放弃的时候 想想美好的事情 想想明天. 今天继续看错误与异常. http://www.pythondoc.com/pythontutorial3/errors.html

  10. Merge Into 用法

    从一个数据库的一张表同步数据到另外一个数据库的一张表,同步的数据不是insert就是update. 一般做法是先判断当前数据在另外一张表存不存在,存在则更新,不存在则插入.需要一次查询判断:exist ...