明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

WINDOWS下的動態(tài)鼠標(biāo)光標(biāo)控制

[摘要]正常情況下的Windows鼠標(biāo)光標(biāo)形狀為向左上角的單箭頭符號。根據(jù)應(yīng)用程序不同客戶區(qū)域的需要,用戶可以建立自己的鼠標(biāo)光標(biāo)形狀,常見的有手形鼠標(biāo)光標(biāo)、不同方向的箭頭鼠標(biāo)光標(biāo)、立體箭頭鼠標(biāo)光標(biāo)和筆式鼠標(biāo)光標(biāo)等。中文Windows95下的鼠標(biāo)光標(biāo)形狀比較豐富,在"\WINDOWS\CURSOR...
正常情況下的Windows鼠標(biāo)光標(biāo)形狀為向左上角的單箭頭符號。根據(jù)應(yīng)用程序不同客戶區(qū)域的需要,用戶可以建立自己的鼠標(biāo)光標(biāo)形狀,常見的有手形鼠標(biāo)光標(biāo)、不同方向的箭頭鼠標(biāo)光標(biāo)、立體箭頭鼠標(biāo)光標(biāo)和筆式鼠標(biāo)光標(biāo)等。中文Windows95下的鼠標(biāo)光標(biāo)形狀比較豐富,在"\WINDOWS\CURSORS"目錄下存放。此外,用戶完全可以利用Windows下的中文SDK3.1、VF P3.0和Delphi2.0中的"IMAGE EDITOR"等資源編輯器創(chuàng)建自己的鼠標(biāo)光標(biāo)資源文件.CUR。這里筆者將自己的一些編程技術(shù)和基本方法介紹給大家,供參考。

鼠標(biāo)光標(biāo)資源的定義和調(diào)用

建立起自己的鼠標(biāo)光標(biāo)資源文件后,首先需要在應(yīng)用程序的資源文件中定義鼠標(biāo)光標(biāo)。假設(shè)鼠標(biāo)光標(biāo)資源文件名為MOUSE.CUR和MOUSEM.CUR,在資源文件中的定義方法如下:


imecurh CURSOR mouse.cur

imecurm CURSOR mousem.cur

鼠標(biāo)光標(biāo)資源文件經(jīng)定義之后,方可在應(yīng)用程序中利用LoadCursor()函數(shù)調(diào)入內(nèi)存使用,其調(diào)用方法如下:

HCURSOR hCurh;//定義鼠標(biāo)資源句柄


HCURSOR hCurm;//將鼠標(biāo)光標(biāo)數(shù)據(jù)調(diào)入內(nèi)存


hCurh=LoadCursor(hInstance,


imecurh");hCurh=LoadCursor(hInstance,"imecurm");

動態(tài)鼠標(biāo)光標(biāo)的全局注方法
當(dāng)鼠標(biāo)光標(biāo)移動到客戶應(yīng)用程序的窗口內(nèi)時(shí),鼠標(biāo)光標(biāo)立刻變成定制的形狀。要實(shí)現(xiàn)這一功能,只需在注冊客戶應(yīng)用程序窗口類時(shí)定義相應(yīng)的鼠標(biāo)光標(biāo)資源即可。正常情況下客戶應(yīng)用程序鼠標(biāo)句柄的定義方法如下:


wc.Cursor=LoadCursor(NULL,IDC_ARROW);

要在窗口內(nèi)將鼠標(biāo)光標(biāo)變成特定的形狀,必須用下述方法定義光標(biāo)句柄,然后注冊窗口類:

wc.hCursor = hCurh;


利用這種方法定制的全局性鼠標(biāo)光標(biāo)具有如下特點(diǎn):只要鼠標(biāo)光標(biāo)移入該客戶應(yīng)用程序的窗口內(nèi),光標(biāo)形狀立刻變成定制的形狀;鼠標(biāo)光標(biāo)移動平滑快速,無抖動等不良現(xiàn)象。
特定客戶區(qū)域內(nèi)的動態(tài)鼠標(biāo)光標(biāo)

很多應(yīng)用程序具有在特定的客戶區(qū)域內(nèi)鼠標(biāo)光標(biāo)具有特定形狀的功能,如UCWIN3.1的特殊符號軟鍵盤:當(dāng)鼠標(biāo)光標(biāo)移動到軟鍵盤窗口內(nèi)的按鍵位置時(shí),光標(biāo)形狀為手形,當(dāng)移動到非按鍵位置時(shí),光標(biāo)形狀為上下左右四箭頭形狀;要實(shí)現(xiàn)這一動態(tài)鼠標(biāo)光標(biāo)功能,應(yīng)按如下操作步驟編制:

首先將手形光標(biāo)按上述方法設(shè)置為全局性的動態(tài)鼠標(biāo)光標(biāo):


wc.hCursor = hCurh;


然后注冊相應(yīng)窗口的窗口類,在該窗口函數(shù)中對WM_MOUSEMOVE消息進(jìn)行如下處理:
1.獲取鼠標(biāo)光標(biāo)的屏幕位置;

2.判斷鼠標(biāo)光標(biāo)在特定區(qū)域內(nèi),則設(shè)置相應(yīng)光標(biāo)形狀并設(shè)置標(biāo)志;

3.判斷鼠標(biāo)光標(biāo)移出特定位置則清除標(biāo)志并恢復(fù)原來光標(biāo)形狀。

程序代碼如下:


POINT pt;


RECT rt;


BOOL iFlag;


case WM_MOUSEMOVE:


pt=MAKEPOINT(IParam);//光標(biāo)位置


if(PtInRect(&rt,pt)){


//在特定區(qū)域設(shè)置鼠標(biāo)光標(biāo)


iFlaq=TRUE;


setCursor(hCurm);


} else if(iFlag==TRUE){


iFlag=FALSE;


SetCursor(hCurh);


}


break;

上述特定客戶區(qū)域內(nèi)的動態(tài)鼠標(biāo)光標(biāo)雖然具有略微的抖動問題,但由于一般情況下的特定客戶區(qū)域都比較小,所以這種現(xiàn)象也并不明顯,完全可以滿足客戶程序的需要。如果客戶程序存在多個(gè)特定區(qū)域需要不同形狀的鼠標(biāo)光標(biāo),只需建立多個(gè)用戶光標(biāo)源文件,并進(jìn)行多個(gè)特定區(qū)域判斷即可,有興趣的讀者可以自行擴(kuò)充。