效果如下:

原创-转载请著名来源

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. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

  2. 添加AppWidget功能

    要为程序添加AppWidget 1 首先要建立一个继承于AppWidgetProvider的类 MyWidget public class MyWidget extends AppWidgetProv ...

  3. upgrade to ubuntu14.04, ibus input

    升级后ibus拼音输入很奇怪,可能和其他输入法产生混淆.解决很简单,只要打开终端输入 ibus-daemon -drx 不用重启或者登出问题便解决.

  4. rman datafile恢复(归档模式)

    模拟环境   1. 做操作之前先备份数据库 RMAN> run {   # Hot database level 0 whole backup   allocate channel t1 typ ...

  5. 在Win2008上运行ASP.NET 1.1程序

    在之前的文章<将Web站点由IIS6迁移至IIS7>中已经提到了关于在Win2008下运行ASP.NET 1.1程序的问题,但还不够完整,因此在这里重新整理一下. 1.要安装.net fr ...

  6. oracle安装不容易啊

    oracle 配置方面,电脑端使用的是ORALE 10G 64位,PLSQL DEVELOPER使用32位,ORACLE CLIENT使用11.5版本.之前一直因为ORACLE 使用32位,导致在电脑 ...

  7. 关于oracle中创建新表时将我们要用的表的结构和数据都复制过去

    今天在oracle中遇到了一个问题,就是给我查询出来了一张表的数据,只有部分的字段,让我将这张表的结构和数据放到新的临时表中,并进行数据的查询. 我是这样做的: 如:create table tabl ...

  8. JAVA 通过LDAP获取AD域用户及组织信息

    因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的A ...

  9. webstorm编辑RN代码提示功能

    需要下载一个文件. 1. 进入你想存储这个文件的目录,按住shift+鼠标右键,选择“在此处打开命令窗口” 2. 在命令窗口中输入  git clone https://github.com/virt ...

  10. 基于mini2440的uboot移植(一)

    一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体 ...