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

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

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

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

Visual Studio

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

button

HTMLで用いる<button>タグです。

Q&A

解決済

2回答

1271閲覧

クリック操作とエンターキーについて

pj7577bm60v

総合スコア13

C#

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

Visual Studio

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

button

HTMLで用いる<button>タグです。

0グッド

1クリップ

投稿2020/03/18 01:31

編集2020/03/18 02:13

前提・実現したいこと

VisualStudioでWindowsFormAppを勉強しているものです。

発生している問題・エラーメッセージ

PictureBoxに線を書き出すアプリを作成したのですが、マウスでクリック操作すると上手くPictureBoxに線が書き出されるのですが、
キーボードでEnterを押すと書き出された線がすぐに消えてしまいます。

エンターキー操作でもクリック操作と同じ結果を得るにはどうすればよろしいのでしょうか?

visual C#

### 該当のソースコード using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace BoxMaterialApp { public partial class Form5 : Form { //x軸,y軸の始点の決定 int x = 100; int y = 20; //ボックスの高さ、テキストボックス1 private double box_h = 0; //ボックスと扉の下面の隙間、テキストボックス2 private double gap = 0; //扉の高さ、テキストボックス3 private double door_h = 0; //扉下面からハンドル上面までの高さ、テキストボックス4 private double handle_h = 0; //上面ガーター部の曲げの値、テキストボックス5 private double garter_over = 0; //下面ガーター部の曲げの値、テキストボックス6 private double garter_under = 0; public Form5() { InitializeComponent(); //ピクチャーボックスをクリア var g = pictureBox2.CreateGraphics(); g.Clear(Color.WhiteSmoke); //ボタンを隠す button2.Visible = false; label1.Visible = false; textBox1.Visible = false; button3.Visible = false; label2.Visible = false; textBox2.Visible = false; button4.Visible = false; label3.Visible = false; textBox3.Visible = false; button5.Visible = false; label4.Visible = false; textBox4.Visible = false; button6.Visible = false; label5.Visible = false; textBox5.Visible = false; button7.Visible = false; label6.Visible = false; textBox6.Visible = false; button8.Visible = false; comboBox1.Visible = false; label7.Visible = false; label8.Visible = false; } private bool checkValue() { //テキストボックスの値をdouble型に変換してフィールドに格納 //成功すればtrueを返す try { box_h = Convert.ToDouble(textBox1.Text); return true; } //int型に変換できないときはメッセージを送信 //falseを返す catch { MessageBox.Show("半角数字で入力してください。", "エラー"); return false; } //テキストボックスをクリアする。 finally { textBox1.Clear(); } } private bool checkValue2() { //テキストボックスの値をdouble型に変換してフィールドに格納 //成功すればtrueを返す try { gap = Convert.ToDouble(textBox2.Text); return true; } //int型に変換できないときはメッセージを送信 //falseを返す catch { MessageBox.Show("半角数字で入力してください。", "エラー"); return false; } //テキストボックスをクリアする。 finally { textBox2.Clear(); } } private void button1_Click(object sender, EventArgs e) { //ボタンを隠す button1.Visible = false; //ボタンの表示 button2.Visible = true; label1.Visible = true; textBox1.Visible = true; //カーソルのフォーカス textBox1.Focus(); // button2 を [承諾] ボタンに設定する this.AcceptButton = this.button2; //ピクチャーボックスの宣言 var g = pictureBox2.CreateGraphics(); g.Clear(Color.WhiteSmoke); //太線の宣言 var bold = new Pen(Color.Black, 2); //本体フレーム(上)を表示 var points1 = new Point[5]; points1[0] = new Point(x, y); points1[1] = new Point((x + 50), y); points1[2] = new Point((x + 50), (y + 50)); points1[3] = new Point((x + 75), (y + 50)); points1[4] = new Point((x + 75), (y + 25)); g.DrawLines(bold, points1); //本体フレーム(下)を表示 var points2 = new Point[5]; points2[0] = new Point(x, (y + 300)); points2[1] = new Point((x + 50), (y + 300)); points2[2] = new Point((x + 50), (y + 250)); points2[3] = new Point((x + 75), (y + 250)); points2[4] = new Point((x + 75), (y + 275)); g.DrawLines(bold, points2); //扉表示 var points3 = new Point[4]; points3[0] = new Point((x + 60), (y + 10)); points3[1] = new Point((x + 85), (y + 10)); points3[2] = new Point((x + 85), (y + 290)); points3[3] = new Point((x + 60), (y + 290)); g.DrawLines(bold, points3); //縦線の寸法線を表示 g.DrawLine(Pens.Blue, (x + 95), y, (x + 140), y); g.DrawLine(Pens.Blue, (x + 130), y, (x + 130), (y + 300)); g.DrawLine(Pens.Blue, (x + 95), (y + 300), (x + 140), (y + 300)); } private void button2_Click(object sender, EventArgs e) { if (checkValue()) { //ボタンを隠す button2.Visible = false; label1.Visible = false; textBox1.Visible = false; //ボタンの表示 button3.Visible = true; label2.Visible = true; textBox2.Visible = true; //カーソルのフォーカス textBox2.Focus(); // button3 を [承諾] ボタンに設定する this.AcceptButton = this.button3; //ピクチャーボックスをクリア var g = pictureBox2.CreateGraphics(); g.Clear(Color.WhiteSmoke); //太線の宣言 var bold = new Pen(Color.Black, 2); //本体フレーム(下)を表示 var points2 = new Point[5]; points2[0] = new Point(x, (y + 200)); points2[1] = new Point((x + 50), (y + 200)); points2[2] = new Point((x + 50), (y + 150)); points2[3] = new Point((x + 75), (y + 150)); points2[4] = new Point((x + 75), (y + 175)); g.DrawLines(bold, points2); //扉表示 var points3 = new Point[3]; points3[0] = new Point((x + 85), (y + 50)); points3[1] = new Point((x + 85), (y + 190)); points3[2] = new Point((x + 60), (y + 190)); g.DrawLines(bold, points3); //縦線の寸法線を表示 g.DrawLine(Pens.Blue, (x + 95), (y + 190), (x + 140), (y + 190)); g.DrawLine(Pens.Blue, (x + 130), (y + 190), (x + 130), (y + 200)); g.DrawLine(Pens.Blue, (x + 95), (y + 200), (x + 140), (y + 200)); } } } }

//作業しながらでしたので追加のコードがあります。
//原因が分からず発見したのも完成後でしたので全文載せさせていただきまいした。
//よろしくおねがいいたします。

試したこと

クリック操作とエンター操作はデフォルトで同じ操作になっているという記事を見つけて行き詰ってしまいました。
ご教授お願いいたします。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2019
Version 16.5.0
.NET Framework version 4.8.03752

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

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

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

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

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

nskydiving

2020/03/18 01:40

>キーボードでEnterを押すと書き出された線がすぐに消えてしまいます。 問題となっているこのコードをご提示いただけますでしょうか。 また、コードのインデントが崩れてしまっていますので、マークダウンの<code>タグを使用してください。 質問欄は編集ボタンから変更することができます。
pj7577bm60v

2020/03/18 02:16

コードタグの使い方を教えていただきありがとうございました。
nskydiving

2020/03/18 02:30

修正されたコードを拝見しましたが、「Enterを押すと」のコードが含まれていないように思いますが、どの部分なのでしょうか?
pj7577bm60v

2020/03/18 02:49

実際どこが上手くいっていないのかよくわかってなく、ビルドした物をテストしていたら発見して解決できていない状態です。 例えばgithubなどでコードを確認していただく事などは可能なのでしょうか。 https://github.com/dj8639rsm/BoxMaterialApp もしよろしければよろしくお願いします。
guest

回答2

0

ベストアンサー

Control.CreateGrahics メソッドで作成した Graphics オブジェクトに描画すると、何かの拍子に再描画されたとき(最小化して戻す等)に消えてなくなります。

それを避けるには、Bitmap を作成して PicutureBox の Image プロパティに保存し、Graphics.FromImage メソッドで作成した Graphics オブジェクトに描画します。
描画したあとは、Invalidate メソッドで再描画要求してください。

フォームに PictureBox を2つ貼り付け、以下のコードを実行し、フォームをクリックしてください。
最小化して戻すと pictureBox1 に書かれた内容が消えるはずです。

C#

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4 5namespace WindowsFormsApp1 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() { 10 InitializeComponent(); 11 } 12 13 protected override void OnLoad(EventArgs e) { 14 base.OnLoad(e); 15 var cs = pictureBox2.ClientSize; 16 var bmp = new Bitmap(cs.Width, cs.Height); 17 pictureBox2.Image = bmp; 18 } 19 20 protected override void OnClick(EventArgs e) { 21 base.OnClick(e); 22 using (var g = pictureBox1.CreateGraphics()) { 23 DrawCircles(g); 24 } 25 using (var g = Graphics.FromImage(pictureBox2.Image)) { 26 DrawCircles(g); 27 } 28 pictureBox2.Invalidate(); 29 } 30 31 private static void DrawCircles(Graphics g) { 32 var es = new Size(50, 50); 33 g.DrawEllipse(Pens.Blue, new Rectangle(new Point(0, 0), es)); 34 g.DrawEllipse(Pens.Gold, new Rectangle(new Point(es.Width / 2, es.Height / 2), es)); 35 g.DrawEllipse(Pens.Black, new Rectangle(new Point(es.Width, 0), es)); 36 g.DrawEllipse(Pens.Green, new Rectangle(new Point(es.Width * 3 / 2, es.Height / 2), es)); 37 g.DrawEllipse(Pens.Red, new Rectangle(new Point(es.Width * 2, 0), es)); 38 } 39 } 40}

#追記
Enter キー云々に関しては、AcceptButton プロパティを参照してください。
「Form.AcceptButton プロパティ」
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.acceptbutton?view=netframework-4.8

投稿2020/03/18 05:26

編集2020/03/18 05:41
KOZ6.0

総合スコア2696

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

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

pj7577bm60v

2020/03/18 05:52

Enterキーやクリック操作ではなくBitmapやPictureBoxのコードから解決できるんですね。 とてもわかりやすかったです。ありがとうございました。
guest

0

KeyPressイベントを実装して、Enterキーを握りつぶす、と同時に、クリック相当の処理をさせればよろしい

投稿2020/03/18 01:52

y_waiwai

総合スコア88024

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問