如下图所示,显示了三种不同风格的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. Save Update saveOrUpdate delete

    参考:Hibernate Session的saveOrUpdate()方法 saveOrUpdate与Update的作用 Hibernate Delete query Hibernate Basics ...

  2. 使用Angular构建单页面应用(SPA)

    什么是SPA?看下图就是SPA: 下面说正经的,个人理解SPA就是整个应用只有一个页面,所有的交互都在一个页面完成,不需要在页面之间跳转. 单页面的好处是更快的响应速度,更流畅的用户体验,甚至和桌面应 ...

  3. opkg

    opkg是个安装器,小乔,功能全. root@hbg:/# opkg files opkgPackage opkg (9c97d5ecd795709c8584e972bfdf3aee3a5b846d- ...

  4. 一个简单的servlet小程序

    servlet是不能单独运行的,他是运行在web服务器或应用服务器上的java程序,或者可以说是在servlet容器上运行的,我们经常使用到的tomcat就是一个servlet容器. 他是处理HTTP ...

  5. 关于oracle数据库(4)数据类型

    数据类型 字符数据类型char:固定长度字符串,最大可以存放2000字节 字符串varchar2:可变长度字符串,最大可以存放2GB数值类型数据 数字number:可以存放整数.浮点数.实数 numb ...

  6. IAR和Keil文件包含路径设置

    在模块化编程时,为一个模块单独设置头文件是必不可少的. 在两款主流编译器中,在引用模块函数时候,包含头文件路径是必须的,那么设置文件路径的准确性就显得尤为重要. 否则,编译器会报错,无法打开某某头文件 ...

  7. linux下写脚本时-gt是什么意思

    -eq 等于-ne 不等于-gt 大于-ge 大于等于-lt 小于-le 小于等于

  8. docker network

    前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑.肯定会用到多台,因为他们都是内部私有ip,那么多台主机之间的容器如何通信?这个是个很头疼的问题!目前主流几种方法如下: 1 ...

  9. Struts2--课程笔记2

    动态方法调用(在请求的时候,再明确具体的响应方法,配置的时候不明确): LoginAction类中有两个方法some和second 1. 动态方法的调用(修改常量struts.enable.Dynam ...

  10. mysql之TIMESTAMP(时间戳)用法详解 [http://www.jb51.net/article/51794.htm]

    一.TIMESTAMP的变体 TIMESTAMP时间戳在创建的时候可以有多重不同的特性,如: 1.在创建新记录和修改现有记录的时候都对这个数据列刷新: TIMESTAMP DEFAULT CURREN ...