重绘编辑框CEdit(继承CEdit方式)

2024-06-04 05:48

本文主要是介绍重绘编辑框CEdit(继承CEdit方式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编辑框是常用控件之一,同时也是一种完全自实现较为繁琐的控件。本例实现了对编辑框的简单的自绘制,在保留其自身的强大功能的前提下,实现了编辑框的边框、背景、文字颜色以及禁用态的各种颜色的替换。
        要想重绘,我们必须知道要绘什么。通过观察默认的编辑框我们可以很清楚的看到编辑框有三个最基础的部分需要我们绘制,他们分别是3D边框、背景和文字,再进一步分析我们会发现他们是一个基本窗口的两个部分,即客户区和非客户区。这样一来我们就知道应该用什么函数有针对性的绘制什么区域了,由于提供了源码,这里仅就基本原理和技术细节加以讨论,不过多地罗列代码。
        为了绘制非客户区,我重载了OnNcPaint函数,通过这个函数可以很轻松的去掉编辑框3D外观,画成我们自己想要的形式。至于客户区,为了保留编辑框光标闪烁、字符处理、自动回行等功能,我并未重载OnPaint函数。也就是说我并未重绘客户区,而是选择了一个替代的办法。
        我们使用编辑框,用的就是它的文本编辑功能,而我们想要改变的只是文字及背景颜色。通过这种分析我们就会很清楚我们需要做的事情,那就是设置文字颜色和背景色。我用的方法是重载CtlColor函数,在其中根据编辑框禁用和启用的不同状态,设置了不同的颜色,很好的实现了预期目的。
        从严格意义上来说,我并没有对编辑框重绘,只是简单的绘制了边缘,但同样很好的实现预期的效果。当然这个例子还有许多的不尽人意的地方,如果大家有更好的方还希望我们一同交流。

 

1. 主要实现内容
显示主要有: 边框, 背景, 文字颜色, 禁用态的各种颜色.

2. 边框
边框可以通过重载OnNCPaint实现. 
例如:
void CMyEdit::OnNcpaint()
{
    CRect rect, rc;
    CDC* pDC;
    int  nSaveDC;
 
 
    pDC = GetWindowDC();
    GetWindowRect(&rect);
    rect -= rect.TopLoeft();
 
 
    rc = rect;
    rc.InflateRect(-GetSystemMetrics(SM_CXEDGE), -GetSystemMetrics(SM_CYEDGE));
 
 
    nSaveDC = pDC->SaveDC();
    pDC->ExcludeClipRect(&rc);
    pDC->FillSolidRect(&rect, RGB(255,255,255));
    pDC->RestoreDC(nSaveDC);
 
 
    pDC->FrameRect(&rect, &CBrush(150,150,150));
    ReleaseDC(pDC);
}

3. 背景
背景可以通过重载OnEraseBkgnd实现
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default
    return 0;        
    return CEdit::OnEraseBkgnd(pDC);
}

你也可以贴图:
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
{
     //TODO: 在此添加消息处理程序代码和/或调用默认值
   

CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "C:\\res\\bmp00001.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    CBitmap* pBmp = CBitmap::FromHandle(hBitmap);
    memDC.SelectObject(pBmp);
    BITMAP bitMap;
    pBmp->GetBitmap(&bitMap);
    CRect rect;
    GetClientRect(&rect);
    //拉伸贴图
    pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bitMap.bmWidth, bitMap.bmHeight, SRCCOPY);
    memDC.DeleteDC();
    return TRUE;


    //return CEdit::OnEraseBkgnd(pDC);
}

4. 字体颜色
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{    
    pDC->SetBkMode(TRANSPARENT);                    // 透明    
    pDC->SetTextColor(RGB(255, 255, 255));            // 字体色彩    
    return (HBRUSH)GetStockObject(DKGRAY_BRUSH);    // 字体背景(OnEraseBkgnd只是避免闪烁)
}

这里需要注意的是,设置透明是在=WM_CTLCOLOR里设置的,不是在WM_CTLCOLOR中.
有=的是从父窗口反射回来的消息.当然也可以在父窗口的WM_CTLCOLOR中设置透明,不过这样就封装得不好了.

这篇关于重绘编辑框CEdit(继承CEdit方式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029235

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re