當窗口擁有鍵盤焦點或者處於激活狀態時,可以創建一個Caret,失去焦點之前必須銷毀該Caret。CreateCaret()函數用來創建Caret,系統將該函數指定的位置Pixel取反得到Caret。Caret建立後用ShowCaret()顯示Caret並使其閃爍。獲得閃爍速度(Flash Time)用GetBlinkTime()*2,設置閃爍時間用SetBlinkTime()/2,Flash Time是Caret從復原到反色再到復原的周期,而Get/SetBlinkTime()得到和設置的是Caret從復原到反色或者從反色到復原的時間,因此要乘/除2。獲得Caret用GetCaretPos(),參數為一個POINT結構,存放Caret在當前窗口中的位置,SetCaretPos()在Caret不可見的情況下仍然起作用。暫時隱藏Caret使用HideCaret(),再顯示用ShowCaret(),徹底銷毀Caret用DestroyCaret。
一、 創建並顯示Caret
改變或顯示一個窗口的Caret,應捕獲其WM_SETFOCUS消息
1、 CreateCaret()函數
CreateCaret(hWnd,(HBITMAP)NULL,30,60)
hWnd:擁有Caret的窗口句柄
NULL:如果使用位圖Caret,此參數為一個HBITMAP,該HBITMAP可以通過LoadBitmap、CreateBitmap和CreateDIBitmap獲得,如果為NULL,將建立一個實心矩形光標。
30,60:光標的大小單位為邏輯單位,如果非NULL的位圖句柄,這兩個參數被忽略。
使用位圖光標
HBITMAP hbm;
hbm=LoadBitmap((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDB_BITMAP1));
CreateCaret(hWnd,(HBITMAP)hbm,0,0);
2、 為了精確確定Caret的大小,可以傳遞SM_CXBORDER和SM_CYBORDER給GetSystemMetics()函數獲得以Pixel為計量單位的窗口的邊框的寬和高,據此計算Caret的大小。
二、 使Caret隨鼠標的移動而移動
1、 捕獲WM_MOUSEMOVE消息:
int x:
int y;
x=LOWord(lParam);
y=HIWord(lParam);
獲得事件發生時鼠標的位置
2、 將Caret移至光標處:
SetCaretPos(x,y)
3、 在隨鼠標移動的過程中Caret的閃爍效果不明顯,鼠標停留片刻後,Caret恢復正常閃爍。