WIN32使用者介面設計基礎之Cursor篇 (轉)

worldblog發表於2007-12-15
WIN32使用者介面設計基礎之Cursor篇 (轉)[@more@]介面設計基礎之Cursor篇

時間:2002-10-31 21:28:40 閱讀 313 次

一、 標準滑鼠替換

  提供了一系列標準滑鼠,其標示字首均為IDC_,用SetSystemCursor()可以替換的標準滑鼠。SetSystemCusor()有兩個引數,第一個為一個透過LoadCursor()(LoadCursor()函式以被LoadImage()函式取代)、CreateCursor()或CopyCursor()獲得的Cursor指標。例如:

HCURSOR hnewCur;
hnewCur=LoadCursor(hInst,MAKEINTRE(NEWCURSOR);NEWCURSOR為hInst中的一個Cursor,
SetSystemCursor(hnewCur,OCR_NORMAL);使用使用者定義滑鼠替換系統預設滑鼠,當使用者再次使用LoadCursor(NULL,IDC_ARROW);載入標準滑鼠時獲得的將是使用者載入的而非系統預定義的滑鼠
  二、 更換Cursor的方法

  1、 新建Cursor

  此方法最為煩瑣,但使用者擁有完全的控制權,比如可以自主設立HotSpot的位置,而不是預設的左上角,具體方法是先填寫一個ICONINFO結構:

typedef struct ICONINFO {
BOOL fIcon; 是否為圖示,將其賦值為FALSE,標示該結構用來建立滑鼠
D xHotspot; HotSpot的X座標
DWORD yHotspot; HotSpot的Y座標
HBITMAP hbmMask; 滑鼠外觀的掩模圖,用來過濾滑鼠的背景
HBITMAP hbmColor; 滑鼠外觀圖片
} ICONINFO;
  填寫好後CreateIconIndirect()得到一個HICON控制程式碼,如果你建立的是滑鼠,將其轉換成HCURSOR即可,例如:

ICONINFO ii;
HCURSOR hnewCur;
ii.fIcon=FALSE;
ii.yHotspot=0;
ii.yHotspot=0;
ii.hbmMask=Loaitmap(hInst,MAKEINTRESOURCE(IDBCURSORMASK));
ii.hbmColor=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_CURSOR));
hnewCur=(HCURSOR)CreateIconIndirect(&ii);
  2、 載入Cursor

  載入是最常用的方法,被載入的滑鼠可以是VC整合開發環境中設計好的Cursor,也可以是.ANI或.Cur。

  1) 從檔案中載入:

LoadCursorFromFile();例如:LoadCursorFromFile("C:AniCur.ANI")載入一個動畫滑鼠。


  2) 從整合開發環境中載入:

  LoadCursor(hInst,MAKEINTRESOURCE(NEWCURSOR));NEWCURSOR可以在資源編輯器中設計。還要說明的是LoadImage()是較LoadCursor()、LoadBitmap()和LoadCursorFromFile()的函式,它集多個函式的功能於一身,用起來更加方便,主要的區別在於其多了一個標誌來說明載入的是點陣圖、圖示函式滑鼠。

3、 使用Cursor

  1) SetCursor()

  捕獲視窗的WM_MOUSEMOVE或者WM_SETCURSOR訊息,在其處理函式中新增對SetCursor()的呼叫,例如:
SetCursor(hnewCur);其中hnewCur為一個透過上述的任意一種方法獲得的HCURSOR

  2) SetClaong()

  捕獲WM_MOUSEMOVE訊息只對有視窗函式的視窗有效,而對像Button則無法使用。應當使用setClassLong()函式替換Button類的滑鼠,例如:

HWND hbutton;
HCURSOR hnewCur;
hnewCur=LoadCursorFromFile("C:WINNTCursorsAnimCur.ANI");
hbutton=(HWND)GetDlgItem(IDC_BUTTON);//IDC_BUTTON為要改變滑鼠的控制元件ID
SetClassLong(hbutton,GCL_HCURSOR,(long)hnewCur);
  3) RegisterClass()或RegisterClassEx()函式

  這是最麻煩的方法,但是可以作用於屬於同一個視窗類的所有視窗。在RegisterClass()或RegisterClassEx()之前,填寫WNDCLASS時,將一個自定義的Cursor控制程式碼賦值給hCursor,例如
WNDCLASSEX wcx;

wcx.hCursor=LoadCursor(hInst,MAKEINTRESOURCE(NEWCUR));
  4、 滑鼠操作函式

  1) 剪下滑鼠,限制滑鼠移動

  ClipCursor()函式用來剪下滑鼠,引數為一個指向RECT的指標,在通常情況下滑鼠被剪下於整個螢幕,如果一個的某個視窗要剪下滑鼠,必須先用GetClipCursor()獲得螢幕的滑鼠剪下區域,然後用ClipCursor()剪下滑鼠至程式視窗,程式退出後必須將滑鼠的剪下區域還原成螢幕矩形,以免影響其他的程式使用滑鼠。假設我們想將滑鼠限制在視窗hwnd內,應當:

RECT rt1;//存放螢幕剪下矩形
RECT rt2;//存放程式視窗剪下矩形
GetClipCursor(&rt1);//獲得當前的滑鼠剪下矩形填寫入rt1,如果滑鼠沒有被別的程式剪下,那麼整個矩形就是螢幕矩形
GetWindowRect(hwnd,&rt2);//獲得程式視窗hwnd的矩形至rt2
ClipCursor(&rt2);//剪下滑鼠之rt2
程式完成後應當:
ClipCursor(&rt1);//將滑鼠的剪下矩形還原為rt1(螢幕)
  2) 跟蹤滑鼠位置

  GetCursorPos()用來獲得當前滑鼠位置,SetCursorPos()設定滑鼠位置,例如:


POINT pt;//存放滑鼠位置的結構
GetCursorPos(&pt1);//獲得當前滑鼠位置
SetCursorPos(pt.x+100,pt.y+100);//根據原位置計算得到新位置


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993762/,如需轉載,請註明出處,否則將追究法律責任。

相關文章