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

相关文章

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page