ページ 1 / 1
カーソルの変化
Posted: 2006年12月13日(水) 22:05
by 雷電
最近、カーソルをある位置に移動させると、カーソルが変わるように設定しようとたくらんでいます。
しかし、関数しか見つからず、細かいことは載っていません。
ご教授願えますか?
探したサイトはVBのやつでしたが、移植すれば問題ないので・・・
http://www.winapi-database.com/Graphics ... ursor.html
Re: カーソルの変化
Posted: 2006年12月14日(木) 16:15
by MML
こんにちは。ゆちボンです。
>
http://www.winapi-database.com/Graphics ... ursor.html
ちなみに、僕もこのサイトにお世話になってます(^^;
そういうことはおいといて、早速ですが、
引数の1個目は「カーソルのハンドル」、つまり、
「CreateCursor」でカーソルを作って返ってくる、ハンドルを指定します。
引数の2個目はIDの指定つまり、
普通に使っているときのカーソルと指定したハンドルのカーソルを入れ替える
というものです。
だから、Iビーム(文字入力時にでるカーソル)を指定したカーソルハンドルと
入れ替えます。
コード: 全て選択
'定義
Dim hMouse As DWord
Const IDC_IBEAM = 32513
'取得
'hMouse = CreateCursor(GetModuleHandle(),0,0,13,20,?,?)
'Iビームカーソルをハンドル「hMouse」のものと入れ替える。
SetSystemCursor(hMouse,IDC_IBEAM)
'開放
DestroyCursor(hMouse)
使うときは取得の下で、hMouseに「CreateCursor」で取得してください。
「CreateCursor」はABのヘルプに乗っているのでわかると思うのですが
僕は?の部分がよくわからなかったので一応その行をコメントアウトしています。
注意として、必ず開放することと、
カーソルはウィンドウズのアプリケーション全部と共有しているので、一部分だけの変更にしたほうがいいと思います。
あとは、かなり詳しい方にお願いします。
Re: カーソルの変化
Posted: 2006年12月14日(木) 20:42
by 7
メインウィンドウ内を左クリックした場合、左クリックを離すまでカーソルを変更 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim isCapture As BOOL
Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer)
If Not isCapture Then
SetCapture(hMainWnd)
SetCursor(LoadImage(NULL,MAKEINTRESOURCE(IDC_CROSS),IMAGE_CURSOR,NULL,NULL,LR_DEFAULTSIZE Or LR_SHARED))
isCapture=Not isCapture
End If
End Sub
Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer)
If isCapture Then
ReleaseCapture()
isCapture=Not isCapture
End If
End Sub
ウィンドウズ内臓?のカーソルに限られますけど。
> 最近、カーソルをある位置に移動させると、カーソルが変わるように設定しようとたくらんでいます。
カーソルが移動する度にメインウィンドウ内のある位置にカーソルが存在するか判定し、カーソルが存在する場合イメージを変更するようにするといいと思います。
Posted: 2006年12月14日(木) 20:52
by 雷電
7さん、ゆちボンさん、コード提供ありがとうございます。
一応、ゆちボンさんのだけやってみたんですが、?が分からないため、NULLで試したところ、エラーが出てコンパイルが止まりました。
GetModuleHandleのパラメータがおかしいとか?
・・・なぜこんなエラーが出るのか不思議です。
スタッティックの文字の上にあると色とポインタ(カーソル)を変更するようにしたいんです。
7さんのコードも今からやってみようと思います。
Posted: 2006年12月14日(木) 21:29
by 雷電
やってみたところ、ちゃんと動きますね。
ですが、指を刺しているカーソル(こんな感じ☝)が表示したいのですが、system32のフォルダを調べてみると、comctl32.dllこのライブラリの中のリソース108が僕の望むカーソルなのですが・・・どうやって取り出すのか・・・
Posted: 2006年12月14日(木) 22:54
by イグトランス
CreateCorsor(...)の部分をLoadImage(0, OCR_HAND, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE)にしたら良いと思います。
ただしこれはcomctl32.dllのアイコンではなく,ユーザが(マウスのプロパティから)設定したアイコンになるはずです。
またこの方法で指差しのカーソルを読み込む方法は,Windows 2000以上で使えることになっていますが,
インターネットを検索してみたところ,Windows 9xでも使えると言う話も見かけます。
Windows 2000以前でも確実に対応したいのでしたら,レジストリの設定を読み込んでやることになるでしょう。
Posted: 2006年12月14日(木) 23:05
by 雷電
置き換えてやってみましたが、
OCR_HAND
が無効な識別子になってしまいます。
定数かなにか、加えるものがありそうな気がするのですが・・・
Posted: 2006年12月14日(木) 23:24
by OverTaker
検索すればすぐに出てきますよ。
OCR_HAND=32649みたいです。
Re: カーソルの変化
Posted: 2006年12月15日(金) 07:20
by Tomorrow
WM_SETCURSORメッセージにて
コード: 全て選択
SetCursor(LoadCursor(NULL, IDC_HAND))
で、いいのでは?
Posted: 2006年12月15日(金) 22:56
by 雷電
できました。
この件についてはOKですが、アイテム(Static1)の座標を計算して、その上にカーソル(ポインタ)が触れたら変えるというのはまだ実装できていません。
どのように実装したらよいでしょう?
Posted: 2006年12月16日(土) 00:37
by 7
> この件についてはOKですが、アイテム(Static1)の座標を計算して、その上にカーソル(ポインタ)が触れたら変えるというのはまだ実装できていません。
>
> どのように実装したらよいでしょう?
親ウィンドウに通知しないスタティックコントロールに限ります [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim isCapture As BOOL
Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer)
Dim rc As RECT
Dim pt As POINTAPI
GetWindowRect(GetDlgItem(hMainWnd,Static1),rc)
rc.right-=rc.left
rc.bottom-=rc.top
memcpy(VarPtr(pt),VarPtr(rc),SizeOf(POINTAPI))
ScreenToClient(hMainWnd,pt)
If ( pt.x=<x And (pt.x+rc.right)=>x ) And ( pt.y=<y And (pt.y+rc.bottom)=>y ) Then
If Not isCapture Then
SetCapture(hMainWnd)
SetCursor(LoadCursor(NULL,IDC_HAND))
isCapture=TRUE
End If
Else
If isCapture Then
ReleaseCapture()
isCapture=FALSE
End If
End If
End Sub
コメント書いてないので分かり難いかもしれません...。
スタティックコントロールに関連付けられているマウスカーソルのハンドルを、SetClassLong・SetClassLongPtr関数を使って
IDC_HANDに変更してしまえばもっと簡単なんじゃないかと思ったんですけど、どうやら無理みたいです。
Posted: 2006年12月16日(土) 15:51
by 雷電
できました。
7さん、ありがとうございます。
こんな計算をしているのかと、コードを見ながら考えています。
色の変化は、以前に質問したのでそれを見ながら考えます。