画像を選択状態にするには

解決


hori  2009-10-25 10:14:11  No: 146421  IP: 192.*.*.*

色々調べてみたのですが解決できないのでよろしくお願いします。

画像をクリックしたときに、その画像を選択状態にして、画像を変更したり
拡大、縮小できるようにしたいと考えてます。

拡大、縮小は難しくとも、とりあえず、選択状態にして画像変更ができるようにしたいと思ってます。
PictureBoxをクリックしたときに選択状態にするには
どうしたらよいのでしょうか

web検索をしても検索内容にヒットするものがにみつかりませんでした。

編集 削除
hori  2009-10-25 13:04:27  No: 146422  IP: 192.*.*.*

画像をクリックしたときに、その画像を選択状態にして、画像を変更したり
拡大、縮小できるようにしたいと考えてます。

拡大、縮小は難しくとも、とりあえず、選択状態にして画像変更ができるようにしたいと思ってます。
PictureBoxをクリックしたときに選択状態にするには
どうしたらよいのでしょうか

web検索をしても検索内容にヒットするものがみつかりませんでした

編集 削除
聖帝  2009-10-25 16:17:23  No: 146423  IP: 192.*.*.*

本を買いなよ。
ケチっていても、逆に損するよ。
たとえば、10個の事を覚えるのに、本無しでは5〜10倍の勉強時間が必要です。
バカらしいでしょ?
1時間で覚えれる事を5時間とか、あるいは3日も10日もかかるのは時間が、もったいないと考えます。
急がばマワレ。

編集 削除
hori  2009-10-25 18:15:35  No: 146424  IP: 192.*.*.*

本は片っ端から読みましたが、本には出てないんですよね。

グラフィックソフトでは、(ワードなんかも含めて)画像をクリックすると1辺の両角と真ん中に計3つの点ができてそこにマウスをもってくと移動や拡大、縮小の矢印がでるようになっていますよね。
その機能はどのようにしたら実現できるのかな?と思って質問した次第です。
ひよっこの私にはまだ難しいテクかもしれませんね。

編集 削除
聖帝  2009-10-25 21:50:41  No: 146425  IP: 192.*.*.*

オカシイとゆうのを考えた方がいいですよ。
この掲示板には5人くらいしかいない。とゆうこととかね。
プロバイダーや回線業者を変えたほうがいいでしょう。
ぼくは、3月にはインターネット業者をすべて変更しますけどね。
ネットカフェと情報が違うのは、接続サーバーが本物と違うからだ。
質問内容と違う書き込みで、すまんな。

編集 削除
hori  2009-10-25 22:04:05  No: 146426  IP: 192.*.*.*

なぜ、まともなレスがつかないのでしょうか?
あまりにも簡単すぎるから
それともとてつもなくむずかしいから
どちらでしょうか?

編集 削除
YuO  2009-10-25 22:58:18  No: 146427  IP: 192.*.*.*

> グラフィックソフトでは、(ワードなんかも含めて)画像をクリックすると1辺の両角と真ん中に計3つの点ができてそこにマウスをもってくと移動や拡大、縮小の矢印がでるようになっていますよね。
> その機能はどのようにしたら実現できるのかな?と思って質問した次第です。

自分で実装してください。
画像の選択という機能自体,Windowsや.NET Frameworkにあるものではありません。
# 文字の選択に関しては,エディットコントロールやリッチテキストコントロールが標準で存在する
なので,選択という状態を用意したとして,それをどのように表現するかまであわせて仕様に依存します。

編集 削除
hori  2009-10-26 06:55:23  No: 146428  IP: 192.*.*.*

>自分で実装してください
そうですか。

ただ、マウスを画像にもっていったときにハンドルがでるようにするためには、どのクラスを調べるとよいのかおしえていただけますか?

サンプル集を調べまくったのですが、みつかりませんでした。
MSDNなどでもっと調べてみますが、ヒントだけでもいただけたら
有り難いです。

編集 削除
YuO  2009-10-26 11:14:11  No: 146429  IP: 192.*.*.*

まず,「ハンドルが出る」という機能は全部自分で描く必要があります。
なので,描画関係,System.Drawing.Graphicsまわりでしょうか。
あとは,MouseDownイベントやMouseUpイベントを捕捉することになると思います。

編集 削除
ぷす  2009-10-26 13:32:32  No: 146430  IP: 192.*.*.*

選択状態
http://bbs.wankuma.com/search.cgi?mode=srch&ALL=1&word=16603&logs=all
こういうのでいいのかな

「SetROP2 ラバーバンド」とかで検索するともう少し見つかるかも。

編集 削除
hori  2009-10-27 10:05:54  No: 146431  IP: 192.*.*.*

アドバイスいただきましたので、早速ラバーバンドなるものを
作ってみました。
しかし、マウスを下から上に移動して右方向にムーブすると描画できますが
上から下の方向にムーブしても描画できません。
原因がつかめず困っています。
コードに間違いがありましたらおしえてください。(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

編集 削除
hori  2009-10-27 12:53:48  No: 146432  IP: 192.*.*.*

自己解決しました。
みなさん有り難う。

編集 削除
hori  2009-10-27 14:13:15  No: 146433  IP: 192.*.*.*

今回色々やってみて
windowsに付属しているペイントというグラフィックソフトを作成するのは
とても大変なことだと思いました。
読み込んだ画像をマウスで拡大したり、縮小したりする機能などは
ラバーバンドの機能を使っているとは思うのですが、その実現方法は
思いつきません。
そうした機能を実現するコンテナがVBなどにも標準で付属するようになるといいですね

編集 削除