效果如下:

原创-转载请著名来源

1,新建颜色属性类“CNColor”:

class CNColor
{
public:
COLORREF m_crColor; //颜色RGB值
WCHAR m_cColor[]; //颜色名
CNColor(COLORREF cr, WCHAR * crStr);
~CNColor();
}; CNColor::CNColor(COLORREF cr, WCHAR * crStr)
{
this->m_crColor = cr;
lstrcpyn(m_cColor, crStr, );
} CNColor::~CNColor()
{
}

2,新建颜色列表控件类“CNColorList”:

class CNColorList
{
public:
HWND m_mHwnd;
list<CNColor*> m_mColors;  //颜色列表
private:
  //初始化颜色列表
void InitalColorArray();
public:
CNColorList();
~CNColorList();
//创建控件
int Creat(
HWND hwnd, //父窗口句柄
HINSTANCE hinst, //程序全局句柄
UINT uid, //控件号
RECT rec //控件外框大小
);
//控件消息处理
static LRESULT CALLBACK NColorListProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
//绘制子项
void DrawItem(HDC hdc, int itmId, RECT rec);
//获取字符串
CNColor* GetColorById(int nid);
};

3,新建类指针类“CNColorListPtr”

// 保存类指针
class CNColorListPtr
{
public:
UINT mUid; //ID号
CNColorList *pColorList = NULL; //颜色列表指针
WNDPROC mProc; //应用程序句柄
public:
CNColorListPtr(UINT uid,CNColorList* ptr, WNDPROC proc);
~CNColorListPtr();
}; CNColorListPtr::CNColorListPtr(UINT uid, CNColorList* ptr, WNDPROC proc)
{
mUid = uid;
pColorList = ptr;
mProc = proc;
}

4,初始化颜色列表

//初始化颜色列表
void CNColorList::InitalColorArray()
{
m_mColors.push_back(new CNColor(RGB(0xF0, 0xF8, 0xFF), L"AliceBlue"));
m_mColors.push_back(new CNColor(RGB(0xFA, 0xEB, 0xD7), L"AntiqueWhite"));
m_mColors.push_back(new CNColor(RGB(0x00, 0xFF, 0xFF), L"Aqua"));
m_mColors.push_back(new CNColor(RGB(0x7F, 0xFF, 0xD4), L"Aquamarine"));
m_mColors.push_back(new CNColor(RGB(0xF0, 0xFF, 0xFF), L"Azure"));
m_mColors.push_back(new CNColor(RGB(0xF5, 0xF5, 0xDC), L"Beige"));
m_mColors.push_back(new CNColor(RGB(0xFF, 0xE4, 0xC4), L"Bisque"));
m_mColors.push_back(new CNColor(RGB(0x00, 0x00, 0x00), L"Black"));
}

5,创建控件窗口

// 创建ColorList
int CNColorList::Creat(HWND hwnd, HINSTANCE hinst, UINT uid, RECT rec)
{
if (m_mColors.size() == )
InitalColorArray();
m_mHwnd = CreateWindow(L"combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWFIXED,
rec.left, rec.top, rec.right-rec.left, rec.bottom-rec.top, hwnd, (HMENU)uid, hinst, NULL);
WNDPROC nProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)NColorListProc); // 绑定控件事件处理程序
CNColorListPtr *mptr = new CNColorListPtr(uid, this, nProc);
SetWindowLong(hwnd, GWL_USERDATA, (LONG)mptr); // 保存当前窗口指针
list<CNColor*>::iterator ite;
for (ite = m_mColors.begin(); ite != m_mColors.end(); ite++)
{
//add string
ComboBox_AddString(
m_mHwnd,
(LPARAM)((CNColor*)(*ite))->m_cColor
);
}
return ;
}

6,定义消息处理:

// 消息处理
LRESULT CALLBACK CNColorList::NColorListProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
CNColorListPtr* ptr = (CNColorListPtr*)GetWindowLong(hwnd, GWL_USERDATA); //获取窗口指针
WNDPROC nProc = ptr->mProc;
int idx;
WCHAR str[];
switch (msg)
{
case WM_DRAWITEM:
{
if (wParam == ptr->mUid)
{
ptr->pColorList->DrawItem(
((LPDRAWITEMSTRUCT)lParam)->hDC,
((LPDRAWITEMSTRUCT)lParam)->itemID,
((LPDRAWITEMSTRUCT)lParam)->rcItem
);
}
break;
}
default:
break;
}
return CallWindowProc(nProc, hwnd, msg, wParam, lParam); //传递消息给主窗口
}

7,绘制下拉表ITEM

// 绘制子项
void CNColorList::DrawItem(HDC hdc, int itmId, RECT rec)
{
if (itmId == -) return;
CNColor *mc = GetColorById(itmId);
// 创建钢笔
HPEN pen = CreatePen(PS_SOLID, , RGB(, , ));
HBRUSH brush = CreateSolidBrush(mc->m_crColor);
SelectObject(hdc, pen);
SelectObject(hdc, brush);
RECT nrec = {
rec.left + ,
rec.top + ,
(rec.right + rec.left)*0.3,
rec.bottom -
};
FillRect(hdc, &nrec, brush);
Rectangle(hdc, nrec.left, nrec.top, nrec.right, nrec.bottom);
RECT trec = {
(rec.right + rec.left)*0.3 + ,
rec.top,
rec.right - ,
rec.bottom
};
SetTextColor(hdc, RGB(, , ));
DrawText(hdc, mc->m_cColor, -, &trec, DT_LEFT);
DeleteObject(pen);
DeleteObject(brush);
}

8,在主程序中调用控件

  8.1 定义控件ID   

  #define IDB_CRLIST 8000

  8.2 新建控件对象  

CNColorList nCr = CNColorList();

  8.3 在消息WM_CREAT中创建控件

case WM_CREATE:
nCr.Creat(
hwnd,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
IDB_CRLIST,
{ ,,, }
);
break;

原创-转载请著名来源

WIN32API 自定义颜色下拉列表控件的更多相关文章

  1. FineUI第八天----下拉列表控件

    下拉列表控件 3.模拟树的下拉列表: 其他的控件都跟Asp.net的差不多.

  2. python通过win32api轻松获取控件的属性值

    1.如何利用句柄操作windows窗体 首先,获得窗体的句柄  win32api.FindWindows() 第二,获得窗体中控件的id号,spy++ 第三,根据控件的ID获得控件的句柄(hwnd)  ...

  3. 安卓开发16:Spinner 下拉列表控件

    Spinner 下拉列表控件 创建一个activity_main.xml文件: <RelativeLayout xmlns:android="http://schemas.androi ...

  4. 下拉列表控件实例 ComboBoxControl

    下拉列表控件实例 书:151页 <?xml version="1.0" encoding="utf-8"?> <s:Application x ...

  5. ASP.NET自定义Web服务器控件-DropDownList/Select下拉列表控件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

  6. 如何在BCGControlBar工程的工具栏里面新增下拉列表控件

    通常情况下,工具栏里面都是一些按钮和图片,很少可以看到下拉列表控件,但是在某些应用场合,也需要用到下拉列表控件.今天在这里就简单讲解下如何在工具栏里添加下拉列表控件.   添加的过程也比较简单,在CM ...

  7. webdynpro 下拉列表控件

    现在界面上添加下拉列表的控件DropDownByKey 在context中创建新的node,和属性DP 返回界面,绑定DP到控件DropDownByKey的SelectedKey 初始方法中代码如下: ...

  8. Android下拉列表控件spinner-andoid学习之旅(十一)

    废话不多说,下拉列表常用的就是spinner控件. 直接上代码: package peng.liu.testview; import android.app.Activity; import andr ...

  9. 基于Jquery的下拉列表控件(个人觉得实用)

    Selectize.js Selectize 是一个基于 jQuery 的 <select> UI 控件,对于标签选择和下拉列表功能非常有用. Selectize 的目标是通过简单而强大的 ...

随机推荐

  1. [手机取证] CelleBrite UFED Touch系列使用视频

    CelleBrite UFED Touch系列产品使用指导视频 (持续更新中) 1. CelleBrite UFED Touch产品介绍

  2. SQL Server Reporting Services本机模式下的权限管理

    SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...

  3. 十五、polygon API

    How polygons are handled internally The five basic polygonal API classes Construction History and Tw ...

  4. 学习FFmpeg API

    ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...

  5. oracle 查询执行过的SQL语句

    SELECT * FROM v$sqlarea t WHERE t.FIRST_LOAD_TIME between '2016-12-23/16:03:00' and '2016-12-23/16:0 ...

  6. SQLServer 事务隔离级别

    MSSQL 事务级别 分类: 数据库2012-12-28 11:17 1050人阅读 评论(0) 收藏 举报 事务 级别 等级优化数据库 一个系统项目做大了,就会遇到性能问题.数据库的优化将是解决性能 ...

  7. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  8. ASP.NET MVC4框架揭秘 源代码下载

    http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar

  9. <读书笔记>软件调试之道 :从大局看调试-理想的调试环境

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  10. 让window.close不提示:您查看的网页正在试图关闭窗口。是否关闭此窗口?

    正常来说,当我们调用window.close来关闭从地址栏中打开的窗口时,IE会弹出提示说:您查看的网页正在试图关闭窗口,是否关闭此窗口? 你可以将window.close替换成下边的脚本,然后再测试 ...