アトリエ ぺっぺ

トップページ > プログラムTips > 状況に応じたカーソル変更

◆ 状況に応じたカーソル変更
表示カーソルを変更するには、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
    砂時計カーソル 
 

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp