マウスを使ったシール貼り付け への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 asakichi  (学生) 投稿日時 2011/12/28 17:41:49
とくまさん
投稿ありがとうございます。確かに目的は書いたほうが良かったかもしれません。誤解を招いてしまう可能性もありますし。ちなみに目的は先生の手伝いです。ご指摘ありがとうございました。
投稿者 asakichi  (学生) 投稿日時 2011/12/28 17:35:13
るきおさん
投稿ありがとうございます。おおむねその通りです。可能であれば回答用紙にシールを貼る欄を用意してそこに貼っていき、その状態を保存できるようにしたいと考えています。わざわざありがとうございました。
投稿者 とくま  (社会人) 投稿日時 2011/12/28 14:49:01
> プログラムを組むことになったのですが
こういう質問を学生がしたときに、理由や目的を確認しておくべきでは?
(プログラムの仕様ではなく、なぜ作らないといけないのか?)

例えば、研究発表の場合で、ここで紹介されたコードをそのまま、または
一部改変して使うと、そのコードを提示した人の名前も記名しておかないと
いけないですよね?ある程度一般化されたTips程度なら問題にならないだろう
けど、特定の目的で、しかも固有の考え方、普通やらない"アイデア"を
下さいって言っている時点でアウトでは?

>よろしければズッカさんの考えるプログラムを紹介していただけないでしょうか?
間単に聞いてるけど、聞いた回答を使えない可能性を考慮した上での
発言なんでしょうか?
投稿者 るきお  (社会人) 投稿日時 2011/12/27 23:56:54
まだ、よくわからないです。

こういうことですか?
・つまり、片方の紙には文字が書いてあるシールが15個貼ってあり、他方の紙は白紙(または罫線のみ)
・片方の紙からシールをはがして他方の紙に貼る。
・シールを貼る位置は任意


Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Me.BackColor = Color.DarkGray

        Dim PictureBox1 As New PictureBox
        PictureBox1.Location = New Point(10, 10)
        PictureBox1.Size = New Size(300, 400)
        PictureBox1.BackColor = Color.White
        Me.Controls.Add(PictureBox1)

        Dim PictureBox2 As New PictureBox
        PictureBox2.Location = New Point(320, 10)
        PictureBox2.Size = New Size(300, 400)
        PictureBox2.BackColor = Color.White
        Me.Controls.Add(PictureBox2)

        Dim font As New Font(Me.Font.FontFamily, 16)

        Dim Label1 As New DraggableLabel
        Label1.Text = "明るい性格である"
        Label1.Location = New Point(20, 20)
        Label1.Size = New Size(250, 30)
        Label1.BackColor = Color.Yellow
        Label1.Font = font
        Me.Controls.Add(Label1)
        Label1.BringToFront()

        Dim Label2 As New DraggableLabel
        Label2.Text = "真面目な性格である"
        Label2.Location = New Point(20, 60)
        Label2.Size = New Size(250, 30)
        Label2.BackColor = Color.Yellow
        Label2.Font = font
        Me.Controls.Add(Label2)
        Label2.BringToFront()

        Dim Label3 As New DraggableLabel
        Label3.Text = "優しい性格である"
        Label3.Location = New Point(20, 100)
        Label3.Size = New Size(250, 30)
        Label3.BackColor = Color.Yellow
        Label3.Font = font
        Me.Controls.Add(Label3)
        Label3.BringToFront()

    End Sub

    Public Class DraggableLabel
        Inherits Label

        Dim IsDragging As Boolean 'ドラッグ中の場合True 
        Dim DiffPoint As Point 'ドラッグ開始地点とドラッグ開始時のボタンの位置とのずれ  
        Private Sub Label_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown

            If e.Button = MouseButtons.Left Then
                IsDragging = True
                DiffPoint = New Point(e.X, e.Y)
            End If

        End Sub

        Private Sub Label_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp

            If e.Button = MouseButtons.Left Then
                IsDragging = False
            End If

        End Sub

        Private Sub Button1_MouseMove(ByVal sender As ObjectByVal e As MouseEventArgs) Handles Me.MouseMove

            If IsDragging Then

                Dim DestX As Integer = sender.Location.X + e.X - DiffPoint.X
                Dim DestY As Integer = sender.Location.Y + e.Y - DiffPoint.Y

                sender.Location = New Point(DestX, DestY)

            End If

        End Sub

    End Class

End Class
投稿者 ラオシス  (中学生) 投稿日時 2011/12/27 22:23:32
新しくコントロールを使うという風に考えた方がいいかもしれませんね。
WPFを検討された方がいいかもしれません。

その並び替えということなら、移動させるというより順番を記憶する方が楽かと思います
Labelを準備し、Labelをクリックで番号をLabel.Textの先頭にいれるというかんじで。
投稿者 asakichi  (学生) 投稿日時 2011/12/27 18:08:03
ズッカさん
投稿ありがとうございます。アンケート結果については考慮しません。あくまでアンケートを行うだけです。回答用紙は確かにおっしゃるとおり必要ないかもしれません。改めて考えて見ます。
複数の設問が置かれているコントロール上で設問を並べ替えればいいのではとありましたが、よろしければズッカさんの考えるプログラムを紹介していただけないでしょうか?
投稿者 shu  (社会人) 投稿日時 2011/12/27 17:51:40
> シールにしたのは何度もやり直しができるようにするためです。
パソコンでの操作なんだからやり直しが出来るようにするのにシールという考えはいらないと思います。

設問があって回答をラジオボタンで選択するというのは駄目なのでしょうか?
投稿者 ズッカ  (社会人) 投稿日時 2011/12/27 17:21:52
複数の設問を当てはまると考える順に並べるということは分かりましたが、「回答用紙」なるものは何のために必要なのでしょうか?
複数の設問が置かれているコントロール上で設問を並べ替えればいいのではと思うのですが、どうなのでしょう。
あと疑問に思うのは、アンケートに協力した人は、このソフトで回答するわけですが、結果はどのように処理・集計することを想定しているのでしょうか?
アウトプットとしては、各設問の並び順が欲しいのですよね?
投稿者 asakichi  (学生) 投稿日時 2011/12/27 15:32:18
るきおさん
言葉足らずで申し訳ないです。やりたいのはアンケート調査です。例えば、「自分は明るい性格である」というような問いを15問程度用意します。これを回答者に自分が当てはまるなと考える順に別の回答用紙に貼り付けてもらいます。回答用紙にはシールを貼るスペースを作っています(15個)。シール状と書いたのは、15問の問いを1問ずつ分けてシールにして、別の回答用紙に貼り付けてもらいます。シールにしたのは何度もやり直しができるようにするためです。

今回はこのシールを自分に当てはまるな、と思う順に回答用紙に貼っていってもらう作業をなんとかVisual Studioで実現したいと考えています。何度も行っているとコストが掛かること、用意が面倒、というのが理由です。
投稿者 るきお  (社会人) 投稿日時 2011/12/26 22:00:37
やりたいことがよくわからないです。

マークシート式ならよく聞きますが、最近は『シール形式の答え』というものがあるのですか?

プログラムの話はいったん忘れて、『シール形式の答え』がどういうものか教えてください。
投稿者 asakichi  (学生) 投稿日時 2011/12/26 20:27:22
ラオシスさん
投稿ありがとうございます。PictureBoxにはあらかじめWordで作ったラベル状の回答シールと、それを貼り付けていく回答用紙を用意しており、それを画像化し、実際手で行うことをマウスでできるようにしたいと思っています(手でシールをはがし、回答用紙に当てはまる箇所に貼り付ける作業)。これは難しいのでしょうか?
投稿者 ラオシス  (中学生) 投稿日時 2011/12/26 19:35:23
かなり大雑把ですね。もう少し具体的にお願いできませんか?

>2つのPictureBoxで片方を答案用紙
とりあえず文字を描画するにはDrawStringで行うことができます。
答案用紙はPictureBoxでなくいくつかのLabelをコード上で生成したほうがいいかもしれませんが。
どちらにしろ文を描画するのにどこで改行すればいいか、シールを入れるための空白の位置というのを判断する必要があります。

>片方をシール形式の答えを用意し、マウスを使ってシールを貼ったりはがしたり
PictureBoxを移動させるというのがいいと思います。たしか移動させるスレがこの掲示板にあったはずです。

>シールと答案用紙の座標認識が必要
座標認識はかなり難しいと思います。シールをあてはめ、固定するにはシューティングゲームで言う当たり判定を実装すればいいかと。数学が必要ですね

簡単なものですが、
第 5 章 単語帳を作ろう
http://www.microsoft.com/Japan/msdn/archive/student/challenge/chap5_vb/default.aspx
もご参考に。
投稿者 asakichi  (学生) 投稿日時 2011/12/26 14:26:05
2つのPictureBoxで片方を答案用紙、もう片方をシール形式の答えを用意し、マウスを使ってシールを貼ったりはがしたりするプログラムを組むことになったのですが、どう組めばいいか思い浮かびません。シールと答案用紙の座標認識が必要なのはわかるのですが…どうかアイデアをお願いします。