C# winfrom TabConTrol控件背景颜色问题和标签背景图片

本文介绍了如何在C# WinForm应用中解决TabControl控件的背景颜色问题并设置标签的背景图片。通过设置DrawMode为OwnerDrawFixed,然后注册DrawItem事件,实现自定义绘制Tab页标题,从而改变控件的视觉效果。

重点:tabControl_event_sms.Invalidate();可以触发DrawItem事件。

属性中,并没有直接设置控件的BackImage属性,没办法设置主控件的背景。

第一步:

 设置TabControl控件(名称以tclDemo为例)的DrawMode属性为:OwnerDrawFixed;用于指定由用户来绘制标题

第二步:注册TabControl控件的DrawItem事件:

第三步:

private void tclDemo_DrawItem(object sender, DrawItemEventArgs e)

{

            //获取TabControl主控件的工作区域
            Rectangle rec = tclDemo.ClientRectangle;
            //获取背景图片,我的背景图片在项目资源文件中。
            Image backImage = Resources.枫叶;

            //新建一个StringFormat对象,用于对标签文字的布局设置
            StringFormat StrFormat = new StringFormat();
            StrFormat.LineAlignment = StringAlignment.Center;// 设置文字垂直方向居中
            StrFormat.Alignment = StringAlignment.Center;// 设置文字水平方向居中           

            // 标签背景填充颜色,也可以是图片
         SolidBrush bru = new SolidBrush(Color.FromArgb(72, 181, 250));
            SolidBrush bruFont = new SolidBrush(Color.FromArgb(217, 54, 26));// 标签字体颜色
            Font font = new System.Drawing.Font("微软雅黑",12F);//设置标签字体样式 
            //绘制主控件的背景
            e.Graphics.DrawImage(backImage, 0, 0, tclDemo.Width, tclDemo.Height);
            //绘制标签样式
            for (int i = 0; i < tclDemo.TabPages.Count; i++)
            {
                //获取标签头的工作区域
                Rectangle recChild = tclDemo.GetTabRect(i);
                //绘制标签头背景颜色
                e.Graphics.FillRectangle(bru, recChild);
                //绘制标签头的文字                        
         e.Graphics.DrawString(tclDemo.TabPages[i].Text,font,bruFont,recChild,StrFormat);
            }

}

2、另一种方式

Bitmap image1 = new Bitmap(@"E:\项目练习\WinFormTest\WinFormTest\res\tab_train.ico");
Bitmap image2 = new Bitmap(@"E:\项目练习\WinFormTest\WinFormTest\res\tab_station.ico");
        private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
        {
            //1、设置TabControl背景色
            TabControl tc = sender as TabControl;
            SolidBrush backgroundBlack = new SolidBrush(Color.Azure);//Tab整体背景颜色
            //填充背景色
            Rectangle rec = tc.ClientRectangle;
            e.Graphics.FillRectangle(backgroundBlack, rec);

            Bitmap[] images = { image1, image2 };
            List<Bitmap> list = new List<Bitmap>(images);
            for (int i = 0; i < tabControl1.TabPages.Count; i++)
            {
                //获取标签头的工作区域 
                Rectangle recChild = tabControl1.GetTabRect(i);
                //绘制标签头背景图片 
                Bitmap image = images[i];
                e.Graphics.DrawImage(image, recChild);
            }
        }

效果下图

C# WinForm中,常见的原生控件容器有以下几种: - **Panel**:这是一个简单的容器控件,用于对其他控件进行分组布局。它可以包含各种控件,并且可以通过设置其属性来实现滚动、背景颜色等效果。例如,可以将多个按钮、文本框等控件放在一个Panel中,方便对这些控件进行统一管理布局。 ```csharp Panel panel = new Panel(); panel.Location = new Point(10, 10); panel.Size = new Size(200, 200); this.Controls.Add(panel); ``` - **GroupBox**:它也是一种容器控件,主要用于将相关的控件组织在一起,并为这些控件提供一个带标题的边框。通常用于对一组相关的单选按钮、复选框等控件进行分组,增强界面的可读性逻辑性。 ```csharp GroupBox groupBox = new GroupBox(); groupBox.Text = "选项组"; groupBox.Location = new Point(10, 220); groupBox.Size = new Size(200, 100); this.Controls.Add(groupBox); ``` - **TabControl**:该控件提供了一个多页面的容器,每个页面由一个TabPage表示。用户可以通过点击不同的标签页来切换显示不同的内容,适用于需要在有限的界面空间内展示多个相关但不同功能的控件集合。 ```csharp TabControl tabControl = new TabControl(); tabControl.Location = new Point(220, 10); tabControl.Size = new Size(300, 300); TabPage tabPage1 = new TabPage("页面1"); TabPage tabPage2 = new TabPage("页面2"); tabControl.TabPages.Add(tabPage1); tabControl.TabPages.Add(tabPage2); this.Controls.Add(tabControl); ``` - **SplitContainer**:它允许用户通过拖动分隔条来动态调整两个子容器的大小。可以将其方向设置为水平或垂直,从而将界面划分为两个可调整大小的区域,方便用户根据自己的需求灵活调整界面布局。 ```csharp SplitContainer splitContainer = new SplitContainer(); splitContainer.Location = new Point(530, 10); splitContainer.Size = new Size(300, 300); this.Controls.Add(splitContainer); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值