天天看點

在桌面上顯示筆記本電腦的電池容量

最近我用筆記本發現電池容量的notifyicon經常不會正常出現(雖然設定了始終顯示),并且我以前在PDA軟體上寫過顯示電池容量的功能,是以可以寫一個在桌面上顯示電量的輕量級程式。查詢電量主要通過API函數GetSystemPowerStatus來實作,這裡不講這個API函數(可參閱在api文檔中有詳細介紹)。

        [DllImport(KERNEL32)]

        public static extern bool GetSystemPowerStatus(

            ref SYSTEM_POWER_STATUS pSystemPowerStatus

            );

最初我用一個progressbar和一個label分别顯示,這樣做非常簡單。但是progressbar的style屬性是否不起作用,無法顯示成連續樣式,而是始終用綠色的小方塊顯示進度(XP系統),這樣的顯示不是很精确,是以決定自己繪制。同時把label也省略掉,直接在進度條上繪制百分比。是以這就引出下面的繪制問題,如何使繪制文本始終可見,采用下面的方法,下圖:

在桌面上顯示筆記本電腦的電池容量

          放大為800%的效果圖:

在桌面上顯示筆記本電腦的電池容量

          我們把視窗放置在這樣的位置,當一個視窗最大化時,它貼近标題欄右側,但不會遮擋controlbuttons。(如上圖)

這需要擷取顯示器尺寸,在vc中是使用GetSystemMatrix函數,在c#中可以使用Screen.PrimaryScreen.Bounds屬性。

上圖中字元串被切分為兩個部分,是以我們在繪制時先準備兩個圖檔,bitmap1和2,分别采用不同的前景和背景,當進度條處于文字中間位置時,我們貼兩次圖。

百分比字元串的尺寸可以測量:

sizef=graphics.measurestring(text,font)

繪制字元串的起始位置(居中):

startX=(this.width-sizef.width)/2;

startY=(this.height-sizef.height)/2;

注意,貼圖時,一定要使用整數坐标,而不使用float坐标,否則會産生圖像的插值計算而導緻模糊。

因為這是視窗程式,是以大多數情況下應該是一個對滑鼠消息“透明”的視窗,即滑鼠穿透功能,由于程式很小,是以我們不設定單獨選項來控制。這個功能是通過API函數設定視窗樣式實作的,代碼如下:

    //設定為滑鼠穿透

    SetWindowLong(this.Handle, GWL_EXSTYLE,

                 GetWindowLong(this.Handle,GWL_EXSTYLE)| WS_EX_TRANSPARENT | WS_EX_LAYERED);

未來需要添加的功能包括:允許移動(由于無标題欄,是以需要一些處理windows消息的技巧)。

源代碼:

附錄:維護曆史

2008.01.16:增加了通知欄多圖示切換,充電提示,電量低于25%時通知欄圖示閃爍。

2008.01.18:滑鼠穿透功能。

2008.01.22:修正了立即重新整理電量時,界面未能更新的BUG。

2008.01.24:增加兩個Tray圖示,使通知托盤區的圖示選擇(根據實際剩餘電量)更加合理。

2008.12.16:增加了交流電源線上時的圖示,并繪制了更符合電池外觀的輪廓。

繼續閱讀