[WTL/ATL]_[初级]_[关于CCombobox的下拉列表背景色是黑色的问题]

场景

1.在使用WTLCComboBox类时,我们创建时还是需要传递样式的,这样导致用的时候颇为麻烦,只能通过查找MSDN获取样式.当我们使用样式为CBS_DROPDOWN的时候,添加完数据后发现下拉列表的背景色是黑色的,感觉是不是Win32有缺陷啊.先不管是不是Win32的系统Combobox是否有缺陷,这个问题怎么解决?

图示1:
在这里插入图片描述

说明

1.WTL的项目基于消息映射原理我们已经讲过,如果需要在一个容器窗口里创建子控件或窗口,那么这个容器窗口在消息映射里还需要加上REFLECT_NOTIFICATIONS也就是把通知转发到子窗口里。这样子窗口才能正常响应通知.

BEGIN_MSG_MAP_EX(CView)
	MSG_WM_CREATE(OnCreate)
	MESSAGE_HANDLER(WM_PAINT, OnPaint)
	REFLECT_NOTIFICATIONS()
END_MSG_MAP()

2.在使用CCombobox并添加了REFLECT_NOTIFICATIONS后,发现它的编辑框背景色是白色了,但是点击下拉三角按钮时显示的列表选择背景却是黑色的.这时候我们需要响应WM_CTLCOLORLISTBOX消息. 并返回一个白色画刷即可.return (LRESULT)AtlGetStockBrush(WHITE_BRUSH).

BEGIN_MSG_MAP_EX(CView)
	MSG_WM_CREATE(OnCreate)
	MESSAGE_HANDLER(WM_CTLCOLORLISTBOX, OnCtlListBoxColor)
	MESSAGE_HANDLER(WM_PAINT, OnPaint)
	REFLECT_NOTIFICATIONS()
END_MSG_MAP()

3.注意响应WM_CTLCOLORLISTBOX消息里获取的HWND句柄并不是CCombobox的,而是ComboLBox也就是下拉列表控件的,它的父控件是桌面,我们可以通过VS自带的Spy工具查找该Combobox相关的窗口句柄.

LRESULT CView::OnCtlListBoxColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// 注意这个 hWnd 句柄并不是CCombobox的.
	// 是ComboLBox也就是下拉列表控件的,它的父控件是桌面
	HWND hWnd = (HWND)lParam; 
	return (LRESULT)AtlGetStockBrush(WHITE_BRUSH);
}

图示2:
在这里插入图片描述

代码

View.h

// View.h : interface of the CView class
//
/

#pragma once

enum
{
	kMyComboBoxId = WM_USER+1,
	kMyComboBoxId2
};

class CView : public CWindowImpl<CView>
{
public:
	DECLARE_WND_CLASS(NULL)

	BOOL PreTranslateMessage(MSG* pMsg);

	BEGIN_MSG_MAP_EX(CView)
		MSG_WM_CREATE(OnCreate)
		MESSAGE_HANDLER(WM_CTLCOLORLISTBOX, OnCtlListBoxColor)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
		REFLECT_NOTIFICATIONS()
	END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
	int OnCreate(LPCREATESTRUCT lpCreateStruct);
	LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
	LRESULT OnCtlColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnCtlListBoxColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
private:
	CComboBox box_debug_brand_;
	CFont font_normal_;
};

View.cpp

// View.cpp : implementation of the CView class
//
/

#include "stdafx.h"
#include "resource.h"

#include "View.h"
#include <CommCtrl.h>
#include <string>
#include <regex>
#include <atlmisc.h>

BOOL CView::PreTranslateMessage(MSG* pMsg)
{
	pMsg;
	return FALSE;
}

LRESULT CView::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	CPaintDC dc(m_hWnd);

	//TODO: Add your drawing code here

	return 0;
}

HFONT CreateFont(int pixel,bool bold,const wchar_t* font_name)
{
	LOGFONT lf; 
	memset(&lf, 0, sizeof(LOGFONT)); // zero out structure 
	lf.lfHeight = pixel; // request a 8-pixel-height font
	if(bold)
	{
		lf.lfWeight = FW_BOLD;  
	}
	lstrcpy(lf.lfFaceName, font_name); // request a face name "Arial"
	
	HFONT font = ::CreateFontIndirect(&lf);
	return font;
}


LRESULT CView::OnCtlListBoxColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// 注意这个 hWnd 句柄并不是CCombobox的.
	// 是ComboLBox也就是下拉列表控件的,它的父控件是桌面
	HWND hWnd = (HWND)lParam; 
	return (LRESULT)AtlGetStockBrush(WHITE_BRUSH);
}

int CView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	font_normal_ = CreateFont(16,false,L"Arial");

	box_debug_brand_.Create(m_hWnd,CRect(100,100,100+200,100+40),NULL, 
		WS_CHILD |WS_VISIBLE | CBS_DROPDOWN|CBS_HASSTRINGS,0,kMyComboBoxId);
	box_debug_brand_.SetFont(font_normal_);
	CEdit edit_text = box_debug_brand_.GetWindow(GW_CHILD);
	edit_text.SetReadOnly(TRUE);

	box_debug_brand_.AddString(L"csdn");
	box_debug_brand_.AddString(L"infoq");
	box_debug_brand_.AddString(L"aliyun");

	box_debug_brand_.SetCurSel(0);

	return 0;
}

图示1:
在这里插入图片描述

项目下载地址:
https://download.csdn.net/download/infoworld/12063062

参考

wm-ctlcolorlistbox

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值