如下图所示,显示了三种不同风格的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. openwrt杂记

    /etc/config/wireless是在boot启动时生成的. 代码在/etc/init.d/boot中,如下: /sbin/wifi detect > /tmp/wireless.tmp  ...

  2. agnentX学习存在疑问?

    在RFC2741中这样定义: 4.3中有如下段落: A general architectural division of labor between master agent and  subage ...

  3. Kettle启动及简单操作(1)

    官方Hadoop配置 http://wiki.pentaho.com/display/BAD/Configuring+Pentaho+for+your+Hadoop+Distro+and+Versio ...

  4. 网页 JavaScript的DOM操作

    今天,我首先对之前学习的内容进行了复习,然后学习了当鼠标指向某一个按钮时,切换对应的背景图片. <div id="d1"> </div> <input ...

  5. 转 精选37条强大的常用linux shell命令组合

    1 删除0字节文件 find . -type f -size 0 -exec rm -rf {} \; find . type f -size 0 -delete 2 查看进程,按内存从大到小排列 p ...

  6. 借助nginx搭建反向代理服务器小例

    1 反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接 ...

  7. Struts2--课程笔记1

    第一个Struts程序: 在开发Struts程序之前,首先要导入额外的jar包,基本需求的是14个jar包,关于14个ja包是什么,有什么作用,此处不讲述. 还要配置web.xml文件,注册Strut ...

  8. 《Windows驱动开发技术详解》之IRP的同步

    应用程序对设备的同步异步操作: 大部分IRP都是由应用程序的Win32 API函数发起的.这些Win32 API本身就支持同步和异步操作.例如,ReadFile.WriteFile和DeviceIoC ...

  9. Redhat_AS5下安装MySQL5.0总结

    一.引言 使用Linux也有几年时间了,由于公司要做radius服务器用用到MySQL.从网上找了些资料. 二.安装Mysql 1.下载MySQL的安装文件 安装MySQL需要下面两个文件: MySQ ...

  10. Java实现Redis持久化到数据库的关键方法

    import java.util.Date; import java.util.Iterator; import java.util.Set;   import redis.clients.jedis ...