如下图所示,显示了三种不同风格的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. PAT 乙级 1004. 成绩排名

    读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...

  2. 详解Bootstrap 定义按钮的样式(CSS)

    以下样式可用于<a>, <button>, 或 <input> 元素上: 更多关于Bootstrap 定义CSS样式的可查看:http://v2.bootcss.c ...

  3. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  4. Openjudge-计算概论(A)-DNA排序

    描述: 给出一系列基因序列,由A,C,G,T四种字符组成.对于每一个序列,定义其逆序对如下: 序列中任意一对字符X和Y,若Y在X的右边(不一定相邻)且Y < X,则称X和Y为一个逆序对. 例如G ...

  5. 一些牛人分享的ios技巧,保留着

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  6. 可以有效防护XSS,sql注射,代码执行,文件包含等多种高危漏洞。

    http://bbs.aliyun.com/read/137391.html <?php /** * 云体检通用漏洞防护补丁v1.1 * 更新时间:2013-05-25 * 功能说明:防护XSS ...

  7. KeyTweak(笔记本键盘设置工具) V2.20 中文版

    软件名称: KeyTweak(笔记本键盘设置工具)软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 50KB图片预览: 软件简介:KeyTweak 通过设置系统的注 ...

  8. 插件管理工具 Alcatraz

    Alcatraz 安装: https://github.com/alcatraz/Alcatraz Github官网链接 终端安装方法 mkdir -p ~/Library/Application\ ...

  9. angularJS 系列(七)---指令

    ----------------------------------------------------------------------------------- 原文:https://www.s ...

  10. C#中几种数据库的大数据批量插入

    C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插 ...