dポイントプレゼントキャンペーン実施中!

お世話になります
よろしくお願いします

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進数にする方法を教えてください

よろしくお願いします

A 回答 (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進文字列に変換といった手法でしょう
    • good
    • 0
この回答へのお礼

すみません、バージョンを書いていませんでした。
VB6.0です

そしてまさにそれで解決しました。
ありがとうございました。

お礼日時:2008/07/03 18:27

少し調べてみましたが、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

何か間違っているのでしょうか?
以上よろしくお願いします

補足日時:2008/07/03 17:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!