みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB6でマウスのドラッグで範囲を選択し画像を取得

こんかいVBを初めて扱っています。

マウスのドラッグで範囲を選択し画像を取得してPictureBox2 に表示
ということをVB6で作成しようとしています。

参考になりそうなサイトは見つけたのですが、
http://hanatyan.sakura.ne.jp/dotnet/zu06.htm
VBのバージョンが違うのでコンパイルは通りません。

関数の名前が変わっているから出来ないのか、
同じ機能は無いから違う方法を取らなければいけないのか?
わからないことだらけで、ハマっています。

もし、何でも良いのでご存知の方がいらっしゃいましたら、
何卒、ご教授宜しくお願い致します。

投稿日時 - 2008-06-03 17:51:40

QNo.4072588

すぐに回答ほしいです

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

課題か何かですか?
選択範囲を表示するところだけですけど…。
参考にして画像を取得する部分と表示する部分はご自分で考えてください。

Formを1つ作ってそのフォームにPictureBoxを一つ貼り付けてください。

Option Explicit
Dim sPosX As Single
Dim sPosY As Single
Dim ePosX As Single
Dim ePosY As Single

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (Button And vbLeftButton) <> 0 Then
sPosX = X
sPosY = Y
ePosX = X
ePosY = Y
End If
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (Button And vbLeftButton) <> 0 Then
Picture1.DrawStyle = 2
Picture1.Cls
Picture1.Line (sPosX, sPosY)-(ePosX, ePosY), , B
ePosX = X
ePosY = Y
End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (Button And vbLeftButton) <> 0 Then
Picture1.DrawStyle = 0
Picture1.Cls
Picture1.Line (sPosX, sPosY)-(ePosX, ePosY), , B
End If
End Sub

投稿日時 - 2008-06-03 18:40:13

補足

ありがとうございました。
対応は完了し、画像が消えずに枠を表示することが出来ました。

投稿日時 - 2008-06-04 15:12:13

お礼

参考意見ありがとうございます。
お恥ずかしいのですが、課題ではなく仕事です。
範囲指定の枠が表示出来ました!

しかし、範囲指定するために画像の中をクリックすると
画像が消えてしまいます。
現在対応中です。

投稿日時 - 2008-06-04 11:22:16

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

VB6だけでやろうとすると結構大変です

というのも VB6には画像のブロック転送の機能がありません
したがってピクチャーボックスの画素をGetPixel/SetPixelをつかってループで処理するといった方法をとらないといけにからです

andy_kun氏のルーチンを参考にして 指示されて矩形をピクセル単位でアクセスしましょう
通常VB6で扱うグラフィックスの単位は TWIPです
これをPixel単位にするにはScreen.TwipsPerPiexlX/Screen.TwipsPerPiexlYなどから算出します

nPosX = sPosX / Screen.TwipsPerPiexlX
といった具合です

別の方法として ピクチャーボックスのScaleModeを3のvbPixelsにしておくとMouseMove/MouseDown/MouseUpなどで扱うX/Yはピクセル単位になります

WinAPIのScreenToClient/ClientToScreen/BitPltなどを使うと画像のブロック転送が可能です

また転送先のピクチャーボックスのAutoRedrawプロパティをTrueにしておくことも大切です

投稿日時 - 2008-06-04 10:10:47

補足

BitPltを使用したのですが、期待通りのブロック転送にはなりませんでした。
ScreenToClient/ClientToScreenは調べているのですが、
使い方が良くわからず、試せていません。

宜しければご教授願います。
宜しくお願い致します。

投稿日時 - 2008-06-04 16:51:22

お礼

回答ありがとうございます。
VB6だと大変なんですかぁ・・・。

現在、andy_kun氏のルーチンを参考に範囲指定の対応中です。
その後、redfox63氏の回答を参考に完成させたいと思います。

投稿日時 - 2008-06-04 11:29:45

あなたにオススメの質問