學(xué)做網(wǎng)站必須php嗎seo jsbapp9
文章目錄
- 需求來源
- 實(shí)現(xiàn)思路
- 實(shí)施
- 請看VCR
- 等等別走,有優(yōu)化
需求來源
需要在鼠標(biāo)浮動到指定位置后提示出詳細(xì)的信息,一開始使用的tooltip實(shí)現(xiàn),但是里面的內(nèi)容效果并不理想,需要有條理性,于是就想到能不能將展示的東西分列。
實(shí)現(xiàn)思路
使用兩個字符串?dāng)?shù)據(jù)接收通過字符串切割后的內(nèi)容,然后通過在tooltip的draw事件繪制時將內(nèi)容分為兩次繪制。
實(shí)施
自定封裝一個ToolTip控件,繼承ToolTIp然后添加兩個事件,分別時Draw
和Popup
Draw
和 Popup
這兩個事件在 ToolTip
類中扮演著重要的角色,用于自定義工具提示的顯示和繪制。
Draw
事件在工具提示需要繪制時觸發(fā)。通過處理這個事件,可以自定義工具提示的外觀和內(nèi)容。
-
作用:
- 自定義繪制工具提示:在處理
Draw
事件時,可以完全控制工具提示的繪制,包括背景顏色、邊框、文本內(nèi)容和文本樣式等。 - 實(shí)現(xiàn)高級圖形效果:可以使用
Graphics
對象來實(shí)現(xiàn)復(fù)雜的繪制效果,比如漸變色、圖片、各種形狀等。
- 自定義繪制工具提示:在處理
-
使用場景:
- 當(dāng)默認(rèn)的工具提示外觀不能滿足需求時,可以通過
Draw
事件自定義繪制工具提示。 - 需要在工具提示中顯示非文本內(nèi)容(如圖像、圖表)時,可以在
Draw
事件中實(shí)現(xiàn)。
- 當(dāng)默認(rèn)的工具提示外觀不能滿足需求時,可以通過
Popup
事件在工具提示顯示之前觸發(fā)。通過處理這個事件,可以動態(tài)調(diào)整工具提示的大小和內(nèi)容。
-
作用:
- 動態(tài)調(diào)整工具提示大小:在處理
Popup
事件時,可以根據(jù)內(nèi)容的大小動態(tài)設(shè)置工具提示的尺寸,以確保內(nèi)容完全顯示。 - 準(zhǔn)備繪制環(huán)境:可以在
Popup
事件中進(jìn)行一些準(zhǔn)備工作,比如計(jì)算文本的最大寬度和高度,為后續(xù)的Draw
事件做準(zhǔn)備。
- 動態(tài)調(diào)整工具提示大小:在處理
-
使用場景:
- 需要根據(jù)內(nèi)容動態(tài)調(diào)整工具提示的大小時,可以在
Popup
事件中進(jìn)行計(jì)算和設(shè)置。 - 需要在工具提示顯示前進(jìn)行一些準(zhǔn)備工作,比如加載圖片、計(jì)算文本尺寸等,可以在
Popup
事件中處理。
- 需要根據(jù)內(nèi)容動態(tài)調(diào)整工具提示的大小時,可以在
using System;
using System.Drawing;
using System.Windows.Forms;namespace Test1
{// 自定義工具提示類,繼承自 ToolTippublic class CustomToolTip : ToolTip{private string[] Column1; // 用于存儲第一列的文本數(shù)組private string[] Column2; // 用于存儲第二列的文本數(shù)組private Font TextFont; // 工具提示文本的字體// 記錄第一列的寬度private int Column1MaxWidth = 0;// 構(gòu)造函數(shù),初始化自定義工具提示public CustomToolTip(){TextFont = new Font("微軟雅黑", 15.0f); // 設(shè)置字體為“微軟雅黑”,大小為15this.OwnerDraw = true; // 啟用自定義繪制工具提示this.Draw += new DrawToolTipEventHandler(OnDraw); // 訂閱 Draw 事件this.Popup += new PopupEventHandler(OnPopup); // 訂閱 Popup 事件}// 設(shè)置工具提示的內(nèi)容,將其拆分為兩列public void SetContent(string content){var parts = content.Split(new string[] { "," }, StringSplitOptions.None); // 按逗號拆分內(nèi)容int midPoint = (parts.Length + 1) / 2; // 計(jì)算拆分成兩列的中間點(diǎn)Column1 = new string[midPoint]; // 初始化第一列數(shù)組Column2 = new string[parts.Length - midPoint]; // 初始化第二列數(shù)組// 填充列數(shù)組for (int i = 0; i < parts.Length; i++){if (i < midPoint){Column1[i] = parts[i];}else{Column2[i - midPoint] = parts[i];}}}// 自定義工具提示的繪制事件處理程序private void OnDraw(object sender, DrawToolTipEventArgs e){e.DrawBackground(); // 繪制工具提示的背景e.DrawBorder(); // 繪制工具提示的邊框Brush brush = Brushes.Black; // 用于繪制文本的畫筆Rectangle rct2 = e.Bounds; // 工具提示的邊界e.Graphics.FillRectangle(Brushes.Bisque, rct2); // 用淺橙色填充背景e.Graphics.DrawRectangle(Pens.DarkGray, new Rectangle(0, 0, rct2.Width - 1, rct2.Height - 1)); // 繪制邊框// 繪制第一列文本for (int i = 0; i < Column1.Length; i++){e.Graphics.DrawString(Column1[i], TextFont, brush, new PointF(5, i * 25));}// 繪制第二列文本for (int i = 0; i < Column2.Length; i++){e.Graphics.DrawString(Column2[i], TextFont, brush, new PointF(Column1MaxWidth, i * 25));}}// 在工具提示顯示之前計(jì)算其大小的事件處理程序private void OnPopup(object sender, PopupEventArgs e){int Column2MaxWidth = 0; // 用于存儲第二列的最大寬度int maxHeight = 0; // 用于存儲工具提示的最大高度// 計(jì)算第一列的最大寬度和高度foreach (var text in Column1){var sz = TextRenderer.MeasureText(text, TextFont);if (sz.Width > Column1MaxWidth)Column1MaxWidth = sz.Width;maxHeight += sz.Height;}// 計(jì)算第二列的最大寬度foreach (var text in Column2){var sz = TextRenderer.MeasureText(text, TextFont);if (sz.Width > Column2MaxWidth)Column2MaxWidth = sz.Width;}// 確保高度適應(yīng)兩列中較高的一列maxHeight = Math.Max(maxHeight, Column2.Length * TextRenderer.MeasureText("A", TextFont).Height);e.ToolTipSize = new Size(Column1MaxWidth + Column2MaxWidth + 20, maxHeight + 30); // 設(shè)置工具提示大小,并添加一些間距}}
}
這里對字符串的分割是根據(jù),
來的,根據(jù)個人需要修改SetContent
方法中切割字符,當(dāng)然也可以封裝一下,這里本人偷懶了。
下面是使用的方式,先在我們窗體中創(chuàng)建一個自定義的Tooltip對象,具體使用就是先設(shè)置SetContent方法將要顯示的內(nèi)容傳遞進(jìn)去。最后將要tooltip關(guān)聯(lián)的控件對象綁定就行了
private CustomToolTip custom = new CustomToolTip();private void Form1_Load(object sender, EventArgs e){string aa = $"工作人員姓名:aaa,出勤地點(diǎn):aaa333344445555555555," +$"工號:aaa,出勤時間:aaa," +$"手機(jī):aaaaaaaa,本站時間:aaa," +$"站名:aaa,工作班制:aaa," +$"當(dāng)前已工作時間:aaa,班制時長:aaa1111," +$"工作人員所屬部門:aaa";custom.SetContent(aa);custom.SetToolTip(button1,aa);//這里傳遞第二個參數(shù)只要是字符串就行,因?yàn)樵赟etContent方法時已經(jīng)設(shè)置好要顯示的內(nèi)容了。}
請看VCR
等等別走,有優(yōu)化
鑒于上面我們使用的在From_Load方法中去使用自定義tip時調(diào)用SetToolTip
時第二個參數(shù)傳遞有些冗余,這里把自定義的tip控件給優(yōu)化了一下,優(yōu)化雖小也是進(jìn)步
using System;
using System.Drawing;
using System.Windows.Forms;namespace Test1
{// 自定義工具提示類,繼承自 ToolTippublic class CustomToolTip : ToolTip{private string[] Column1; // 用于存儲第一列的文本數(shù)組private string[] Column2; // 用于存儲第二列的文本數(shù)組private Font TextFont; // 工具提示文本的字體priavte Control ParentCtrl;//父窗體控件// 記錄第一列的寬度private int Column1MaxWidth = 0;// 構(gòu)造函數(shù),初始化自定義工具提示public CustomToolTip(){TextFont = new Font("微軟雅黑", 15.0f); // 設(shè)置字體為“微軟雅黑”,大小為15this.OwnerDraw = true; // 啟用自定義繪制工具提示this.Draw += new DrawToolTipEventHandler(OnDraw); // 訂閱 Draw 事件this.Popup += new PopupEventHandler(OnPopup); // 訂閱 Popup 事件}// 設(shè)置工具提示的內(nèi)容,將其拆分為兩列private void SetContent(string content){var parts = content.Split(new string[] { "," }, StringSplitOptions.None); // 按逗號拆分內(nèi)容int midPoint = (parts.Length + 1) / 2; // 計(jì)算拆分成兩列的中間點(diǎn)Column1 = new string[midPoint]; // 初始化第一列數(shù)組Column2 = new string[parts.Length - midPoint]; // 初始化第二列數(shù)組// 填充列數(shù)組for (int i = 0; i < parts.Length; i++){if (i < midPoint){Column1[i] = parts[i];}else{Column2[i - midPoint] = parts[i];}}}// 自定義工具提示的繪制事件處理程序private void OnDraw(object sender, DrawToolTipEventArgs e){e.DrawBackground(); // 繪制工具提示的背景e.DrawBorder(); // 繪制工具提示的邊框Brush brush = Brushes.Black; // 用于繪制文本的畫筆Rectangle rct2 = e.Bounds; // 工具提示的邊界e.Graphics.FillRectangle(Brushes.Bisque, rct2); // 用淺橙色填充背景e.Graphics.DrawRectangle(Pens.DarkGray, new Rectangle(0, 0, rct2.Width - 1, rct2.Height - 1)); // 繪制邊框// 繪制第一列文本for (int i = 0; i < Column1.Length; i++){e.Graphics.DrawString(Column1[i], TextFont, brush, new PointF(5, i * 25));}// 繪制第二列文本for (int i = 0; i < Column2.Length; i++){e.Graphics.DrawString(Column2[i], TextFont, brush, new PointF(Column1MaxWidth, i * 25));}}// 在工具提示顯示之前計(jì)算其大小的事件處理程序private void OnPopup(object sender, PopupEventArgs e){int Column2MaxWidth = 0; // 用于存儲第二列的最大寬度int maxHeight = 0; // 用于存儲工具提示的最大高度//設(shè)置將文本拆分兩個數(shù)組,用于后期顯示為兩列---在這里通過tip控件自帶的GetToolTip方法獲取提示文本內(nèi)容然后進(jìn)行拆分初始化SetContent(this.GetToolTip(ParentCtrl));// 計(jì)算第一列的最大寬度和高度foreach (var text in Column1){var sz = TextRenderer.MeasureText(text, TextFont);if (sz.Width > Column1MaxWidth)Column1MaxWidth = sz.Width;maxHeight += sz.Height;}// 計(jì)算第二列的最大寬度foreach (var text in Column2){var sz = TextRenderer.MeasureText(text, TextFont);if (sz.Width > Column2MaxWidth)Column2MaxWidth = sz.Width;}// 確保高度適應(yīng)兩列中較高的一列maxHeight = Math.Max(maxHeight, Column2.Length * TextRenderer.MeasureText("A", TextFont).Height);e.ToolTipSize = new Size(Column1MaxWidth + Column2MaxWidth + 20, maxHeight + 30); // 設(shè)置工具提示大小,并添加一些間距}}
}
private CustomToolTip custom ;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){custom = new CustomToolTip(button1);string aa = $"工作人員姓名:aaa,出勤地點(diǎn):aaa333344445555555555," +$"工號:aaa,出勤時間:aaa," +$"手機(jī):aaaaaaaa,本站時間:aaa," +$"站名:aaa,工作班制:aaa," +$"當(dāng)前已工作時間:aaa,班制時長:aaa1111," +$"工作人員所屬部門:aaa";custom.SetToolTip(button1,aa);}