質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

5553閲覧

C# フォームアプリ スワイプで画面切替

m_rase

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/05/01 08:10

編集2020/05/06 14:49

スマートフォンのホームページの様に、
スワイプ(マウスのドラッグ)で画面を切り替える事が可能か知りたいです。
可能であれば、実現方法について教えて欲しいです。

イメージ
スワイプと一緒にPanel1が移動し、
画面のサイズの半分以上のスワイプでPanel2に切替。
半分未満のスワイプの場合は、Panel1のままにしたい。

Windows10
Visual Studio 2019
Windowsフォームアプリ

試した事の追記。
Panel1の中に3つのパネルを配置。(Panel1から4の幅は同じで、panel1だけ少し高い)
Panel1をクリックして、離した際の場所によって、スクロールの場所を変更する様にしました。

やれていない事、知りたい事
1)スクロールバーを表示しない様にしたい。
2)HorizontalScroll.Valueの値を2行入れないと値が更新されない。
label2、3のtextを変更している部分で、1行の時では、label2、3の内容が異なる。button1の部分も1行だけだと、スクロールバーのカーソルの位置が動かない。

C#

1 private int _PreviousX; 2 private int _PreviousMem; 3 private int _ScrollMem; 4 5 public Form1() 6 { 7 InitializeComponent(); 8 panel1.HorizontalScroll.Minimum = 0; 9 panel1.HorizontalScroll.Maximum = panel1.Width * 3; 10 } 11 12 private void panel1_MouseDown(object sender, MouseEventArgs e) 13 { 14 _ScrollMem = panel1.HorizontalScroll.Value; 15 panel1.Capture = true; 16 _PreviousX = panel1.PointToScreen(e.Location).X; 17 _PreviousMem = _PreviousX; 18 19 label1.Text = System.Convert.ToString(_ScrollMem); 20 } 21 22 private void panel1_MouseMove(object sender, MouseEventArgs e) 23 { 24 int dragPos; 25 26 27 if (panel1.Capture) 28 { 29 // ドラッグ中 30 var x = panel1.PointToScreen(e.Location).X; 31 dragPos = Math.Min( 32 Math.Max( 33 panel1.HorizontalScroll.Minimum, 34 panel1.HorizontalScroll.Value + _PreviousX - x), 35 panel1.HorizontalScroll.Maximum); 36 37 panel1.HorizontalScroll.Value = dragPos; 38 panel1.HorizontalScroll.Value = dragPos; 39 _PreviousX = x; 40 } 41 } 42 43 private void panel1_MouseUp(object sender, MouseEventArgs e) 44 { 45 int mouseValue; 46 int dispPos; 47 48 var xx = panel1.PointToScreen(e.Location).X; 49 mouseValue = _PreviousMem - xx; 50 51 if (Math.Abs(mouseValue) < (panel1.Width / 2)) 52 { 53 dispPos = _ScrollMem; // 移動量が半分以下の場合は元の位置 54 } 55 else if (mouseValue < 0) 56 { 57 dispPos = _ScrollMem - panel1.Width; 58 } 59 else 60 { 61 dispPos = _ScrollMem + panel1.Width; 62 } 63 64 dispPos = Math.Min( 65 Math.Max( 66 panel1.HorizontalScroll.Minimum,dispPos),panel1.HorizontalScroll.Maximum); 67 68 panel1.HorizontalScroll.Value = dispPos; 69 panel1.HorizontalScroll.Value = dispPos; 70 71 label2.Text = System.Convert.ToString(dispPos); 72 label3.Text = System.Convert.ToString(panel1.HorizontalScroll.Value); 73 74 panel1.Capture = false; 75 76 } 77 78 private void button1_Click(object sender, EventArgs e) 79 { 80 panel1.HorizontalScroll.Value = panel1.Width * 1; 81 panel1.HorizontalScroll.Value = panel1.Width * 1; 82 } 83 84 private void button2_Click(object sender, EventArgs e) 85 { 86 panel1.HorizontalScroll.Value = panel1.Width * 2; 87 panel1.HorizontalScroll.Value = panel1.Width * 2; 88 } 89 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/05/01 08:40 編集

可能です。自分で作らなければいけません。従って、作り方を教えても質問者が作れそうにない場合、回答がつかないのも十分考えられます。 コードを書いてくれる人の目に留まり、その人が暇なら回答がつくでしょう。
m_rase

2020/05/01 11:41

情報ありがとうございます。 難易度が高い、あるいはコード量が多く時間が掛かる等であると理解しました。 過去の他の掲示板で、解決になっていない理由が分かりました。
Zuishin

2020/05/01 11:55

なんと言えばいいかわかりませんが、難易度は高くありません。単に作業をやらされる気分になるだけです。
guest

回答2

0

ベストアンサー

Panel2枚でちょっと試してみたんですが以下はどうでしょう
使い方はPanelを2枚用意して、離してやり、それぞれにMouseDown、MouseMove、MouseUpを用意するだけです。
応用すれば3枚とかも行けそうな気はします。

cs

1 public partial class Form1 : Form { 2 Point mousePoint; 3 int panel1X, panel2X; 4 int panel1Y, panel2Y; 5 public Form1() { 6 InitializeComponent(); 7 panel1X = panel1.Location.X; 8 panel2X = panel2.Location.X; 9 panel1Y = panel1.Location.Y; 10 panel2Y = panel2.Location.Y; 11 } 12 private void panel1_MouseDown(object sender, MouseEventArgs e) { 13 if (e.Button != MouseButtons.Left) return; 14 panel1.Capture = true; 15 mousePoint = new Point(e.X, e.Y); 16 } 17 18 private void panel2_MouseDown(object sender, MouseEventArgs e) { 19 if (e.Button != MouseButtons.Left) return; 20 panel2.Capture = true; 21 mousePoint = new Point(e.X, e.Y); 22 } 23 24 private void panel1_MouseMove(object sender, MouseEventArgs e) { 25 if (panel1.Capture && e.Button == MouseButtons.Left) { 26 panel1.Location = new Point(panel1.Location.X + e.X - mousePoint.X, panel1.Location.Y); 27 } 28 } 29 30 private void panel2_MouseMove(object sender, MouseEventArgs e) { 31 if (panel2.Capture && e.Button == MouseButtons.Left) { 32 panel2.Location = new Point(panel2.Location.X + e.X - mousePoint.X, panel2.Location.Y); 33 } 34 } 35 36 private void panel1_MouseUp(object sender, MouseEventArgs e) { 37 panel1.Capture = false; 38 39 int mouseValue; 40 41 mouseValue = panel1.Location.X - panel1X; 42 43 if (Math.Abs(mouseValue) < (panel1.Width / 2)) { 44 panel1.Location = new Point(panel1X, panel1Y); 45 panel2.Location = new Point(panel2X, panel2Y); 46 } else if (mouseValue < 0) { 47 panel1.Location = new Point(panel2X, panel2Y); 48 panel2.Location = new Point(panel1X, panel1Y); 49 } else { 50 panel1.Location = new Point(panel1X, panel1Y); 51 panel2.Location = new Point(panel2X, panel2Y); 52 } 53 } 54 55 private void panel2_MouseUp(object sender, MouseEventArgs e) { 56 panel1.Capture = false; 57 58 int mouseValue; 59 60 mouseValue = panel2.Location.X - panel1X;//panel2はpanel1の位置 61 62 if (Math.Abs(mouseValue) < (panel2.Width / 2)) { 63 panel1.Location = new Point(panel2X, panel2Y); 64 panel2.Location = new Point(panel1X, panel1Y); 65 } else if (mouseValue < 0) { 66 panel1.Location = new Point(panel2X, panel2Y); 67 panel2.Location = new Point(panel1X, panel1Y); 68 } else { 69 panel1.Location = new Point(panel1X, panel1Y); 70 panel2.Location = new Point(panel2X, panel2Y); 71 } 72 } 73 }

投稿2020/05/13 13:59

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_rase

2020/05/13 15:34

回答ありがとうございます。 マウスに合わせて、panel1、2をそれぞれ移動する事ができました。 ここでPanel1のbuttonMoveをしている時にPanel2も同時に移動している様に見せたいのですが、 panel1の場所からオフセットした位置にpanel2のLocationを変更しても 選択しているパネルしか表示できませんでした。 ご存じであれば、panel1に合わせてpanel2を動いている様に表示する方法を教えて頂けないでしょうか。
m_rase

2020/05/13 15:44

すみません。 もう一度、実行した所、同時に表示が移動できていました。 3枚にするなど試して見たいと思います。 回答ありがとうございました。
Hey_CH

2020/05/13 16:45

頑張ってください!
guest

0

スワイプ機能については、以前、実装したことがあるので可能です。
ただ、コードの数行でどうにかなるようなものではないので回答がないのかもしれないですね。

こういうツールがあったりします。

「TouchToolkit for WinForms」
https://www.grapecity.co.jp/developer/controls/winforms/touchtoolkit

#追記

実装しなければならない点は3つあると思います。

(1) マウスが押されたら、Panel1 の Capture を true にし、マウスが離されるまでの動きに Panel1 の位置を追従させる。

(2) マウスが離されたら、スライドさせて消すのか、元に戻すのかの判定。

マウスの動きを記録し、どのくらいの速さでスライドさせるのかの判断が難しいです。
ここを誤ると違和感のある動作になってしまいます。

(3) AnimateWindow をつかって Panel1 をスライドする.

これは以下にサンプルを書きます。
AnimateWindow の使い方についてはどこかのサイトに載っているでしょう。
ボタン1つとパネルをフォームに張り付けて、以下のコードを実行してください。
ボタンを押すと、パネルが左から右にスライドして消えます。

C#

1namespace QA257985 2{ 3 using System; 4 using System.Windows.Forms; 5 using System.Runtime.InteropServices; 6 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 private const int 15 AW_NONE = 0, 16 AW_HOR_POSITIVE = 0x00000001, 17 AW_HOR_NEGATIVE = 0x00000002, 18 AW_VER_POSITIVE = 0x00000004, 19 AW_VER_NEGATIVE = 0x00000008, 20 AW_CENTER = 0x00000010, 21 AW_HIDE = 0x00010000, 22 AW_ACTIVATE = 0x00020000, 23 AW_SLIDE = 0x00040000, 24 AW_BLEND = 0x00080000; 25 26 [DllImport("user32.dll")] 27 private static extern bool AnimateWindow(IntPtr hWnd, int dwTimeMSec, int dwFlags); 28 29 private void button1_Click(object sender, EventArgs e) 30 { 31 panel1.Visible = true; 32 AnimateWindow(panel1.Handle, 400, AW_HIDE | AW_SLIDE | AW_HOR_POSITIVE); 33 panel1.Visible = false; 34 } 35 } 36}

投稿2020/05/01 08:51

編集2020/05/01 12:13
KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_rase

2020/05/01 11:51

回答ありがとうございます。 ネットで調べていた時にそのサイトを見ました。
m_rase

2020/05/01 12:23

ありがとうございます。 調べて、試させて頂きます。
m_rase

2020/05/06 14:50

遅くなってしまいましたが、教えて頂いた3について表示・非表示をスライドの様に見せる事ができました。回答ありがとうございました。 1,2を行う方法を、パネル3の中に、パネル1,2を入れてスクロールする事にしました。(他の方法が思いつかなかったためです。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問