轉(zhuǎn)帖|行業(yè)資訊|編輯:龔雪|2024-08-23 10:23:54.860|閱讀 113 次
概述:本文主要介紹如何在WinForms應(yīng)用程序種動(dòng)態(tài)繪制系統(tǒng)名稱來(lái)替代圖表硬編碼名稱,希望對(duì)大家有所啟示和幫助~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
在以前做程序的時(shí)候,一般在登錄窗口里面顯示程序名稱,登錄窗口一般設(shè)置一張背景圖片,由于程序的名稱一般都是確定的,所以也不存在太大的問(wèn)題,不過(guò)如果客戶定制不同的系統(tǒng)的時(shí)候,需要使用Photoshop修改下圖層的文字,再生成圖片,然后替換一下也可以了。不過(guò)本著減少客戶使用繁瑣性,也可以使用空白名稱的通用圖片,配上使用GDI+的方式動(dòng)態(tài)繪制系統(tǒng)名稱的方式處理,發(fā)現(xiàn)效果也還不錯(cuò),本文來(lái)介紹一下這個(gè)處理的過(guò)程。
PS:給大家推薦一個(gè)C#開(kāi)發(fā)可以用到的界面組件——DevExpress WinForms,它能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無(wú)論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
DevExpress技術(shù)交流群10:532598169 歡迎一起進(jìn)群討論
如果我們采用傳統(tǒng)的圖片編輯方式,一般傾向于使用Photoshop來(lái)處理,不過(guò)現(xiàn)在也可以使用剪影來(lái)實(shí)現(xiàn)更多的效果了。
如原先是采用Photoshop來(lái)編輯登錄圖片的內(nèi)容,這樣系統(tǒng)登錄的時(shí)候,就可以直接采用背景圖片了。
需要的時(shí)候,在Photoshop找到圖片源文件,替換一下內(nèi)容,重新生成圖片即可。
然后再系統(tǒng)的登錄界面中,替換一下使用Photoshop生成的背景圖片,就可以簡(jiǎn)單的實(shí)現(xiàn)了效果的替換了。
使用這種方式創(chuàng)建的文字效果比較豐富,可以充分利用圖片編輯軟件創(chuàng)建的字體效果,不過(guò)就是需要安裝這個(gè)巨無(wú)霸軟件。
前面使用Photoshop生成的背景圖片,是一種解決方案,如果我們有相關(guān)的背景圖片,也可以使用軟件的GDI+的方式動(dòng)態(tài)繪制系統(tǒng)名稱。
首先我們使用Photoshop等圖片編輯軟件,編輯一下圖片,保留標(biāo)題位置為空白,然后也是通用的設(shè)置登錄界面的背景,至于文字,我們通過(guò)登錄窗口的Paint事件,使用GDI+的方式繪制系統(tǒng)名稱。
我們的軟件系統(tǒng)名稱,一般是設(shè)置在配置文件中的,如下是WinForms的App.config文件內(nèi)容。
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <!--指定默認(rèn)的數(shù)據(jù)庫(kù)類型,如果不指定則使用第一個(gè)連接字符串--> <add key="DefaultDb" value="sqlserver" /> <!--軟件名稱--> <add key="ApplicationName" value="SqlSugar開(kāi)發(fā)框架" /> <!--開(kāi)發(fā)商名稱--> <add key="Manufacturer" value="廣州愛(ài)奇迪軟件科技有限公司" />
如下是系統(tǒng)的繪制邏輯處理,由于處理代碼行數(shù)較多,就抽取為輔助函數(shù),方便查看重用。
/// <summary> /// 系統(tǒng)登錄界面 /// </summary> public partial class Login : DevExpress.XtraEditors.XtraForm { /// <summary> /// 配置文件對(duì)象 /// </summary> private AppConfig config = new AppConfig(); /// <summary> /// 窗體構(gòu)造函數(shù) /// </summary> public Login() { InitializeComponent(); //動(dòng)態(tài)繪制軟件的系統(tǒng)名稱 this.Paint += (s, e)=> { string applicationName = config.AppConfigGet("ApplicationName") ?? "SqlSugar開(kāi)發(fā)框架"; applicationName = JsonLanguage.Default.GetString(applicationName); MyHelper.Draw3DTitle(e.Graphics, applicationName, Color.Black, Color.Gray); }; }
上面的MyHelper.Draw3DTitle就是我們封裝的處理方式,用于對(duì)GDI+的處理過(guò)程進(jìn)行剝離,提高代碼的可閱讀性。
在介紹代碼的詳細(xì)實(shí)現(xiàn)過(guò)程前,我們來(lái)看看使用GDI+實(shí)現(xiàn)的效果,其中字體使用了一些3D的效果。
上面登錄界面的效果是自動(dòng)根據(jù)內(nèi)容生成,其中文字如果比較多,也會(huì)自動(dòng)根據(jù)寬度進(jìn)行適應(yīng),把字體大小調(diào)整合適。
由于實(shí)現(xiàn)的效果相對(duì)不是很復(fù)雜,因此代碼我就全部貼出來(lái)供參考了。主要就是對(duì)字體進(jìn)行調(diào)整,以及增加3D效果的處理。
public static void Draw3DTitle(Graphics g, string title, Color frontColor, Color shadowColor, bool useGradient = false, int depth = 5, string fontName = "華文中宋", FontStyle fontStyle = FontStyle.Bold, int maxFontSize = 36, int startX = 140, int startY = 100, int targetWidth = 450, int targetHeight = 100) { // 獲取適合目標(biāo)寬度的字體大小 var font = GetAdjustedFont(g, title, fontName, fontStyle, targetWidth, maxFontSize, 6); // 繪制陰影 for (int i = depth; i >= 0; i--) { using (Brush shadowBrush = new SolidBrush(Color.FromArgb(255 - (depth - i) * 25, shadowColor))) { g.DrawString(title, font, shadowBrush, new PointF(startX + i, startY + i)); } } Brush textBrush = new SolidBrush(frontColor); // 創(chuàng)建漸變填充 if (useGradient) { textBrush = new LinearGradientBrush(new Rectangle(startX, startY, targetWidth, targetHeight), frontColor, Color.Blue, 45f); } // 繪制前景文本 g.DrawString(title, font, textBrush, new PointF(startX, startY)); } /// <summary> /// 根據(jù)目標(biāo)寬度,調(diào)整字體大小 /// </summary> private static Font GetAdjustedFont(Graphics g, string text, string fontName, FontStyle fontStyle, int targetWidth, int maxFontSize, int minFontSize) { // 調(diào)整字體大小,直到文本適合目標(biāo)寬度 for (int size = maxFontSize; size >= minFontSize; size--) { var testFont = new Font(fontName, size, fontStyle); var textSize = g.MeasureString(text, testFont); if (textSize.Width <= targetWidth) { return testFont; } } // 如果沒(méi)有合適的大小,返回最小字體大小 return new Font(fontName, minFontSize, fontStyle); }
如果需要更加豐富的效果 ,可以對(duì)畫刷進(jìn)行更多的定義,如可以使用漸變色等處理。
以上就是我們SQLSugar開(kāi)發(fā)框架中,對(duì)于動(dòng)態(tài)程序標(biāo)題的另外一種解決方案,可以根據(jù)需要選擇不同的處理方式。
本文轉(zhuǎn)載自
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: