在以前我做程式的時候,一般在登錄視窗裡面顯示程式名稱,登錄視窗一般設置一張背景圖片,由於程式的名稱一般都是確定的,所以也不存在太大的問題,不過如果客戶定製不同的系統的時候,需要使用Photoshop修改下圖層的文字,再生成圖片,然後替換一下也可以了。不過本著減少客戶使用繁瑣性,也可以使用空白名稱的通... ...
在以前我做程式的時候,一般在登錄視窗裡面顯示程式名稱,登錄視窗一般設置一張背景圖片,由於程式的名稱一般都是確定的,所以也不存在太大的問題,不過如果客戶定製不同的系統的時候,需要使用Photoshop修改下圖層的文字,再生成圖片,然後替換一下也可以了。不過本著減少客戶使用繁瑣性,也可以使用空白名稱的通用圖片,配上使用GDI+的方式動態繪製系統名稱的方式處理,發現效果也還不錯,本篇隨筆介紹一下這個處理的過程。
1、使用圖片編輯程式修改的方式
如果我們採用傳統的圖片編輯方式,一般我們傾向於使用Photoshop來處理,不過現在也可以使用剪影來實現更多的效果了。
如原先是採用Photoshop來編輯登錄圖片的內容,這樣系統登錄的時候,就可以直接採用背景圖片了。
需要的時候,在Photoshop找到圖片源文件,替換一下內容,重新生成圖片即可。
然後再系統的登錄界面中,替換一下使用Photoshop生成的背景圖片,就可以簡單的實現了效果的替換了。
使用這種方式創建的文字效果比較豐富,可以充分利用圖片編輯軟體創建的字體效果,不過就是需要安裝這個巨無霸軟體。
2、使用軟體GDI+的方式動態繪製系統名稱
前面使用Photoshop生成的背景圖片,是一種解決方案,如果我們有相關的背景圖片,也可以使用軟體的GDI+的方式動態繪製系統名稱。
首先我們使用Photoshop等圖片編輯軟體,編輯一下圖片,保留標題位置為空白,然後也是通用的設置登錄界面的背景,至於文字,我們通過登錄視窗的Paint事件,使用GDI+的方式繪製系統名稱。
我們的軟體系統名稱,一般是設置在配置文件中的,如下是WInform的App.config文件內容。
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <!--指定預設的資料庫類型,如果不指定則使用第一個連接字元串--> <add key="DefaultDb" value="sqlserver" /> <!--軟體名稱--> <add key="ApplicationName" value="SqlSugar開發框架" /> <!--開發商名稱--> <add key="Manufacturer" value="廣州愛奇迪軟體科技有限公司" />
如下是系統的繪製邏輯處理,由於處理代碼行數較多,就抽取為輔助函數,方便查看重用。
/// <summary> /// 系統登錄界面 /// </summary> public partial class Login : DevExpress.XtraEditors.XtraForm { /// <summary> /// 配置文件對象 /// </summary> private AppConfig config = new AppConfig(); /// <summary> /// 窗體構造函數 /// </summary> public Login() { InitializeComponent(); //動態繪製軟體的系統名稱 this.Paint += (s, e)=> { string applicationName = config.AppConfigGet("ApplicationName") ?? "SqlSugar開發框架"; applicationName = JsonLanguage.Default.GetString(applicationName); MyHelper.Draw3DTitle(e.Graphics, applicationName, Color.Black, Color.Gray); }; }
上面的MyHelper.Draw3DTitle就是我們封裝的處理方式,用於對GDI+的處理過程進行剝離,提高代碼的可閱讀性。
在介紹代碼的詳細實現過程前,我們來看看使用GDI+實現的效果,其中字體使用了一些3D的效果。
上面登錄界面的效果是自動根據內容生成,其中文字如果比較多,也會自動根據寬度進行適應,把字體大小調整合適。
由於實現的效果相對不是很複雜,因此代碼我就全部貼出來供參考了。主要就是對字體進行調整,以及增加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) { // 獲取適合目標寬度的字體大小 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); // 創建漸變填充 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> /// 根據目標寬度,調整字體大小 /// </summary> private static Font GetAdjustedFont(Graphics g, string text, string fontName, FontStyle fontStyle, int targetWidth, int maxFontSize, int minFontSize) { // 調整字體大小,直到文本適合目標寬度 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; } } // 如果沒有合適的大小,返回最小字體大小 return new Font(fontName, minFontSize, fontStyle); }
如果需要更加豐富的效果 ,可以對畫刷進行更多的定義,如可以使用漸變色等處理。
以上就是我們SQLSugar開發框架中,對於動態程式標題的另外一種解決方案,我們可以根據需要選擇不同的處理方式。
專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
轉載請註明出處:撰寫人:伍華聰 http://www.iqidi.com