カーソルの変化
カーソルの変化
最近、カーソルをある位置に移動させると、カーソルが変わるように設定しようとたくらんでいます。
しかし、関数しか見つからず、細かいことは載っていません。
ご教授願えますか?
探したサイトはVBのやつでしたが、移植すれば問題ないので・・・
http://www.winapi-database.com/Graphics ... ursor.html
しかし、関数しか見つからず、細かいことは載っていません。
ご教授願えますか?
探したサイトはVBのやつでしたが、移植すれば問題ないので・・・
http://www.winapi-database.com/Graphics ... ursor.html
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================
Re: カーソルの変化
こんにちは。ゆちボンです。
> http://www.winapi-database.com/Graphics ... ursor.html
ちなみに、僕もこのサイトにお世話になってます(^^;
そういうことはおいといて、早速ですが、
引数の1個目は「カーソルのハンドル」、つまり、
「CreateCursor」でカーソルを作って返ってくる、ハンドルを指定します。
引数の2個目はIDの指定つまり、
普通に使っているときのカーソルと指定したハンドルのカーソルを入れ替える
というものです。
だから、Iビーム(文字入力時にでるカーソル)を指定したカーソルハンドルと
入れ替えます。
使うときは取得の下で、hMouseに「CreateCursor」で取得してください。
「CreateCursor」はABのヘルプに乗っているのでわかると思うのですが
僕は?の部分がよくわからなかったので一応その行をコメントアウトしています。
注意として、必ず開放することと、
カーソルはウィンドウズのアプリケーション全部と共有しているので、一部分だけの変更にしたほうがいいと思います。
あとは、かなり詳しい方にお願いします。
> 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)
「CreateCursor」はABのヘルプに乗っているのでわかると思うのですが
僕は?の部分がよくわからなかったので一応その行をコメントアウトしています。
注意として、必ず開放することと、
カーソルはウィンドウズのアプリケーション全部と共有しているので、一部分だけの変更にしたほうがいいと思います。
あとは、かなり詳しい方にお願いします。
Re: カーソルの変化
メインウィンドウ内を左クリックした場合、左クリックを離すまでカーソルを変更 [ここをクリックすると内容が表示されます]
ウィンドウズ内臓?のカーソルに限られますけど。コード: 全て選択
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
> 最近、カーソルをある位置に移動させると、カーソルが変わるように設定しようとたくらんでいます。
カーソルが移動する度にメインウィンドウ内のある位置にカーソルが存在するか判定し、カーソルが存在する場合イメージを変更するようにするといいと思います。
7さん、ゆちボンさん、コード提供ありがとうございます。
一応、ゆちボンさんのだけやってみたんですが、?が分からないため、NULLで試したところ、エラーが出てコンパイルが止まりました。
GetModuleHandleのパラメータがおかしいとか?
・・・なぜこんなエラーが出るのか不思議です。
スタッティックの文字の上にあると色とポインタ(カーソル)を変更するようにしたいんです。
7さんのコードも今からやってみようと思います。
一応、ゆちボンさんのだけやってみたんですが、?が分からないため、NULLで試したところ、エラーが出てコンパイルが止まりました。
GetModuleHandleのパラメータがおかしいとか?
・・・なぜこんなエラーが出るのか不思議です。
スタッティックの文字の上にあると色とポインタ(カーソル)を変更するようにしたいんです。
7さんのコードも今からやってみようと思います。
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================
CreateCorsor(...)の部分をLoadImage(0, OCR_HAND, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE)にしたら良いと思います。
ただしこれはcomctl32.dllのアイコンではなく,ユーザが(マウスのプロパティから)設定したアイコンになるはずです。
またこの方法で指差しのカーソルを読み込む方法は,Windows 2000以上で使えることになっていますが,
インターネットを検索してみたところ,Windows 9xでも使えると言う話も見かけます。
Windows 2000以前でも確実に対応したいのでしたら,レジストリの設定を読み込んでやることになるでしょう。
ただしこれはcomctl32.dllのアイコンではなく,ユーザが(マウスのプロパティから)設定したアイコンになるはずです。
またこの方法で指差しのカーソルを読み込む方法は,Windows 2000以上で使えることになっていますが,
インターネットを検索してみたところ,Windows 9xでも使えると言う話も見かけます。
Windows 2000以前でも確実に対応したいのでしたら,レジストリの設定を読み込んでやることになるでしょう。
Re: カーソルの変化
WM_SETCURSORメッセージにて
で、いいのでは?
コード: 全て選択
SetCursor(LoadCursor(NULL, IDC_HAND))
> この件についてはOKですが、アイテム(Static1)の座標を計算して、その上にカーソル(ポインタ)が触れたら変えるというのはまだ実装できていません。
>
> どのように実装したらよいでしょう?
スタティックコントロールに関連付けられているマウスカーソルのハンドルを、SetClassLong・SetClassLongPtr関数を使ってIDC_HANDに変更してしまえばもっと簡単なんじゃないかと思ったんですけど、どうやら無理みたいです。
>
> どのように実装したらよいでしょう?
親ウィンドウに通知しないスタティックコントロールに限ります [ここをクリックすると内容が表示されます]
コメント書いてないので分かり難いかもしれません...。コード: 全て選択
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に変更してしまえばもっと簡単なんじゃないかと思ったんですけど、どうやら無理みたいです。