在WinCE上做應用,想在一個狀態列上顯示訊息,但狀態列的240寬不足以顯示完所有的訊息,訊息大概有30字左右,字元數不固定,於是想,是不是可以像Web 頁面上的那種跑馬燈效果來實現。
翻爛了WinCE下的控制項,發現WinCE根本不存在類似的控制項或標籤或屬性,沒辦法,自己畫吧,由於是要做類似滾動的效果,那肯定是移動字幕了,那肯定是定時重畫了,也找不到好的辦法,就用Timer控制項吧,思路就是每過一定的時間,再重新在新位置(X方向或Y方向)畫文字,這樣可以做出類似滾動的效果。
既然要畫,就要有畫板Graphics,這個畫板就從一個映像上得到吧,可以藉助一個控制項,比如可以承載映像的PictureBox控制項。
如:
滾動字幕的背景實際上是一個Picturebox,就是在這個Picturebox上定時畫字幕。
看代碼:
表單載入的時候,先要給Picturebox載入映像:
1 this.picBox.Image = Help.ImageFromFile(filepath);
定時器裡執行:
1 timerScrollMsg.Enabled =false; //先關閉定時器
2 Bitmap bmp = Help.ImageFromFile(Path.Combine(Help.StartPath(), "bg.jpg")) as Bitmap;
3 //重新設定picturebox的映像
4 picBox.Image = bmp;
5 //取得畫板
6 Graphics graphics = Graphics.FromImage(picBox.Image);
7 //畫刷
8 Brush brush =new SolidBrush(Color.Blue);
9 //定義字型
10 Font font =new Font("宋體", 13F, FontStyle.Regular);
11 //每次重新畫冊字幕的位置都向左移動10個距離
12 _x = _x -10;
13 //如果字幕的最後一個字向左移動出螢幕外,說明整個字幕都向左滾動完了,接著要重新一輪的滾動,
14 //所以要重新置放字幕的第一個字的左邊距為映像的寬度。
15 _x = _x + graphics.MeasureString(msg, font).Width <=0? _x = bmp.Width : _x;
16 //在指定位置畫字幕
17 graphics.DrawString(msg, font, brush, _x, _y);
18 //重繪picturebox
19 picBox.Invalidate();
20 timerScrollMsg.Enabled =true; //重新啟動定時器
注意:定時計算字幕的左邊距是關鍵。
其實個人感覺,這個方法很笨,雖然貌似實現了功能,但弄一個定時器不停地跑,總是擔心很浪費。
誰有好的辦法,說一下,大家學習學習。