WinForm TabControl美化

article/2025/10/10 23:49:40

一、简述

TabControl控件是winform里非常常用的一个控件,但是默认的tab控件的标签页和文字颜色都是无法修改的。有时候我们会要用到竖排列的标签页,或者想要更改标签页的背景颜色和字体时,自带的TabControl就满足不了我们的需求了,这里简单写下TabControl控件的自定义绘制。

 


二、效果展示

追求界面美观的话可以美工做好图后,给每个标签添加图片,下面有加载图片的代码示例,这里只是示范自定义标签页和竖排列。

 


三、代码

第一步:在tabControl属性页中修改【drawMode】属性为OwnerDrawFixed

第二步:给tabControl添加【DrawItem】事件

// tabcontrol设置为可以自定义绘制标签内容
this.tabControl.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.event_tabControl_DrawItem);

第三步:重绘,实现tabcontrol控件的DrawItem事件,如下所示 

private void event_tabControl_DrawItem(object sender, DrawItemEventArgs e){TabPage changedpage = tabControl.TabPages[e.Index];//当前处理标签Rectangle backrect = tabControl.GetTabRect(e.Index);//标签背景区域Brush backbrush;//标签背景色Brush fontbrush;//标签字体颜色Font tabFont;//标签字体//Pen borderpen;//边框颜色Brush backtabcontrol = new SolidBrush(Color.FromArgb(255, 43, 87, 154));e.Graphics.FillRectangle(backtabcontrol, this.tabControl.ClientRectangle.X, this.tabControl.ClientRectangle.Y, this.tabControl.ClientRectangle.Size.Width, this.tabControl.ClientRectangle.Height);backtabcontrol.Dispose();tabControlBG = false;if (e.State == DrawItemState.Selected){backbrush = new SolidBrush(Color.FromArgb(255, 51, 102, 255));fontbrush = new SolidBrush(Color.White);tabFont = new Font("微软雅黑", 13, FontStyle.Bold, GraphicsUnit.Pixel);//borderpen = new Pen(Color.FromArgb(255, 51, 102, 255));}else{backbrush = new SolidBrush(Color.FromArgb(255, 43, 87, 154));fontbrush = new SolidBrush(Color.White);tabFont = new Font("微软雅黑", 13, FontStyle.Bold, GraphicsUnit.Pixel);//borderpen = new Pen(Color.FromArgb(255, 43, 87, 154));}//绘制标签背景e.Graphics.FillRectangle(backbrush, backrect);//绘制标签字体StringFormat _StringFlags = new StringFormat(StringFormatFlags.DirectionRightToLeft);_StringFlags.Alignment = StringAlignment.Center;_StringFlags.LineAlignment = StringAlignment.Center;e.Graphics.DrawString(tabControl.Controls[e.Index].Text, tabFont, fontbrush, backrect, _StringFlags);//绘制非标签原始名称【可依据e.State修改】 g.DrawString("呵呵", tabFont, fontbrush, backrect, new StringFormat(_StringFlags));//绘制标签边框//backrect.Offset(1, 1);//backrect.Inflate(2, 2);//e.Graphics.DrawRectangle(borderpen, backrect);backbrush.Dispose();tabFont.Dispose();fontbrush.Dispose();//borderpen.Dispose();// 背景添加图片//Bitmap b0 = new Bitmap(@"haha.png");//e.Graphics.DrawImage(b0, e.Bounds);}

 


四、隐藏选项卡标签

有时候我们想要不显示TabControl的选项卡,可以这样把选项卡标签隐藏掉。

给窗口添加load事件:

this.Load += new EventHandler(event_this_load);

在窗体Load事件中实现隐藏选项卡标签:

private void event_this_load(object sender, EventArgs e)
{// 隐藏websocket配置页面中tabcontrol的选项卡标签this.tabControl = new Region(new RectangleF(this.tabPage1.Left, this.tabPage1.Top, this.tabPage1.Width, this.tabPage1.Height));
}

以上代码完成标签的隐藏,但还存在一个问题,就是Tab + Ctrl 可以切换TabControl中的页,可以通过捕捉按键消息屏蔽 组合键:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{switch (keyData){case (Keys.Tab | Keys.Control):return true;default:break;}return base.ProcessCmdKey(ref msg, keyData);
}

这个依旧存在BUG,用Tab键,把焦点能放在选项卡上,然后用左右键控制。

如果加上屏蔽TAB键,和左右键,都可能导致一些用户操作上的BUG。

 


http://chatgpt.dhexx.cn/article/JljyJxHO.shtml

相关文章

MFC中选项卡TabControl控件的用法

前言:我这里的开发环境是VS2010,其它不同的开发环境可能会有所差别,但绝不会差太多,其根本方法一般是不会变的。 选项卡控件(英文名:TabControl),这个控件使用在开发一些比较复杂,和用户交互性比较多的软件…

C#中TabControl相关用法

最近在用C#做项目时,用到TabControl这个控件,将学到的东西做个总结: 一、拖一个TabControl控件到窗口上,在控件上点击右键,可以添加选项卡/删除选项卡;或者在属性中找到TabPages,点击进去,可以看…

【Wayland】Weston启动流程分析

Weston启动流程分析 Weston是Wayland Compositor的实现。其Server端作为独立的进程运行在系统中。MakeFile中编译成果为,“weston”的可执行程序MakeFile.am(weston 2.0.0) bin_PROGRAMS westonweston_LDFLAGS -export-dynamic weston_CPPFLAGS $(AM_CPPFLAGS)…

Weston 纹理倒置(render-gl)

纹理倒置 背景 在 render-gl 接入 frame buffer object 实现 off-screen 渲染后,发现得到的渲染图发生了180的倒置. 查阅了有关资料后,在 eglspec.1.5 中的 2.2.2.1 Native Surface Coordinate Systems 找到了答案: The coordinate system for native windows and pixmaps …

【Wayland】Wayland简介与定制指导

Wayland与Weston简介 由于某些原因。移植并定制一套基于Wayland的Compositor。Wayland与Weston,是两个相辅相成的概念。这里简单总结一下: wayland是一套为“显示”服务的协议,基于C/S结构。它定制了一套标准的接口、基本通信方式。wayland…

display:weston:weston-simple-egl

写在前面: 客户端渲染 在Wayland架构中,客户端UI的所有呈现均由客户端代码执行,通常由客户端使用的图形工具包执行。 图形工具箱可以使用其希望呈现UI元素的任何方法:在CPU上进行软件呈现,使用GLES进行硬件呈现。 W…

Ubuntu 20.04 X86成功编译运行wayland、wayland-protocols、weston,亲测有效,踩了很多坑,完美解决。

编译前期准备: 1、更换国内源: #添加阿里源 deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.c…

weston 窗口管理 (1)

窗口管理 (1) 一、概述 在传统嵌入式场景下,通常只会运行一个UI程序,故相当于单窗口程序,无需桌面服务器的介入;在桌面系统下,对于每一个UI程序而言,它们的行为相比于嵌入式场景仍然没有发生改变,其对接的仍然是窗口,只不过在同一个时刻允许多个UI程序同时运行. 无论如何对于…

weston 简介

参考???weston wiki Weston - Gentoo Wiki weston (1): Linux man pages – code.tools Weston-1.12.0 非常详尽,多图慎入:Wayland与Weston简介 - 云社区 - 腾讯云 什么是weston? Wayland是一套display server(Wayland compositor)与…

waylandweston

简单地说,Wayland是一套display server(Wayland compositor)与client间的通信协议,而Weston是Wayland compositor的参考实现。其官网为http://wayland.freedesktop.org/。它们定位于在Linux上替换X图形系统。X图形系统经历了30年左右的发展,其…

weston 1: 编译与运行傻瓜教程

本人Kubuntu版本是22.04 sudo apt-get update sudo apt-get upgrade 进入主目录 cd $HOME/ mkdir install mkdir works vim ~/.bashrc export WLD$HOME/install source ~/.bashrc cd works wayland git clone https://gitlab.freedesktop.org/wayland/wayland.git cd …

weston input 概述

weston input 概述 零、前言 本文描述了有关于 weston (基于 wayland 协议一种显示服务器的实现) 中有关于输入设备管理的部分;为了聚焦于此,本文不会对 weston 整体或 wayland 协议进行过多的阐述. 考虑到读者可能存在不同的需求,采用分层次的描述方式,主要面向以下两类人群…

weston 2: 登录后直接启动weston配置

本人Kubuntu版本是22.04 名词:SDDM(SDDM - Arch Linux 中文维基)显示管理器 配置流程如下: 1.修改配置文件 a.配置.bashrc vim ~/.bashrc //以下内容删除 #export WLD$HOME/install #export LD_LIBRARY_PATH$WLD/lib/x86_64-…

Weston介绍

Weston结构说明 Weston源码结构 clients:wayland显示客户端应用 compositor:合成器进程(服务端),窗体风 格样式处理 libweston:合成器以及客户端渲染处理以及驱动实现方式,以及wayland服务与客户…

Wayland/Weston 启动方式简介

前言 本文简单介绍 Weston 常用的几种 backend 启动方式。目前最新的 Weston 8.0.0 支持如下几种 backend: drm-backendfbdev-backendheadless-backendrdp-backendwayland-backendx11-backend 其中 headless-backend 不带任何 UI 界面,主要用于 westo…

weston设置

weston设置 屏幕旋转180度方法修改标题栏位置启动配置文件 屏幕旋转180度方法 编辑 /etc/xdg/weston/weston.ini文件,增加如下语句 [output] nameDSI-1 transform180其中name为你的显示屏名称,可以通过如下命令来查看显示屏名称: card0-DS…

Weston 窗口管理(2)

窗口管理(2) 本文基于 weston 分支 10.0.2 进行描述. 五、概述 本文为窗口管理(1)的续章,更多站在开发者角度,以 weston 的代码实现讲解窗口管理(1)中所实现的部分业务场景. 六、数据结构 在窗口管理(1)中曾经描述过 weston 具体的分层逻辑,如下: 再进一步可以把 WESTON_LAY…

01-weston 简介

参考​​​​​​weston wiki Weston - Gentoo Wiki weston (1): Linux man pages – code.tools Weston-1.12.0 非常详尽,多图慎入:Wayland与Weston简介 - 云社区 - 腾讯云 什么是weston? Wayland是一套display server(Wayland compos…

disunity的使用

1. 下载并安装好jdk: 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装教程:http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html 2.下载disunity: https://…