トップページ > 過去ログ > 記事閲覧
マウスカーソルの変更について
名前:重蔵 日時: 2007/08/11 02:17

また今回もご教授宜しくお願い致します。 マウスカーソルの変更についてお聞きしたい事が御座います。 私の知る所、方法は二つで 1.API関数 LoadCursor を使いリソースをロードしハンドルに格納。   そしてSetCursorにロードしたハンドルを渡す。 2.カーソルのイメージファイルを作り、   普通の画像ファイルと同じように LoadGraph でディスクから読み込み、   毎ループScreenFlip()をかける。   (*去年の過去スレッドで挙げられた方法) できれば1の方法を使いたいです。 なぜならば、2ですと毎ループ処理の重いScreenFlip()をマウス表示の為に使わなくてはならないので、 プロセッサへの負担が心配です。 (現にタスクマネージャを開きながら検証した所、CPU使用率は莫大でした) ですので、WinAPIを使いOS内処理にまかせられる、 比較的負担の軽い1の方法を書いた通りに試してみました。 ところが完全に成功…とは言えない結果となりました。 ProcessMessage()を行う度に、LoadCursorでデフォルト設定したはずのカーソルが元の矢印カーソルに戻ってしまうのです。 ProcessMessage()を渡すまでは、 カーソルを移動させても設定したカーソルイメージの状態を保ち続けました。 これはなぜなのでしょう… 検証に使ったソールを載せます。 -------------------------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) { return -1; } HCURSOR hCur = LoadCursor(NULL,IDC_NO); SetCursor(hCur); // キーの入力待ち while( CheckHitKeyAll() == 0 ) { // メッセージ処理 if( ProcessMessage() == -1 ) { break ; } } DxLib_End() ; return 0 ; } -------------------------------------------------------------------------------------- 最初はセットした禁止カーソルのままです。 マウスを動かすと矢印カーソルへ戻ります。 キー入力待ち中のメッセージ処理をなくせば、カーソルを移動させてもイメージは変わりません。 これは憶測ですが、ウィンドウクラス構造体のカーソルハンドル変数を、 ProcessMessage()を行う度にリセットする…という事なのでしょうか。 今の所、ループを行う度(ProcessMessage()を行う度)、 最初の処理でSetCoursorを行い、目的のカーソルイメージを保つようにしております。 が、場合によって、元の矢印カーソルがそれまでに表示されますので、極一瞬ちらついたりする時があります。 処理負荷はかからないのですが… 良い方法はございませんでしょうか?

Page: 1 |

Re: マウスカーソルの変更について ( No.1 )
名前:優柔不断 日時:2007/08/11 21:58

ウィンドウクラスごと変えてしまうのがいい方法です。どっちの方法にも当てはまりませんが、 SetClassLong()関数を使えば問題ありません。それに、基本的にゲーム作るのならばScreenFlip()関数 はほぼ必須ですから、別にカーソル表示するぐらいでそんなに影響ないと思いますが。
Re: マウスカーソルの変更について ( No.2 )
名前:重蔵 日時:2007/08/11 23:42

優柔不断さん、アドバイスありがとうございます。 おっしゃったように、SetClassLong()を使いウィンドウクラスを再設定することで成功しました。 SetCoursorは一時的にセットするだけで、クラス自体を上書き変更するものではなかった訳ですね。 wait や await や stop などを実行する事で、マウスカーソルがウィンドウクラスで設定されているものに戻ってしまうため、 アプリケーション固有のカーソルを実現することはできなかったようです。 ProcessMessage()が境であった事も今ならうなづけますね。
Re: マウスカーソルの変更について ( No.3 )
名前:優柔不断 日時:2007/08/19 11:38

ただし、それはDxライブラリの関数ではなくて、Win32 APIの関数ですので、ご注意ください。
Re: マウスカーソルの変更について ( No.4 )
名前:憂煉 日時:2007/08/19 13:50

補足です。マウスの表示は基本的にGUIが使われるので画像にするほうが安定性が高いかもです。
Re: マウスカーソルの変更について ( No.5 )
名前:優柔不断 日時:2007/08/19 20:51

確かに、それならこんな感じでしょうか、 カーソルグラフィックの読み込み     ↓ マウスの非表示化     ↓ (1) マウス位置の取得     ↓ カーソルの表示(ScreenFlip使用)     ↓ (1)へ戻る 戻す時は マウスカーソルの表示     ↓ カーソルグラフィックの破棄 でしょうか。

Page: 1 |