• ベストアンサー

マウスのある個所の色

お世話になります よろしくお願いします 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進数にする方法を教えてください よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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進文字列に変換といった手法でしょう

SAY_MAN
質問者

お礼

すみません、バージョンを書いていませんでした。 VB6.0です そしてまさにそれで解決しました。 ありがとうございました。

その他の回答 (1)

回答No.1

少し調べてみましたが、GetCursorPosで得られる座標は 「Screen上の」絶対座標のようです。 それに比して、GetPixelで渡しているデバイスコンテキストのハンドルは Screenではなくて、PictureBoxのものなので、座標として本来は 「PictureBoxの左上を起点とした座標」を与える必要があるはずです。 Formの位置とPictureBoxの位置、それとGetCursorPosで得た座標から マウスカーソルの「PictureBox内での座標」を計算して、与えてみてください。 私の方では計算してまでは 確認してませんが、たぶん いけるんじゃないかな? また、16進数への変換はHex関数で可能です。 なお、気になったのですが、PictureBoxのhDCの管理はVB任せでいいと思いますので CloseHandleは要らないのではないでしょうか? (私は問答無用で削除して少し動かしてみましたが、少なくとも異常終了とかは  しません。むしろCloseHandleしてしまった際の動きが気になります)

SAY_MAN
質問者

補足

ありがとうございます 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 何か間違っているのでしょうか? 以上よろしくお願いします

関連するQ&A

専門家に質問してみよう