色々調べてみたのですが解決できないのでよろしくお願いします。
画像をクリックしたときに、その画像を選択状態にして、画像を変更したり
拡大、縮小できるようにしたいと考えてます。
拡大、縮小は難しくとも、とりあえず、選択状態にして画像変更ができるようにしたいと思ってます。
PictureBoxをクリックしたときに選択状態にするには
どうしたらよいのでしょうか
web検索をしても検索内容にヒットするものがにみつかりませんでした。
画像をクリックしたときに、その画像を選択状態にして、画像を変更したり
拡大、縮小できるようにしたいと考えてます。
拡大、縮小は難しくとも、とりあえず、選択状態にして画像変更ができるようにしたいと思ってます。
PictureBoxをクリックしたときに選択状態にするには
どうしたらよいのでしょうか
web検索をしても検索内容にヒットするものがみつかりませんでした
本を買いなよ。
ケチっていても、逆に損するよ。
たとえば、10個の事を覚えるのに、本無しでは5〜10倍の勉強時間が必要です。
バカらしいでしょ?
1時間で覚えれる事を5時間とか、あるいは3日も10日もかかるのは時間が、もったいないと考えます。
急がばマワレ。
本は片っ端から読みましたが、本には出てないんですよね。
グラフィックソフトでは、(ワードなんかも含めて)画像をクリックすると1辺の両角と真ん中に計3つの点ができてそこにマウスをもってくと移動や拡大、縮小の矢印がでるようになっていますよね。
その機能はどのようにしたら実現できるのかな?と思って質問した次第です。
ひよっこの私にはまだ難しいテクかもしれませんね。
オカシイとゆうのを考えた方がいいですよ。
この掲示板には5人くらいしかいない。とゆうこととかね。
プロバイダーや回線業者を変えたほうがいいでしょう。
ぼくは、3月にはインターネット業者をすべて変更しますけどね。
ネットカフェと情報が違うのは、接続サーバーが本物と違うからだ。
質問内容と違う書き込みで、すまんな。
なぜ、まともなレスがつかないのでしょうか?
あまりにも簡単すぎるから
それともとてつもなくむずかしいから
どちらでしょうか?
> グラフィックソフトでは、(ワードなんかも含めて)画像をクリックすると1辺の両角と真ん中に計3つの点ができてそこにマウスをもってくと移動や拡大、縮小の矢印がでるようになっていますよね。
> その機能はどのようにしたら実現できるのかな?と思って質問した次第です。
自分で実装してください。
画像の選択という機能自体,Windowsや.NET Frameworkにあるものではありません。
# 文字の選択に関しては,エディットコントロールやリッチテキストコントロールが標準で存在する
なので,選択という状態を用意したとして,それをどのように表現するかまであわせて仕様に依存します。
>自分で実装してください
そうですか。
ただ、マウスを画像にもっていったときにハンドルがでるようにするためには、どのクラスを調べるとよいのかおしえていただけますか?
サンプル集を調べまくったのですが、みつかりませんでした。
MSDNなどでもっと調べてみますが、ヒントだけでもいただけたら
有り難いです。
まず,「ハンドルが出る」という機能は全部自分で描く必要があります。
なので,描画関係,System.Drawing.Graphicsまわりでしょうか。
あとは,MouseDownイベントやMouseUpイベントを捕捉することになると思います。
選択状態
http://bbs.wankuma.com/search.cgi?mode=srch&ALL=1&word=16603&logs=all
こういうのでいいのかな
「SetROP2 ラバーバンド」とかで検索するともう少し見つかるかも。
アドバイスいただきましたので、早速ラバーバンドなるものを
作ってみました。
しかし、マウスを下から上に移動して右方向にムーブすると描画できますが
上から下の方向にムーブしても描画できません。
原因がつかめず困っています。
コードに間違いがありましたらおしえてください。(VB2008)
Dim drawfrg As Boolean '描画フラグ
Dim startpoint As Point '開始位置
Dim endpoint As Point '終了位置
Private Sub PictureBox2_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseDown
If drawfrg = False Then '描画フラグがoffのとき(1回目のクリック)
startpoint.X = e.X '開始位置の取得
startpoint.Y = e.Y
drawfrg = True '描画フラグON
endpoint.X = -1 '終了位置の初期化
endpoint.X = -1
Else
If endpoint.X <> -1 Then '前のラバーバンドを消す
drawraberrectangle(startpoint, endpoint)
End If
endpoint.X = e.X '終了位置を取得
endpoint.Y = e.Y
Dim x As Integer '四角形の左上隅X座標
If startpoint.X < endpoint.X Then
x = startpoint.X
Else
x = endpoint.X
Dim y As Integer '四角形の左上隅y座標
If startpoint.Y < endpoint.Y Then
y = startpoint.Y
Else
y = endpoint.Y
'四角形の幅と高さ
Dim w As Integer = Math.Abs(startpoint.X - endpoint.X)
Dim h As Integer = Math.Abs(startpoint.Y - endpoint.Y)
'四角形の描画
Dim g As Graphics = PictureBox2.CreateGraphics()
g.DrawRectangle(Pens.Black, x, y, w, h)
'コンテナコントロールのグラブハンドルグリフの描画
ControlPaint.DrawContainerGrabHandle(g, New Rectangle(x, y, 15, 15))
ControlPaint.DrawContainerGrabHandle(g, New Rectangle(x + w - 15, y, 15, 15))
ControlPaint.DrawContainerGrabHandle(g, New Rectangle(x, y + h - 15, 15, 15))
ControlPaint.DrawContainerGrabHandle(g, New Rectangle(x + w - 15, y + h - 15, 15, 15))
g.Dispose()
'描画フラグoff
drawfrg = False
End If
End If
End If
End Sub
Private Sub PictureBox2_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseMove
If drawfrg = False Then '描画フラグoffのとき
Return
End If
If endpoint.X <> -1 Then '前のラバーバンドを消す
drawraberrectangle(startpoint, endpoint)
End If
endpoint.X = e.X '終了位置を更新
endpoint.Y = e.Y
drawraberrectangle(startpoint, endpoint) '新しいラバーバンドを描画
End Sub
Private Sub drawraberrectangle(ByVal p1 As Point, ByVal p2 As Point)
p1 = PictureBox2.PointToScreen(p1) 'スクリーン座標に変換
p2 = PictureBox2.PointToScreen(p2)
Dim rect As Rectangle = New Rectangle() '四角形
If p1.X < p2.X Then '左上隅x座標
rect.X = p1.X
Else
rect.X = p2.X
If p1.Y < p2.Y Then '左上隅y座標
rect.Y = p1.Y
Else
rect.Y = p2.Y
'幅と高さ
rect.Width = Math.Abs(p1.X - p2.X)
rect.Height = Math.Abs(p1.Y - p2.Y)
'ラバーバンド(四角形)を描画
ControlPaint.DrawReversibleFrame(rect, Color.White, FrameStyle.Dashed)
End If
End If
End Sub
自己解決しました。
みなさん有り難う。
今回色々やってみて
windowsに付属しているペイントというグラフィックソフトを作成するのは
とても大変なことだと思いました。
読み込んだ画像をマウスで拡大したり、縮小したりする機能などは
ラバーバンドの機能を使っているとは思うのですが、その実現方法は
思いつきません。
そうした機能を実現するコンテナがVBなどにも標準で付属するようになるといいですね