VC++ 2010中实现自定义窗口按钮控件
- 格式:pdf
- 大小:359.10 KB
- 文档页数:6
使用 VBA 创建自定义工具栏和功能按钮自动化办公已经成为现代工作生活中必不可少的一部分。
为了提高工作效率,Microsoft Office 中的VBA(Visual Basic for Applications)成为了非常有用的工具。
在本文中,我们将学习如何使用VBA创建自定义工具栏和功能按钮,以便更好地适应我们的任务需求。
首先,让我们了解一下VBA是什么。
VBA是一种编程语言,专门用于Microsoft Office套件中的自动化任务和自定义应用程序。
通过使用VBA,我们可以根据自己的需求创建自定义功能,从而提高我们的工作效率。
创建自定义工具栏是使用VBA的第一步。
通过自定义工具栏,我们可以将我们最常用的命令和功能组织成一个便捷的工具栏,以便我们可以更轻松地使用这些功能。
下面是一些创建自定义工具栏的步骤:1. 打开Microsoft Office应用程序(如Word、Excel或PowerPoint)并进入“开发”选项卡(如果没有,需要先启用它)。
点击“自定义工具栏”按钮,选择“新建工具栏”。
2. 在弹出的对话框中,输入工具栏的名称,并选择工具栏的位置(例如,将其放置在菜单栏或快速访问工具栏下方)。
点击“确定”。
3. 打开VBA编辑器(按下Alt + F11),在左侧的“VBAProject”窗格中选择要编辑的文档(例如,“ThisWorkbook”或“Sheet1”)。
点击“插入”,然后选择“模块”。
4. 在新插入的模块中,我们可以编写与我们想要添加到工具栏的命令和功能对应的VBA代码。
例如,如果我们想要添加一个剪切文本的按钮,我们可以编写以下代码:```Sub CutText()Selection.CutEnd Sub```5. 保存并关闭VBA编辑器。
我们会回到Microsoft Office应用程序的主界面。
6. 右击自定义工具栏,选择“自定义工具栏”>“新建命令”,在弹出的对话框中选择“宏”,然后选择我们在VBA编辑器中创建的宏(在上面的例子中是“CutText”)。
VC单选按钮使用一、VC单选按钮的基本用法为了实现单选的效果,我们需要将所有的单选按钮分组。
可以使用“组框”控件来为一组单选按钮提供一个可视的边界。
然后,将每个单选按钮的属性“所属组”设置为该组框控件。
这样,用户只能在同一个组中选择一个选项。
二、VC单选按钮的属性设置除了所属组外,VC单选按钮还有其他一些重要的属性需要设置。
1.文本属性:用于显示单选按钮的文本。
可以通过在控件资源设计器中输入文本来设置。
2.默认状态:可以设置单选按钮在初始状态下被选中还是未选中。
可以通过在资源设计器中选择单选按钮并设置其属性“默认”来设置。
3.可见性:可以设置单选按钮是否可见。
可以通过设置属性“可见性”来实现。
4.启用状态:可以设置单选按钮是否可用。
可以通过设置属性“启用状态”来实现。
5.位置和大小:可以设置单选按钮在对话框中的位置和大小,以适应界面布局。
可以通过调整属性“位置”和“大小”来实现。
三、VC单选按钮的事件处理当用户选择一个单选按钮时,我们通常需要处理相应的事件。
处理事件的方式有很多,下面是一种常见的方式:通过给每个单选按钮关联一个事件处理程序。
首先,在资源设计器中选择单选按钮,并右键单击选择“属性”。
在属性面板中选择“事件”,然后选择对应的事件(如“单击”)。
然后,输入或选择一个事件处理程序的函数名。
在创建的事件处理程序函数中,我们可以执行任何我们希望在用户选择该单选按钮时执行的操作。
例如,我们可以更新其他控件的状态,执行计算或显示相关信息。
四、VC单选按钮的最佳实践在设计和使用VC单选按钮时2.分组和布局:将需要选择的选项分组,并使用边框或其他可视元素将它们分隔开。
合理布局和对齐这些组框和单选按钮,以方便用户选择。
3.默认选项:根据用户的使用习惯和需求,设置一个默认的选项。
这有助于用户快速完成任务,减少不必要的操作。
4.禁用选项:根据情况,禁用一些选项,以防止用户选择不合适的选项。
5.状态更新:当用户选择一个单选按钮时,考虑更新其他相关控件的状态,以提供一致和准确的反馈给用户。
VS2010MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)理解了为Ribbon Bar添加控件的方法。
这里继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数。
一、为Ribbon Bar添加更多Ribbon控件将在上一节实例的基础上,继续添加下拉菜单、Check Box、Combo Box等Ribbon控件。
1、首先把“Small Button”面板上的“Click”按钮改造成一个下拉菜单。
“Click”按钮有一个Behavior属性Menu Items,默认为Empty,选中它右侧会出现一个浏览按钮,点击浏览按钮会弹出“Items Editor”对话框,如下图:我们可以在上图Items下的组合框中选择按钮、分割线等,点击组合框右侧的Add按钮将其添加到下拉菜单中,添加按钮后在Properties分组中可以设置Caption(标题)、ID、Image(图片)等属性。
鸡啄米这里添加两个按钮,Caption属性分别为One Click、Double Click,ID分别为ID_ONE_CLICK、ID_DOUBLE_CLICK,Image等属性就不设置了。
此时的Ribbon Bar如下图:“Click”右侧多了一个向下的箭头,运行程序后点击此箭头会显示包含One Click和Double Click按钮的下拉菜单。
另外,上图中有一个按钮鸡啄米用红线指示了其提示信息-“Test Ribbon”,点击了此按钮我们就可以不运行程序而直接查看Ribbon界面效果。
2、在Small Button面板的右侧再添加一个面板“More Controls”,然后在Toolbox工具中找到Check Box和Combo Box控件拖入新面板,Check Box的Caption 属性设为“Websites Enable”,Combo Box的属性设为“Websites”。
(⼆)c#Winform⾃定义控件-按钮-HZHControls 官⽹前提⼊⾏已经7,8年了,⼀直想做⼀套漂亮点的⾃定义控件,于是就有了本系列⽂章。
如果觉得写的还⾏,请点个 star ⽀持⼀下吧欢迎前来交流探讨:企鹅群568015492⽬录准备⼯作该控件将继承基类控件UCControlBase,如果你还对UCControlBase不了解的下,请移步查看⾸先我们了解下要做的是什么,我们需要做⼀个可以⾃定义填充颜⾊,有圆⾓边框,有⾓标的按钮开始添加⼀个⽤户控件,命名为UCBtnExt ,继承 UCControlBase先来看看我们按钮需要⽀持的属性吧1#region字段属性2 [Description("是否显⽰⾓标"), Category("⾃定义")]3public bool IsShowTips4 {5get6 {7return this.lblTips.Visible;8 }9set10 {11this.lblTips.Visible = value;12 }13 }1415 [Description("⾓标⽂字"), Category("⾃定义")]16public string TipsText17 {18get19 {20return this.lblTips.Text;21 }22set23 {24this.lblTips.Text = value;25 }26 }2728private Color _btnBackColor = Color.White;29 [Description("按钮背景⾊"), Category("⾃定义")]30public Color BtnBackColor31 {32get { return _btnBackColor; }33set34 {35 _btnBackColor = value;36this.BackColor = value;37 }38 }3940private Color _btnForeColor = Color.Black;41///<summary>42///按钮字体颜⾊43///</summary>44 [Description("按钮字体颜⾊"), Category("⾃定义")]45public Color BtnForeColor46 {47get { return _btnForeColor; }48set50 _btnForeColor = value;51this.lbl.ForeColor = value;52 }53 }5455private Font _btnFont = new System.Drawing.Font("微软雅⿊", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); 56///<summary>57///按钮字体58///</summary>59 [Description("按钮字体"), Category("⾃定义")]60public Font BtnFont61 {62get { return _btnFont; }63set64 {65 _btnFont = value;66this.lbl.Font = value;67 }68 }6970///<summary>71///按钮点击事件72///</summary>73 [Description("按钮点击事件"), Category("⾃定义")]74public event EventHandler BtnClick;7576private string _btnText;77///<summary>78///按钮⽂字79///</summary>80 [Description("按钮⽂字"), Category("⾃定义")]81public string BtnText82 {83get { return _btnText; }84set85 {86 _btnText = value;87 lbl.Text = value;88 }89 }90#endregion有了属性是不是就更明了呢还有最后关键的⼀点东西,就是按钮的点击事件1private void lbl_MouseDown(object sender, MouseEventArgs e)2 {3if (this.BtnClick != null)4 BtnClick(this, e);5 }⾄此基本上就完⼯了,下⾯列出了完整的代码1// 版权所有黄正辉交流群:568015492 QQ:6231286292// ⽂件名称:UCBtnExt.cs3// 创建⽇期:2019-08-15 15:57:364// 功能描述:按钮5// 项⽬地址:https:///kwwwvagaa/net_winform_custom_control67using System;8using System.Collections.Generic;9using ponentModel;10using System.Drawing;11using System.Data;12using System.Linq;13using System.Text;14using System.Windows.Forms;1516namespace HZH_Controls.Controls17 {18 [DefaultEvent("BtnClick")]19public partial class UCBtnExt : UCControlBase20 {21#region字段属性22 [Description("是否显⽰⾓标"), Category("⾃定义")]23public bool IsShowTips24 {25get26 {27return this.lblTips.Visible;29set30 {31this.lblTips.Visible = value;32 }33 }3435 [Description("⾓标⽂字"), Category("⾃定义")]36public string TipsText37 {38get39 {40return this.lblTips.Text;41 }42set43 {44this.lblTips.Text = value;45 }46 }4748private Color _btnBackColor = Color.White;49 [Description("按钮背景⾊"), Category("⾃定义")]50public Color BtnBackColor51 {52get { return _btnBackColor; }53set54 {55 _btnBackColor = value;56this.BackColor = value;57 }58 }5960private Color _btnForeColor = Color.Black;61///<summary>62///按钮字体颜⾊63///</summary>64 [Description("按钮字体颜⾊"), Category("⾃定义")]65public Color BtnForeColor66 {67get { return _btnForeColor; }68set69 {70 _btnForeColor = value;71this.lbl.ForeColor = value;72 }73 }7475private Font _btnFont = new System.Drawing.Font("微软雅⿊", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); 76///<summary>77///按钮字体78///</summary>79 [Description("按钮字体"), Category("⾃定义")]80public Font BtnFont81 {82get { return _btnFont; }83set84 {85 _btnFont = value;86this.lbl.Font = value;87 }88 }8990///<summary>91///按钮点击事件92///</summary>93 [Description("按钮点击事件"), Category("⾃定义")]94public event EventHandler BtnClick;9596private string _btnText;97///<summary>98///按钮⽂字99///</summary>100 [Description("按钮⽂字"), Category("⾃定义")]101public string BtnText102 {103get { return _btnText; }104set105 {106 _btnText = value;107 lbl.Text = value;108 }109 }110#endregion111public UCBtnExt()113 InitializeComponent();114this.TabStop = false;115 }116117private void lbl_MouseDown(object sender, MouseEventArgs e)118 {119if (this.BtnClick != null)120 BtnClick(this, e);121 }122 }123 }View Code1namespace HZH_Controls.Controls2 {3public partial class UCBtnExt4 {5///<summary>6///必需的设计器变量。
VC控件随窗口大小变化而变化的方法在VC中,控件随窗口大小变化而变化的方法有多种实现方式。
下面将介绍一种比较常用的方法。
方法一:使用控件的锚点属性3.根据需要,可以调整锚点的位置和大小。
4. 在对话框的OnSize函数中添加控件调整的代码。
示例代码如下:```void CMyDialog::OnSize(UINT nType, int cx, int cy)CDialogEx::OnSize(nType, cx, cy);//获取对话框的客户区大小CRect rect;GetClientRect(&rect);//调整控件的大小和位置m_btnOK.SetWindowPos(NULL, rect.right - 100, rect.bottom - 100, 0, 0, SWP_NOZORDER , SWP_NOSIZE);```在这个示例代码中,m_btnOK是一个按钮控件的变量。
调用SetWindowPos函数可以设置控件的位置和大小。
rect.right和rect.bottom分别表示对话框客户区的右边界和底边界的坐标。
在此示例中,按钮的右下角离对话框的右下角保持了100个像素的距离。
需要注意的是,OnSize函数中必须调用基类的OnSize函数,以确保窗口的基本布局正常。
总结:使用锚点属性和OnSize函数可以实现控件随窗口大小变化而变化。
通过设置锚点的位置和大小,再在OnSize函数中根据对话框的大小调整控件的大小和位置,可以适应不同窗口大小的需求。
这种方法是比较简单、快速实现的方式,特别适用于需要调整的控件数量较少的情况。
除了使用锚点属性和OnSize函数外,还可以使用其他方式实现控件随窗口大小变化,比如使用MoveWindow函数或者使用布局管理器等。
在实际开发中,需要根据具体情况选择合适的方法。
自定义控件开发一般而言,Visual Studio 2005中自带的几十种控件已经足够我们使用了,但是,在一些特殊的需求中,可能需要一些特殊的控件来与用户进行交互,这时,就需要我们自己开发新的、满足用户需求的控件。
要开发自己的控件,有几种方法:❶复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求。
❷扩展控件(Extended Controls):就是在现有的控件基础上,派生出一个新的控件,增加新的功能,或者修改原有功能,来满足用户需求。
❸自定义控件(Custom Controls):就是直接从System.Windows.Forms.Control 类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。
要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。
同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。
所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。
下面我们就分别给大家介绍这三种方法。
❶复合控件(Composite Controls)复合控件实际上是控件的集合,类似于堆积木。
因此,可以按照用户的需求,把VS 2005工具箱中的控件任意组合起来,形成一个复合控件。
在以后使用中,将生成的这个复合控件作为一个控件来对待。
复合控件一般都是从UserControl类派生而来,因此复合控件(用户控件)可以在“UserControl测试容器”中进行测试。
复合控件的创建步骤:第一步:新建一个Windows控件库项目“CompositeControlDemo”第二步:向复合控件中添加Visual Studio 2005中的控件组合。
C#给Winform的button等控件添加快捷键三种方法第一种:Alt + *(按钮快捷键)在大家给button、label、menuStrip等控件设置Text属性时在名字后边加&键名就可以了,比如button1.text= "确定(&O)"。
就会有快捷键了,这时候按Alt+O就可以执行按钮单击事件。
第二种:Ctrl+*及其他组合键在WinForm中设置要使用组合键的窗体的KeyPreview(向窗体注册键盘事件)属性为True;然后使用窗体的KeyDown事件(在首次按下某个键时发生).实例代码:private void ***_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.F && e.Control){button1.PerformClick(); //执行单击button1的动作}}注:1、***代表窗体名称,大家可以看一下”Keys”的枚举参数,以实现自己需要2、还有一个问题,当使用Ctrl + *快捷键时,对于焦点在可写的控件(如TextBox)上时,可能会将* 键值同时输入,则需要加另一句话将Handled设置为true,以取消 KeyPress 事件。
即:private void ***_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.F && e.Control){e.Handled = true; //将Handled设置为true,指示已经处理过KeyPress事件button1.PerformClick();}}第三种:还是以button为例。
给form添加一个contextMenuStrip1,将其邦定到button上,假设为button1。
给contextMenuStrip1添加一个item,然后为它设置快捷键(就是你想加在button上的快捷键),并且将它的Visible属性设为false。
MFC中自定义控件的使用方式如下:1. 创建一个新的类,继承自CWnd或CButton等需要扩展的控件类。
2. 重载控件类的消息处理函数,如OnPaint、OnLButtonDown等。
3. 在需要使用自定义控件的地方,实例化该控件类并调用其Create成员函数进行创建。
4. 将创建好的控件添加到窗口或其他容器中。
以下是一个简单的自定义控件示例:```cpp// MyCustomControl.h#pragma onceclass CMyCustomControl : public CButton{public:CMyCustomControl();virtual ~CMyCustomControl();protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()};``````cpp// MyCustomControl.cpp#include "MyCustomControl.h"CMyCustomControl::CMyCustomControl(){}CMyCustomControl::~CMyCustomControl(){}BEGIN_MESSAGE_MAP(CMyCustomControl, CButton)ON_WM_PAINT()END_MESSAGE_MAP()void CMyCustomControl::OnPaint(){CPaintDC dc(this); // device context for paintingCRect rect;GetClientRect(&rect); // get client area rectangleCDC memDC; // create memory device contextmemDC.CreateCompatibleDC(&dc); // create compatible DC with paint DCCBitmap bitmap; // create bitmap objectbitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); // create bitmap with client area sizeCBitmap* pOldBitmap = memDC.SelectObject(&bitmap); // select bitmap into memory DC for drawing// draw your custom content here using memDC and bitmap objects// ...memDC.SelectObject(pOldBitmap); // restore old bitmap object from memory DCbitmap.DeleteObject(); // delete bitmap object when done with itmemDC.DeleteDC(); // delete memory DC when done with it}```在需要使用自定义控件的地方:```cpp// MainFrm.cpp or other relevant file#include "MyCustomControl.h"// ...CMyCustomControl* pCtrl = new CMyCustomControl(); // create custom control instancepCtrl->Create(WS_CHILD | WS_VISIBLE, CRect(10, 10, 100, 50), this, IDC_MYCUSTOMCTRL); // create custom control and add to parent window or container (e.g., CFrameWnd) as child control with ID IDC_MYCUSTOMCTRL```。
C语⾔API编写窗⼝界⾯和button近期有个同学的程序须要⽤对话框的⽅式实现,但前⾯都是通过⿊框形式完毕的,⽼师突然让添加⼀个界⾯,本来准备採⽤MFC完毕的,但后来⼀想,该程序核⼼东西是体如今它的算法上,控制台的程序并不是不好.转念⼀想,假设使⽤MFC这个⽅案好像须要再倒腾⼀遍,想到了⼤⼀在"C语⾔能⼲⼤事"中的东西,所以就准备採⽤这种形式直接完毕,投机取巧的⽅法.主要是通过调⽤Windows API界⾯的CreateWindows函数完毕,同⼀时候也能创建button,把參数设置为button,假设想响应该button,仅仅需在回调函数中添加消息WM_COMMAND推断就可以.代码例如以下:#include<windows.h>#include<stdio.h>//声明回调函数LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//主函数程序⼊⼝int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("HelloWin") ;HWND hwnd ; //⽤来保存成功创建窗⼝后返回的句柄MSG msg ; //定义消息结构体变量WNDCLASS wndclass ; //窗⼝类wndclass.style = CS_HREDRAW | CS_VREDRAW ; //指定窗⼝风格wndclass.lpfnWndProc = WndProc ; ////函数指针,指向处理窗⼝消息的函数⼊⼝wndclass.cbClsExtra = 0 ; //结构体后附加的字节数,⼀般总为0wndclass.cbWndExtra = 0 ; //窗⼝实例附加的字节数,⼀般总为0wndclass.hInstance = hInstance ; //模块句柄wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标句柄任务栏显⽰的图标wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标句柄wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜⾊COLOR_BACKGROUNDwndclass.lpszMenuName = NULL ; //菜单名的字符串wndclass.lpszClassName = szAppName ; //⾃⼰定义类名,不要与其它类名反复if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("注冊类失败!"), szAppName, MB_ICONERROR) ;return 0 ;}int x =((GetSystemMetrics(SM_CXSCREEN)/2)-200); //x居中int y =((GetSystemMetrics(SM_CYSCREEN)/2)-200); //y居中//创建窗⼝APIhwnd = CreateWindow(szAppName,TEXT("毕业设计"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);//显⽰窗⼝的API 传⼊须要显⽰的窗⼝句柄和显⽰⽅式ShowWindow(hwnd,iCmdShow);//刷新窗⼝的APIUpdateWindow(hwnd);//从系统的应⽤程序线程消息队列中取得⼀个消息while(GetMessage(&msg,NULL,0,0) > 0){DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc; //句柄PAINTSTRUCT ps;RECT rect; //矩形HINSTANCE hInstance; //窗⼝实例static HWND hwndButton[2]; //button句柄switch (message){case WM_CREATE: //创建button{hInstance = ((LPCREATESTRUCT)lParam)->hInstance;//button1hwndButton[0] = CreateWindow("BUTTON","训练",WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);//button2hwndButton[1] = CreateWindow("BUTTON","获取",WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,250,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);return 0;}case WM_PAINT: //绘制⽂字hdc = BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT("By:Eastmount CSDN制作"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hwnd,&ps);return 0;case WM_COMMAND: //响应button消息if((HWND)lParam == hwndButton[0]){MessageBox(NULL,TEXT("是否训练图⽚?"),TEXT("提⽰"),MB_YESNO|MB_ICONQUESTION);}if((HWND)lParam == hwndButton[1]){MessageBox(NULL,TEXT("是否获取图⽚?"),TEXT("提⽰"),MB_YESNO|MB_ICONQUESTION);}return 0;case WM_CLOSE: //关闭if(IDYES==MessageBox(hwnd,"是否关闭程序?","提⽰",MB_YESNO|MB_ICONQUESTION)){DestroyWindow (hwnd);}return 0;case WM_DESTROY: //退出程序PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}程序执⾏结果例如以下图所看到的:当中主要涉及到的函数原型例如以下所看到的://创建窗⼝hwnd = CreateWindow (szClassName, /* Classname */"Windows App", /* Title Text */WS_OVERLAPPEDWINDOW, /* default window */CW_USEDEFAULT, /* Windows decides the position */CW_USEDEFAULT, /* where the window ends up on the screen */544, /* The programs width */375, /* and height in pixels */HWND_DESKTOP, /* The window is a child-window to desktop */NULL, /* No menu */hThisInstance, /* Program Instance handler */NULL /* No Window Creation data */);//创建按钮hwndButton = CreateWindow("BUTTON", // predefined class"OK", // button textWS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles10, // starting x position10, // starting y position100, // button width100, // button heighthwnd, // parent windowNULL, // No menu(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),NULL // pointer not needed);最后,写这篇⽂章主要是怀念⾃⼰⼤⼀时的⽣活,从⼀个什么都不知道的孩⼦,通过学习C语⾔,C语⾔能⼲⼤事開始接触编程.同⼀时候,我觉得这个程序也是很还的⼊门程序,希望刚接触程序的同学也能够看看,编编⾃⼰感兴趣的程序、写写博客、AC题⽬、编写游戏、聊天软件、移动开发,能从程序和⽣活中找到⼀些让⾃⼰⼼灵美妙的东西.(By:Eastmount 2014-5-25 夜2点半原创CSDN)。
C#自定义带关闭按钮的TabControl实例2020年12月8日整理作者:程序人生起波澜【功能需求】1.为TabControl控件加入关闭按钮关闭按钮可由用户设置颜色属性不需要加入关闭按钮时,可以让其不显示。
鼠标放在关闭按钮上时,显示关闭按钮区域2.标签颜色实现渐变设置,美化标签3.选中的Tab标签,显示不同的渐变色4.Tab标签,可显示图标及横向文本【效果图如下】【制作流程】一.打开Visual Studio 我用的是2019版,新建项目Windows窗体控件库(.net Framework)二.在项目上添加自定义控件,名字根据自己需求,这里我命名为MyTabControl.cs三.设置项目属性,输出类型选择DLL类库,目标框架根据自己需求,建议目标框架.net Framework 版本不要太高,4.0足够以后开发使用.四.下面开始写代码:删除原项目多余的UserControl1文件,编辑我们新建的自定义控件,切换到代码视图首先,我们的控件继承原T abControl,因为我们以后要放到工具箱使用,再工具箱中显示的图标也要换以下,这里我用原来的T abControl图标[ToolboxBitmap(typeof(T abControl))]也可以自定义图标如:[ToolboxBitmap(typeof(Label), "MyControl.bmp")]space MyControl2.{3. [ToolboxBitmap(typeof(TabControl))]4.public partial class MyTabControl : TabControl5.一.以下是使用的字段和属性,我会尽量把注释写清楚,方便大家理解ing System;ing System.Collections.Generic;ing ponentModel;ing System.Drawing;ing System.Drawing.Drawing2D;ing System.Data;ing System.Linq;ing System.Text;ing System.Threading.Tasks;ing System.Windows.Forms;11.space MyControl13.{14. [ToolboxBitmap(typeof(TabControl))]15.public partial class MyTabControl : TabControl16. {17.//关闭按钮的区域18. Rectangle rectClose;19.//鼠标是否在关闭按钮上20.bool above = false;21.//Tab标签索引22.int closeindex=1000;23.//显示关闭按钮24.private bool showclose_button = true;25.//背景颜色26.private Color _backColor = Color.Transparent;27.private Image _backgroundimage = null;28.//边线颜色29.private Color _lineColor = Color.FromArgb(157, 162, 168);30.//默认标签渐变 a31.private Color _ColorDefaultA = Color.FromArgb(231, 231, 231);32. //默认标签渐变 b33.private Color _ColorDefaultB = Color.FromArgb(255, 255, 255);34.//鼠标点击渐变色a35.private Color _ColorActivateA = Color.FromArgb(184, 203, 217);36.//鼠标点击渐变色b37. private Color _ColorActivateB = Color.FromArgb(255, 255, 255);38.private Color closebutton = Color.Black;//默认关闭按钮的颜色39.//默认关闭按钮获得焦点的颜色40. private Color closebutton_focuse = Color.White;41.//关闭铵钮填充色,鼠标放上时显示的颜色42. private Color closebutton_fill = SystemColors.ControlDark;43.44. #region ---------属性------------45.46. [Description("背景色"), Category("自定义属性")]47.public Color Backcolor48. {49.get { return this._backColor; }50.set51. {52.this._backColor = value;53.this.Invalidate();54. }55. }56. [Description("背景图片"), Category("自定义属性")]57.public Image Backgroundimage58. {59.get { return this._backgroundimage; }60.set61. {62.this._backgroundimage = value;63.this.Invalidate();64. }65. }66. [Description("是否显示关闭按钮"), Category("自定义属性")]67.public bool Showclose_button68. {69.get { return this.showclose_button; }70.set71. {72.this.showclose_button = value;73.this.Invalidate();74. }75. }76.77. [Description("设置边线的颜色"), Category("自定义属性")]78.public Color linecolor79. {80.get { return this._lineColor; }81.set82. {83.this._lineColor = value;84.this.Invalidate();85. }86. }87.88. [Description("设置标签的渐变色A"), Category("自定义属性")]89.public Color colordefaulta90. {91.get { return this._ColorDefaultA; }92.set93. {94.this._ColorDefaultA = value;95.this.Invalidate();96. }97. }98.99.100. [Description("设置标签的渐变色B"), Category("自定义属性")] 101.public Color colordefaultb102. {103.get { return this._ColorDefaultB; }104.set105. {106.this._ColorDefaultB = value;107.this.Invalidate();108. }109. }110.111. [Description("点击标签的渐变色A"), Category("自定义属性")] 112.public Color coloractivatea113. {114.get { return this._ColorActivateA; }115.set116. {117.this._ColorActivateA = value;118.this.Invalidate();119. }120. }121.122.123. [Description("点击标签的渐变色B"), Category("自定义属性")] 124.public Color coloractivateb125. {126.get { return this._ColorActivateB; }127.set128. {129.this._ColorActivateB = value;130.this.Invalidate();131. }132. }133.134. [Description("关闭按钮无操作的颜色"), Category("自定义属性")] 135.public Color closebuttonc136. {137.get { return this.closebutton; }138.set139. {140.this.closebutton = value;141.this.Invalidate();142. }143. }144.145. [Description("关闭按钮获昨焦点的颜色"), Category("自定义属性")] 146.public Color closebuttonfocuse147. {148.get { return this.closebutton_focuse; }149.set150. {151.this.closebutton_focuse = value;152.this.Invalidate();153. }154. }155.156. [Description("关闭按钮的填充色"), Category("自定义属性")] 157.public Color closebuttonfill158. {159.get { return this.closebutton_fill; }160.set161. {162.this.closebutton_fill = value;163.this.Invalidate();164. }165. }166. #endregion在属性上我们使用了[Description("关闭按钮的填充色"), Category("自定义属性")]这将在Visual Studio中控件的属性窗口中显示属性的描述信息,且该属性显示在“自定义属性”节点中。