プロが教える店舗&オフィスのセキュリティ対策術

Visual C++ 2010 express でプログラム開発している初心者です。

通常のマウスポインタである矢印を、ボタン等のクリックイベントで

自分の好きな画像に変更したいと思います。

curファイルにしなくてはいけないことは、わかりましたがそのファイルをどのように

プログラム上で、すればいいのでしょうか?

ネット検索しましたが、見つかりませんのでよろしくお願いします。

A 回答 (2件)

やりたいことがイマイチ見えませんが…


http://msdn.microsoft.com/ja-jp/library/cc411027 …
ですかね?

まぁ、SetCursor()APIだけだとおそらく期待している動作はしないと思いますけどね。

カーソル動かした瞬間にウィンドウクラスに定義されているマウスカーソルに戻されるでしょう。
またはシステムに登録されている標準のマウスカーソルに戻される。
http://exe.tyo.ro/2007/01/post_1.html
SetClassLong()APIでGCL_HCURSORを設定し直すか、SetSystemCursor()APIでシステムカーソルの変更を行うか…でしょう。

システムカーソルの変更にはそれなりの権限が必要になる…かも知れません。
# ユーザーごとの設定なので権限関係が要求されることは無いような気もしますけどね。
# コントロールパネルのマウス=>ポインタタブで設定できる内容だし。

この回答への補足

やりたいことは、以下のようなためです。

ゲームでたとえた方が判りやすいと思いますので、例えばとして書きます。

ボタンには色々な種類があって、花、とかケーキとか、イヤリングとかの種類があります。
例えば、花のボタンをクリックして、自分の好きなウィンドウ内の好きな位置に配置
したい時に、どのボタンを押したのかがわかり、マウスで配置位置まで持って行き
好きな位置でクリックしたら、その位置に花を配置します。
他のアイテムも同じように配置することができるようにしたいのです。

その時、押したボタンの種類をマウスポインタにすれば、通常のマウスポインタである
矢印などより、UI的にいいかと思います。

したがって、好きなボタンをクリックした時に選んだ種類によりマウスポインタを変更し
マウスポインタを自由に動かし、好きな位置で再度クリックした時に、その場所に
その種類を表示させ、マウスポインタを通常に戻す必要があります。

イメージファイルは、curファイルにすることはできます。
ボタンクリックで変更したりが可能な方法が知りたいのです。

以上、よろしくお願いします。

補足日時:2014/01/31 08:57
    • good
    • 0

>したがって、好きなボタンをクリックした時に選んだ種類によりマウスポインタを変更し


>マウスポインタを自由に動かし、好きな位置で再度クリックした時に、その場所に
>その種類を表示させ、マウスポインタを通常に戻す必要があります。
>イメージファイルは、curファイルにすることはできます。
>ボタンクリックで変更したりが可能な方法が知りたいのです。

コントロールの上にカーソル乗っかったらどうなるのか?
とか、まぁいろいろ考慮する必要はあるかと思いますが……。

VS2010EEでWin32プロジェクトのスケルトンをいぢってみました。
カーソルファイルは適当に。
# 当たり前ですがちゃんとファイルアクセスできるように。

WndProc()にstatic変数を用意。
# 他の方法でもかまいません。任意の期間寿命が保証される変数であればよい。
 static HCURSOR hCursor[2];

WM_CREATEでカーソル読み込み。
 case WM_CREATE:
  hCursor[0] = LoadCursor(NULL, IDC_ARROW);
  hCursor[1] = LoadCursorFromFile(_T("ドラゴンの手.Cur"));
  break;

ボタン押下の代わりのイベントとしてメニュー操作を書き換え。
# ここでウィンドウクラスに登録されたカーソルを変更。
  case IDM_EXIT:
   //DestroyWindow(hWnd);
   SetClassLong(hWnd, GCL_HCURSOR, (LONG)hCursor[1]);
   break;

左クリック時にカーソルを戻すように追加。
 case WM_LBUTTONDOWN:
  SetClassLong(hWnd, GCL_HCURSOR, (LONG)hCursor[0]);
  break;

ウィンドウクラスを変更しているので、「クライアント領域内」でしか有効ではありません。
他のコントロールや子ウィンドウの上に移動するとそのウィンドウクラスに設定されたカーソルに戻るでしょう。
また、戻すための契機として左クリックを設定していますが、これも「クライアント領域で」左クリックした場合のみになります。
他の子ウィンドウなどの場合は通知が来ないでしょうからよろしく処理してください。


想定しているボタンをクリックした後にマウスキャプチャーを設定したり移動可能な範囲を制限した上でシステムカーソルを変更する。という方法もあるでしょう。


大本の質問の
「curファイルにしなくてはいけないことは、わかりましたがそのファイルをどのように」については、APIで読み込むのもヨシ、実行ファイルのリソースとして登録してLoadCursor()で読み込むもヨシ、自由に使ってください。
# リソースから読み込む方法はキーワード検索すれば出てくるでしょう。
# もっともExpressEditionにはリソースエディタがありませんから実行ファイルのリソースにするにはちょっと面倒かも知れませんが。
    • good
    • 0
この回答へのお礼

質問者です。
当方、C++初心者のためなかなか難しいと思いますが
なんとなく理解できますので、ネットなど参考に
挑戦してみたいと思います。

誠にありがとうございました。

お礼日時:2014/02/12 09:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!