重绘编辑框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

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制