表示カーソルを変更するには、CWndクラスのOnSetCursorメソッドをオーバーライドします。
例えばVC6の場合はクラスウィザードを使用し、OnSetCursorメソッドをオーバーライドします。
もちろん、手で書いてオーバーライドしても大丈夫です。
次に、その内容を実装します。
例えば、決まったボタンの上にマウスカーソルが来たときにカーソルを変更したい場合は、下記のようにします。
BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// もしm_BtnClsの上にカーソルが来たら、カーソルを変更します。
if(pWnd == &m_BtnCls){
// LoadCursorにリソースIDを渡しカーソルのハンドルを取得、
// そのハンドルをセットします。
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_SP));
return TRUE;
}
// 通常は、基底クラスのメソッドを呼びます。
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
LoadCursor関数は、まだそのカーソルが読み込まれていないときは読み込み、既に読み込まれているときは何もしないで、カーソルのハンドルを返してくれます。
また、pWndとカーソルの位置関係を、nHitTest引数によって知ることができるので、位置関係によるカーソル変更も可能です。
以下、ヘルプの丸写しです。
HTBORDER
サイズ変更される境界線を持たないウィンドウ境界内にあります。
HTBOTTOM
ウィンドウ境界の下端の線上にあります。
HTBOTTOMLEFT
ウィンドウ境界の左下隅にあります。
HTBOTTOMRIGHT
ウィンドウ境界の右下隅にあります。
HTCAPTION
タイトル バーの領域内にあります。
HTCLIENT
クライアント領域内にあります。
HTERROR
スクリーンの背景上またはウィンドウの区切り線上にあります。これは、DefWindowProc Windows 関数がエラーを示すシステム ビープ音を発生するということ以外は HTNOWHERE と同じです。
HTGROWBOX
サイズ ボックス内にあります。
HTHSCROLL
水平スクロール バー内にあります。
HTLEFT
ウィンドウ境界の左端の線上にあります。
HTMAXBUTTON
最大表示ボタン内にあります。
HTMENU
メニュー領域内にあります。
HTMINBUTTON
アイコン化ボタン内にあります。
HTNOWHERE
スクリーンの背景かウィンドウの区切り線上にあります。
HTREDUCE
アイコン化ボタン内にあります。
HTRIGHT
ウィンドウ境界の右端の線上にあります。
HTSIZE
サイズ ボックス内にあります (HTGROWBOX と同じです)。
HTSYSMENU
コントロール メニュー内、または子ウィンドウのクローズ ボタン内にあります。
HTTOP
ウィンドウ境界の上端の線上にあります。
HTTOPLEFT
ウィンドウ境界の左上隅にあります。
HTTOPRIGHT
ウィンドウ境界の右上隅にあります。
HTTRANSPARENT
現在ほかのウィンドウに覆い隠されているウィンドウ内にあります。
HTVSCROLL
垂直スクロール バー内にあります。
HTZOOM
最大表示ボタン内にあります。
IDC_CURSOR_SPに相当するカーソルは、あらかじめリソースに作成しておきましょう。
また、元々システムに定義されているカーソルのIDをLoadCursorに指定することも可能です。
以下、またまたヘルプの丸写しです。
IDC_APPSTARTING
標準矢印カーソルおよび小型砂時計カーソル
IDC_ARROW
標準矢印カーソル
IDC_CROSS
十字カーソル
IDC_IBEAM
アイビーム (縦線) カーソル
IDC_ICON
現在は使われません
IDC_NO
禁止カーソル
IDC_SIZE
現在は使われません
IDC_SIZEALL
4 方向矢印カーソル
IDC_SIZENESW
斜め左下がりの両方向矢印カーソル
IDC_SIZENS
上下両方向矢印カーソル
IDC_SIZENWSE
斜め右下がりの両方向矢印カーソル
IDC_SIZEWE
左右両方向矢印カーソル
IDC_UPARROW
垂直の矢印カーソル
IDC_WAIT
砂時計カーソル
|