关于WM_CTLCOLOREDIT的处理的一些问题

在为duilib封装系统控件的过程中, 再一次遇到了系统EDIT控件文字颜色/文字背景颜色的处理问题. 不要小看这个消息, 她很可能不会让你如愿以偿.

其实我要的目的很简单:

1. 改变文字颜色
                      2. 改变文字背景颜色

下面列举我遇到的几种可以说成是有点奇葩的现象

不自动刷新其余部分背景

代码:

static HBRUSH hbr;
SetTextColor(HDC(wParam), RGB(0,255,0));
if(!hbr) hbr = CreateSolidBrush(RGB(255,0,0));
return LRESULT(hbr);

效果:

看似正常, 实际不正常

代码:

static HBRUSH hbr;
SetTextColor(HDC(wParam), RGB(0,255,0));
SetBkMode(HDC(wParam), TRANSPARENT);
if(!hbr) hbr = CreateSolidBrush(RGB(255,0,0));
return LRESULT(hbr);

效果:

BUG:

当尝试删除某些文本内容时会出现无法删除!(光标移动了,但内容还在)

当内容增多, 出现滚动条后, 并尝试拖动滚动条时:

正确的处理方式

实际上, 一开始我把文本颜色/文本背景/背景画刷搞混淆了, 所以才会出现各种堪称奇葩的效果.

根据 Paint problem when handling WM_CTLCOLOREDIT 的回答, 不能使用 SetBkMode 来设置透明!

设置文字颜色:

SetTextColor

设置文字背景颜色: 
                      SetBkColor

设置没有文字的区域的背景画刷颜色:

返回画刷句柄

测试代码:

static HBRUSH hbr;
SetTextColor(HDC(wParam), RGB(0,255,0));
SetBkColor(HDC(wParam), RGB(150,0,0));
if(!hbr) hbr = CreateSolidBrush(RGB(150,0,0));
return LRESULT(hbr);

女孩不哭 @ cnblogs.com/memset @ 2014-06-24

关于WM_CTLCOLOREDIT的处理的一些问题,布布扣,bubuko.com

时间: 2024-12-23 19:34:54

关于WM_CTLCOLOREDIT的处理的一些问题的相关文章

事件处理程序WinProc

事件处理函数是一个回调函数,Windows在窗体中发生须要处理的事件时,在主时间循环中调用该函数.时间处理函数可处理不论什么想处理的事件,其它的事件传递给Windows进行处理. 在用户和Windows运行某些操作时,将生成一些针相应用程序的事件和消息,全部这些消息都将进入一个队列中,而针对一个应用程序窗体的事件和消息将从消息队列中转移到该窗体的私有队列中. 然后主事件循环将获取这些消息并将它们发送给窗体的WinProc进行处理. 消息处理函数的原型是: LRESULT CALLBACK Win

所有CN_消息的说明

Notification Message Corresponding WindowsConstant Message Description cn_CharToItem wm_CharToItem The wm_CharToItem message is sent to the parent of a list box when a character is pressed.cn_Command wm_Command The wm_Command message is sent when the

转载几篇别人写的皮肤类控件的技术文章

原连接:http://blog.sina.com.cn/s/blog_4c3538470100ezhu.html 实现控件的透明背景 很多情况下,我们需要控件 的背景是透明的,就是要求直接看到控件父窗口的背景颜色.背景位图,比如标签控件.单选Radio控件.复选Check控件,通常都要求在父窗口的背景上 进行绘制.然而要求控件的画布透明,这个技术在GDI的文档中没有看到Microsoft作任何说明,当然还是有别的办法. 其一: 如果程序支持桌面主题服务的话,则可调用主题服务的API来实现背景.我

Windows Message Codes

https://www.autoitscript.com/autoit3/docs/appendix/WinMsgCodes.htm WM_ACTIVATE 0x0006 WM_ACTIVATEAPP 0x001C WM_AFXFIRST 0x0360 WM_AFXLAST 0x037F WM_APP 0x8000 WM_APPCOMMAND 0x0319 WM_ASKCBFORMATNAME 0x030C WM_CANCELJOURNAL 0x004B WM_CANCELMODE 0x001F

windows消息常量值

WM_NULL = 0WM_CREATE = 1应用程序创建一个窗口WM_DESTROY = 2一个窗口被销毁WM_MOVE = 3移动一个窗口WM_SIZE = 5改变一个窗口的大小WM_ACTIVATE = 6一个窗口被激活或失去激活状态:WM_SETFOCUS = 7获得焦点后WM_KILLFOCUS = 8失去焦点WM_ENABLE = 10改变enable状态WM_SETREDRAW = 11设置窗口是否能重画 WM_SETTEXT = 12应用程序发送此消息来设置一个窗口的文本WM_

WINDOWS特有的消息常量标识符

'========================================'WINDOWS特有的消息常量标识符'========================================Public Const WM_NULL = &H0&Public Const WM_CREATE = &H1& '应用程序创建一个窗口Public Const WM_DESTROY = &H2& '一个窗口被销毁Public Const WM_MOVE = &

C++windows内核编程笔记day09_day10,对话框和窗口基本控件等的使用

//设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗口背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce.hbrBackground=CreateSolidBrush(RGB(0,0,255)); //设置字体背景 SetBkColor(hdc,RGB(0,0,200)); //设置字体背景模式 SetBkMode(hdc,TRANSPARENT);//字体背景透明 //创建字体,成功返回字体,失败返回

Windows Message ID 常量列表

Windows Message ID 常量列表: namespace WindowsUtilities {  public enum WindowsMessages: int  {   WM_NULL = 0x0000,   WM_CREATE = 0x0001,   WM_DESTROY = 0x0002,   WM_MOVE = 0x0003,   WM_SIZE = 0x0005,   WM_ACTIVATE = 0x0006,   WM_SETFOCUS = 0x0007,   WM_K

全部的Windows消息对应值

以下是全部的Windows消息,   对于未在MSDN上的消息的WPARAM,   LPARAM参数解释正确的给分 [已知   :0x0313,   0x01e2,   0x01e5,   0x01eb,   0x006a] WM_NULL                                     0x0000 WM_CREATE                                 0x0001 WM_DESTROY