WIN32API 自定义颜色下拉列表控件

效果如下:

原创-转载请著名来源

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

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

CNColor::CNColor(COLORREF cr, WCHAR * crStr)
{
this->m_crColor = cr;
lstrcpyn(m_cColor, crStr, 32);
}

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() == 0)
        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 0;
}

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[32];
    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 == -1) return;
    CNColor *mc = GetColorById(itmId);
    // 创建钢笔
    HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
    HBRUSH brush = CreateSolidBrush(mc->m_crColor);
    SelectObject(hdc, pen);
    SelectObject(hdc, brush);
    RECT nrec = {
        rec.left + 1,
        rec.top + 1,
        (rec.right + rec.left)*0.3,
        rec.bottom - 1
    };
    FillRect(hdc, &nrec, brush);
    Rectangle(hdc, nrec.left, nrec.top, nrec.right, nrec.bottom);
    RECT trec = {
        (rec.right + rec.left)*0.3 + 4,
        rec.top,
        rec.right - 2,
        rec.bottom
    };
    SetTextColor(hdc, RGB(0, 0, 0));
    DrawText(hdc, mc->m_cColor, -1, &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,
            { 20,20,160,180 }
        );
        break;

原创-转载请著名来源

时间: 2024-11-04 13:41:29

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

java Swing 之下拉列表控件

/** * Java Swing 之下拉列表控件 * @author gao */ package com.gao; import java.awt.FlowLayout; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class

webdynpro 下拉列表控件

现在界面上添加下拉列表的控件DropDownByKey 在context中创建新的node,和属性DP 返回界面,绑定DP到控件DropDownByKey的SelectedKey 初始方法中代码如下: *下拉菜单 DATA lo_nd_drop TYPE REF TO if_wd_context_node. DATA lo_el_drop TYPE REF TO if_wd_context_element. DATA ls_drop TYPE wd_this->Element_drop. dat

自定义下拉列表控件

问题及需求 输入汉字或全拼或简拼均可得到结果(此需求用原生的ComboBox不容易实现) 点击文本框时弹出下拉列表 进入文本框时弹出下拉列表 输入文字时,如果有结果,则弹出下拉列表 除文本框和下拉列表外,点击任何地方均隐藏下拉列表 单击下拉列表中的文字,文本出现在文本框,关闭下拉列表 下拉列表出现后,默认选中第一项,第一项高亮 回车后下拉列表中选中的文本出现在文本框中 2.解决思路 用Panel作为容器,装载ListView,作为下拉列表的数据容器 定义下拉列表显示方法,并使用+=将其添加到文本

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

python通过win32api轻松获取控件的属性值 2014-08-29 15:26:56|  分类: 自动化测试 |  标签:win32  |举报|字号 订阅 下载LOFTER我的照片书  | 1.如何利用句柄操作windows窗体 首先,获得窗体的句柄  win32api.FindWindows() 第二,获得窗体中控件的id号,spy++ 第三,根据控件的ID获得控件的句柄(hwnd)  GetDlgItem(hwnd,loginID) 最后,利用控件句柄进行操作 python可以通过w

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

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

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

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; //自定义web服务器控件-下拉列表 namespace MyControls { [DefaultProperty("Tex

Spinner下拉列表控件

一.Spinner控件用于显示一个下拉列表,该控件在装载数据的时候需要创建一个Adapter适配器对象.并在创建Adapter对象过程中指定要装载的数据是数组或者是List对象的数据 二.下面是spinner实例: 在main.xml文件中: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.co

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

废话不多说,下拉列表常用的就是spinner控件. 直接上代码: package peng.liu.testview; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import

DTCMS 新建下拉列表控件

初始化的时候: ddlpmzcName.DataSource = new DTcms.BLL.auction().GetpmzcName();ddlpmzcName.DataTextField = "title";ddlpmzcName.DataValueField = "id";ddlpmzcName.DataBind(); 注:ddlpmzcName是控件的ID 修改初始化的时候的绑定是:  BLL.production bll = new BLL.produc