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

其实我要的目的很简单:

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

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

不自动刷新其余部分背景

代码:

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

效果:

看似正常, 实际不正常

代码:

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

效果:

BUG:

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

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

正确的处理方式

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

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

设置文字颜色:

SetTextColor

设置文字背景颜色: 
                      SetBkColor

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

返回画刷句柄

测试代码:

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

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

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

  1. C#调用SendMessage 用法

    函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一.    函数原型:LRESUL ...

  2. windows消息机制详解(转载)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...

  3. C#调用Win32API

    Win32API.cs   using System;using System.Drawing;using System.Runtime.InteropServices;using Lordal.Wi ...

  4. C#程序员开发WinForm必须知道的 Window 消息大全

    不要以为下面的东西只有C++中才会用到哦! 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用 ...

  5. Window 消息大全

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序. 消息本身是作为一个记录传递给应用程序 ...

  6. C#封装好的Win32API

    Kernel.cs using System; using System.Runtime.InteropServices; using System.Text; using HANDLE = Syst ...

  7. Windows消息大全(转)

    原链接地址: http://www.cnblogs.com/icebutterfly/archive/2011/08/05/2128864.html 表A-1 Windows消息分布 消息范围说 明 ...

  8. 初学c# -- 学习笔记(七) RichTextBox支持GIF

    园子里许明吉博客写的一篇,刚好用到这个,写的非常好.转过来了 不过在应用中也有一些问题,win10下不能中文输入,凑合着进行了修改, 下面是原来的代码: private void button2_Cl ...

  9. [C#.net] SendMessage

    函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一.     函数原型:LRESU ...

随机推荐

  1. shared_ptr<> reset

    // std_tr1__memory__shared_ptr_reset.cpp // compile with: /EHsc #include <memory> #include < ...

  2. find只查当前目录 和 -exec和xargs区别

    1.find默认查找当前目录和子目录,通过maxdepth限制只查当前目录: find . -maxdepth 1 -type f -name "*.php" 2. find . ...

  3. spring mvc实现登录+异常

    登录页面login.jsp在webroot下 <body> <form action="user/login" method="post"&g ...

  4. android-android各大手机系统打开权限管理页面

    android系统五花八门,当我们去请求用户的权限的时候,总是会弹出是否允许的对话框. 而且用户一旦不小心点了拒绝,下次就不再询问了,而很多小白用户也不知道怎么去设置.这就导致了很不好的用户体验. 经 ...

  5. PHP5.3中关于VC9和VC6以及Thread Safe和Non Thread Safe版本选择的问题

    转自:http://www.htmer.com/article/716.htm 最近在PHP官网上看到又有新版的PHP下载了,于是上去找找For Windows的版本,可是一看确傻眼了,一共给了四个版 ...

  6. C#面向对象面试题集锦

    1.简述C#中的虚方法 答:注意:当使用virtual关键字修饰符后,不允许再同时使用abstract,static,或override关键字进行修饰 使用virtual关键字修饰的方法就是虚方法,虚 ...

  7. (7)基本工作流(使用AndroidStudio编辑Cocos项目)

    接下来详细介绍一下如何使用Android Studio打开以及编辑cocos2d-x 3.10项目: 一.新建项目:   新建源代码项目,预编译库项目不支持使用Android Stduio打开,见图1 ...

  8. 用LR12录制app,用LR11跑场景,无并发数限制,已试验过,可行!

    免费使用LoadRunner对移动互联网后端服务器压力测试 一.LoadRunner简介 LoadRunner,是惠普公司研发的一款预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及 ...

  9. Eighth scrum meeting - 2015/11/2

    由于之前的在线视频播放控件功能过于简单,我们今天从网上找了一个效果还不错的视频播放开源项目,在添加了复杂的依赖后终于能够正常使用了,效果比起之前来也好了很多,而且后续的视频下载功能也可以基于这个来开发 ...

  10. 细微之处:比较两种CSS清除浮动的兼容

    http://www.cnblogs.com/bienfantaisie/archive/2011/05/27/2059597.html 清除浮动是连续浮动元素之后的必备工作,在工作中我做到需要清除浮 ...