zoukankan      html  css  js  c++  java
  • 关于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);

    效果:
    1

    BUG:
    当尝试删除某些文本内容时会出现无法删除!(光标移动了,但内容还在)
    删除效果
    当内容增多, 出现滚动条后, 并尝试拖动滚动条时:
    2

    正确的处理方式

    实际上, 一开始我把文本颜色/文本背景/背景画刷搞混淆了, 所以才会出现各种堪称奇葩的效果.
    根据 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

  • 相关阅读:
    点名
    2017.6.11 NOIP模拟赛
    HEOI 2012 旅行问题
    【1】【JUC】JDK1.8源码分析之ReentrantLock
    Git撤销&回滚操作
    源码分析之CountDownLatch
    【1】AQS详解
    循环屏障CyclicBarrier以及和CountDownLatch的区别
    【JUC】CountDownLatch
    匿名内部类中使用的外部局部变量为什么只能是final变量
  • 原文地址:https://www.cnblogs.com/memset/p/handling_wm_ctlcoloredit.html
Copyright © 2011-2022 走看看