关于CComboBox的自绘

2023-05-16

我想,如果大家学过一些控件的自绘的话,CComboBox算是很难的一种了.首先是它本身的复杂度:它由三个控件组成(CEdit,CListBox,CButton).我想但就CEdit来讲,就够你受得了.还要想想他们之间的消息传递....不禁让人无从下手.

当然,如果想要让我自己来完全自绘控件的话,我告诉你,我确实也办不到.我想我还没有能力做这样的事情.但是对于CComboBox如果想要一些简单的效果的话,没有必要花费那么大的力气来完全重绘.我们可以利用他本身的一些属性就可以了.我这里说的都是从CComboBox直接继承下来的.

好了,废话说了一大堆.现在就开始CComboBox的自绘吧.

首先我们可以看看它的一些属性.首先最容易不理解的是Data属性(这个在VC++6.0里面在属性选项卡里面的数据列表里.但是在VS2003以上,都有一个单独的属性data).首先我们可以从这里开始.我们建立一个对话框MFC程序,拖上一个CComboBox空间,在data属性(编译器对应)里面输入数据,观察效果.很容易发现它就相当于AddString函数.当然你的程序可能不止一个选项,我们可以用Ctrl+Enter或者分号来连接下一个选项(其分别对应VC++6.0和VS2003).看看效果.声明一下,以下讨论的内容很少涉及到VC++6.0编译器.究其原因,主要是编译器的bug太多了,搞得人受不了.

我们在看看其他的几个选项.

Owner Draw属性:这个属性有三个选项:No(不解释),Fixed(固定属性的列表高度和宽度),Variable(改变列表的高度和宽度).最直白的理解分别是:不响应DrawItem(这个都不响应其他的自绘消息免谈了)、响应DrawItem(不响应MeasureItem)、响应MeasureItem(当然也响应DrawItem).从这里我们可以看到他们是一级一级的深入的.

还需要提到的是Sort属性,就是排列属性,这个属性就是为是否自动排序准备的,如果你要选择他,就得要响应CompareItem消息,然而由于我这次并没有用到他,所以暂且跳过吧.

还有一个比较重要的是Type属性:Simple(简单的,也就是相当于CEdit)、Dropdown(相当于前面说的三个控件)和DropList(可以理解成是只读的CEdit+CButton+CListBox).其中,我要说的其实就是第三种.因为第一种没的讲,第二种有太难.第三种刚刚好.

好,现在我们开始自绘.

自绘这个控件最大的几个难点是:

1. 数据的传递

2. 消息的处理.(主要是OnPaint和DrawItem).

第一个难点我们可以通过一个成员变量解决,我们先定义一个结构体:

//结构

typedef struct  tagITEMLIST

{

HICON hIcon; //图标

CString strUrl; //Url地址

CString strTitle; //标题(Url官网名称)

COLORREF clrLeft; //左边文本的颜色

COLORREF clrRight; //右边文本的颜色

}ItemList,*PItemList;

这个结构体就是用来保存从主界面传给控件的数据的.

我们可以定义一个这样的vector,方便扩充数据.接着我们按如下插入数据:

ItemList* pItem = new ItemList;

pItem->clrLeft = RGB( 0,132,114 );

pItem->clrRight = RGB( 0,255,125 );

pItem->hIcon = AfxGetApp()->LoadIcon( IDI_ICON1 );

pItem->strTitle = _T("腾讯首页");

pItem->strUrl = _T( "http://www.qq.com" );

AddString( _T("腾讯首页") );

m_vecItemList.push_back( pItem );

如果我不AddString,那么数据就加不进去.我想最大的原因应该是它内部实际上就是这个时候填充一些数据(或初始化)到这个控件上的.当然这只是猜测.具体如何我也不晓得.

这样的话,我们就完成了数据的传递,以后我们可以利用lpDrawItemStruct里面的itemID来获取其用AddString的ID号.通过这个ID号,我们可以获取到整个ItemList的结构.从而绘制相应的东西.

第二个难点我们可以使用探测法来看到底怎样触发这两个消息.

分别在DrawItem上和OnPaint上打一个断点.看什么时候进DrawItem什么时候进OnPaint.

经过这样的分析我们可以知道,当单击了按钮,显示下拉的时候,它才进DrawItem.当需要刷新非下拉区域时进入OnPaint.

两个消息分清楚之后,所有问题都迎刃而解了.

剩下的就是选中下列列表项时应该做什么操作的问题.在列表项被选中的时候,我们刷新下界面就完全搞定了./

还有一点就是下拉列表项的高度和大小的设置,这正是MeasureItem所要做的.

整个自绘过程其实也并不复杂.需要工程文件的可以留言.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于CComboBox的自绘 的相关文章

随机推荐

  • Spring源码之AbstractApplicationContext解析(refresh)

    Spring源码之AbstractApplicationContext解析 阅读前提须知 1 此源码是在我公司的随便一个Spring boot项目中查看的 xff0c 具体方法就是双击shift xff0c 搜索AbstractApplic
  • 岁月清浅,邀你入梦

    这世间本应美好 xff0c 怎无奈痛苦缠身 xff0c 卿心亦真 xff0c 免世人之苦 xff0c 乐自身之本 卿之容 xff0c 多沉醉 xff0c 于心赞 xff0c 日夜思 淡若微风的陪伴 xff0c 奈何情深缘浅 只相识 xff0
  • sqli-labs环境搭建

    sqli labs环境搭建 链接 xff1a https www fujieace com penetration test sqli labs ec html
  • python打印等腰三角形

    d 61 int input 39 enter an int 39 l 61 39 39 2 d 1 d 初始化列表 for i in range d l i 61 list l i 字符串转列表 x 61 i y 61 0 x 61 d
  • 实战|如何消除又臭又长的if...else判断更优雅的编程?

    最近在做代码重构 xff0c 发现了很多代码的烂味道 其他的不多说 xff0c 今天主要说说那些又臭又长的if else要如何重构 在介绍更更优雅的编程之前 xff0c 让我们一起回顾一下 xff0c 不好的if else代码 一 又臭又长
  • 最新版Ubuntu 17.10与Windows双系统安装、配置与美化教程(转载)

    感谢原创 xff0c 原文地址 http www jianshu com p 62d947731401 TOC 本教程基于Ubuntu 17 10 xff0c 但是除了下面的Gnome插件部分 xff0c 同时也支持Ubuntu16以上的几
  • Win8.1系统下VirtualBox的各种网络配置方法——Bridged networking

    概述配置仅界面设置桥接到无线网络接口与桥接到有线网络接口的网络相比不同操作系统下桥接网络的缺点 概述 VirtualBox使用主机系统上的一个设备驱动器 用于过滤物理网络适配器的数据 xff0c 因此也被称为网络过滤驱动器 net filt
  • 设置电脑网络唤醒-华硕主板+向日葵

    我一直用向日葵的开机棒唤醒电脑 xff0c 后来重装系统 xff0c 就开机棒失效了 由于是重装系统 xff0c 所以BIOS的设置没问题的 xff0c 就怀疑是新系统需要设置 xff0c 找了好久找到这个教程 xff0c 记录一下 参考这
  • 各种排序的运行时间对比

    冒泡排序 cpp view plain copy time 34 220s include lt cstring gt include lt iostream gt include lt fstream gt include lt algo
  • Cordova概述

    Cordova Apache Cordova is an open source mobile development framework It allows you to use standard web technologies HTM
  • Ubuntu18.04 项目配置

    有问题多重启就好啦 1 换源2 配置输入法3 安装Nvidia驱动4 安装Cuda5 下载谷歌浏览器并安装6 安装Anaconda37 pip换源8 Ubuntu18 04 无法通过蓝牙链接 Airpods9 安装PyCharm10 安装P
  • 基于numpy的CNN实现,进行MNIST手写数字识别

    主要框架来自于这篇文章 xff1a https blog csdn net qq 36393962 article details 99354969 xff0c 下面会以原文来代称这篇文章 本文在原文的基础上增加了交叉熵以及mnist数据集
  • libevent 的http模块实现http服务器

    首先声明 xff0c libevent的http模块是为单线程设计的 xff0c 如果业务逻辑中有耗时操作 xff0c 则需要自行设计线程池以便提高吞吐量 xff0c 每个工作线程中都要运行一个event base loop和一个evhtt
  • swig 使用案例

    包含数组 结构体嵌套 xff0c 函数指针传递等基本操作 swig默认不支持数组元素的写入 xff0c 如果想操作数组元素 xff0c 可以附加一些接口函数实现 比如下面在处理结构体的数组成员时 xff0c 使用 extend命令扩展了对应
  • 攻击防御实例——SQL注入

    攻击防御实例 SQL注入 1 i 表示匹配的时候不区分大小写 2 s 匹配任何不可见字符 xff0c 包括空格 制表符 换页符等等 等价于 f n r t v 3 information schema xff1a 是一个数据库 xff0c
  • 264 nal type

    NUAL HEAD 43 43 0 1 2 3 4 5 6 7 43 43 43 43 43 43 43 43 43 F NRI Type 43 43 F xff1d Forbidden zero bit 61 0 NRI 61 Nal r
  • SubClassWindow详解

    许多Windows程序员都是跳过SDK直接进行RAD开发工具 或VC xff0c 我想VC应不属于RAD 的学习 xff0c 有些人可能对子类化机制比较陌生 我们先看看什么是Windows的子类化 Windows给我们或是说给它自己定义了许
  • stl upper_bound函数实现

    写了一个upper bound的实现 其中递归使用二分法求解最上界 xff0c 虽然写的完全不像STL的风格 xff0c 但是练手还是可以的 view plaincopy to clipboardprint 01 include lt io
  • 关于TrackMouseEvent用法总结

    对于这个函数我也是最近想研究控件自绘才知道它真正怎么用 以前只是见到过 嗯 废话不多说 我先说下我的问题 如何响应鼠标离开某个窗体 控件 事件 先大概讲下步骤 然后再集中对 TrackMouseEvent 进行详解 为按钮添加以下几个函数
  • 关于CComboBox的自绘

    我想 如果大家学过一些控件的自绘的话 CComboBox算是很难的一种了 首先是它本身的复杂度 它由三个控件组成 CEdit CListBox CButton 我想但就CEdit来讲 就够你受得了 还要想想他们之间的消息传递 不禁让人无从下