- ベストアンサー
マウスのある個所の色
お世話になります よろしくお願いします Pictureboxをクリックされたときに そのPictureboxがクリックされた箇所の色を16進数で取得したいのですが うまくいきません どこが間違っているのか教えてもらえないでしょうか? ソースは Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Picture1_Click() Dim Poi As POINTAPI Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, Poi.x, Poi.y) Me.Label2.Caption = Poi.x Me.Label3.Caption = Poi.y Me.Label1.Caption = iro CloseHandle (Me.Picture1.hdc) End Sub GetPixcelの引数に-1しか入りません あと、もし数値で取れたとして それを16進数にする方法を教えてください よろしくお願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VBのバージョンは何でしょう? VB6で有るなら PictureBoxのPointプロパティである座標の色データを取得可能です MouseDownイベントで dim cl as long cl = Picture1.Point( x, y ) Debug.Print Right("00000000" & Hex( cl ), 8 ) といった具合で可能ですよ WinAPIは必要ありません VB.NETですとBitmapオブジェクトを取得してGetPixelメソッドでColorオブジェクトを取得 toStringで16進文字列に変換といった手法でしょう
その他の回答 (1)
- K-Sogacchi
- ベストアンサー率53% (50/93)
少し調べてみましたが、GetCursorPosで得られる座標は 「Screen上の」絶対座標のようです。 それに比して、GetPixelで渡しているデバイスコンテキストのハンドルは Screenではなくて、PictureBoxのものなので、座標として本来は 「PictureBoxの左上を起点とした座標」を与える必要があるはずです。 Formの位置とPictureBoxの位置、それとGetCursorPosで得た座標から マウスカーソルの「PictureBox内での座標」を計算して、与えてみてください。 私の方では計算してまでは 確認してませんが、たぶん いけるんじゃないかな? また、16進数への変換はHex関数で可能です。 なお、気になったのですが、PictureBoxのhDCの管理はVB任せでいいと思いますので CloseHandleは要らないのではないでしょうか? (私は問答無用で削除して少し動かしてみましたが、少なくとも異常終了とかは しません。むしろCloseHandleしてしまった際の動きが気になります)
補足
ありがとうございます PictureboxのMouse_MoveでXとYを取得すると 「PictureBox内での座標」が取得できるかと思って そっちでやってみましたが 取れるところと取らないところがあります。 いちお、左上が0,0になるのでPictureboxないの座標はとれていると思うのですが 白っぽいところだととれるのですが、ほかの色がとれません Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, X, Y) Me.Label2.Caption = X Me.Label3.Caption = Y Me.Label1.Caption = iro End Sub 何か間違っているのでしょうか? 以上よろしくお願いします
お礼
すみません、バージョンを書いていませんでした。 VB6.0です そしてまさにそれで解決しました。 ありがとうございました。