最終更新 2025.05.14
ファイル --- 新規作成 --- 新しいプロジェクト で言語、OS、を選ぶと必要なコンパイラをインストール してくれる。
Visual Studio 2022 community (無料) をインストールすると、 Visual Studio と blend for Visual Studio の 2 つが インストールされる。この2つは別物である。 blend はコントロールがないので、 プログラムが開発できない。 スタートメニューの「最近追加されたもの」 に「blend for Visual Studio」だけが表示されることがある。 V ではじまるアプリのところに存在する Visual Studio 2022 をスタートメニューに追加する。
● テキストエディタの文字サイズ 背景 ツール --- オプション --- 環境 フォントおよび色:16 全般 配色テーマ:青 ●「表示」→「ソリューションエクスプローラ」 ●「表示」→「ツールボックス」 ツールボックスが開く Form にドラッグする
新しいプロジェクトの作成 プロジェクトの種類 言語 C# プラットフォーム Windows デスクトップ (a) Windows フォームアプリケーション(.NET Framework) (b) Windows フォームアプリ (c) WPF アプリケーション の 3 種類がある 違いは以下のサイトで説明されている。 https://impsbl.hatenablog.jp/entry/WinFormsAndWPF-WhatIsDifference (b)(c) はアプリを配布するときに .NET Core をインストールする必要が あるらしい。Windows に標準で添付されているものを使うのであれば (a) を選ぶ。ただし、.NET Framework の最終バージョンは 4.8 で 開発がストップしているらしい。 「プロジェクト名」で指定したフォルダが「場所」の下に 作成される。
ソリューションのフォルダ一式を移動してから sln ファイルを読み込むと、エラーがでる。 「ファイル」→「ファイルを開く」で開くと良いらしいが 未確認である
Form1.cs フォームデザイナが開く コントロールの上でダブルクリックすると コードを編集するタブが開く Form1.Designer.cs コントロールのオブジェクト名の確認
表示 --- ツールボックス コントロールをドラッグする ctrl-C ctrl-V で複製可能 新しいオブジェクト名がつく(ex. Label1 を複製して Label2)
TextBox を使う(1 行、複数行兼用)
フォントサイズ、テキストの設定
右クリック --- プロパティ(画鋲マークで固定)
複数行表示
テキストボックスの右上端の▲ --- Multiline にチェック
表示内容の更新
string line = string.Format("{0}\n",count);
textBox1.Text = line;
textBox1.AppendText(line + "\r\n");
Format(" {a,b:c} \r\n",var);
b と c は省略可
a 何番目の変数か
b 桁数
c F2 実数 小数点以下 2 桁
E2 指数形式 小数点以下 2 桁 E のとき桁数は無効
X 16 進
GroupBox の上に RadioButton を配置すると 自動的に排他的にチェックされる。 あらかじめチェックを入れておくには プロパティの 表示 --- checked を true
表示 --- プロパティウィンドウ 右端にプロパティウィンドウが表示される。 稲妻マーク(イベント)をクリック
重大度レベル (略) "obj\Debug\client.exe" を "bin\Debug\client.exe" に コピーできませんでした。 10 回の再試行回数を超えたため、失敗しました。 このファイルは "client (2544)" によってロックされています。 なぜか上のエラーが出ることがある。 Visual Studio を再起動しても関係ない。 サインアウトしないと解消しない。
(1)
using System.IO; を追加
(2)
InitializeComponent(); の直後に
EnableDragDrop(textBox1);
(3) 以下のメソッドを追加
private void EnableDragDrop(Control control)
{
//ドラッグ&ドロップを受け付けられるようにする
control.AllowDrop = true;
//ドラッグが開始された時のイベント処理(マウスカーソルをドラッグ中のアイコンに変更)
control.DragEnter += (s, e) =>
{
// ドラッグドロップ時にカーソルの形状を変更
// e.Effect = DragDropEffects.All;
//ファイルがドラッグされたとき、カーソルをドラッグ中のアイコンに変更し、そうでない場合は何もしない。
e.Effect = (e.Data.GetDataPresent(DataFormats.FileDrop)) ? DragDropEffects.Copy : e.Effect = DragDropEffects.None;
};
//ドラッグ&ドロップが完了した時の処理(ファイル名を取得し、ファイルの中身をTextプロパティに代入)
control.DragDrop += (s, e) =>
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) // ドロップされたものがファイルかどうか確認する。
{
string[] paths = ((string[])e.Data.GetData(DataFormats.FileDrop));
// ここに、ドラッグ&ドロップ受付時の処理を記述する
for (int i = 0; i < paths.Length; i++)
{
string line = Path.GetFileName(paths[i]) + " が DragDrop されました。\r\n";
textBox1.AppendText(line);
}
}
};
}
(1) Program.cs の static void Main() を以下のように変更
static void Main(string[] args)
Application.Run(new Form1(args));
(2) Form1 に引数を追加
public Form1(string[] args)
(3) InitializeComponent(); の直後に以下を記述
int i, n;
string line;
n = args.Length;
line = string.Format("コマンドライン引数の個数は {0} 個\r\n", n);
textBox1.Text = line;
for (i = 0; i < n; i++)
{
line = string.Format("{0} : {1}\r\n", i, args[i]);
textBox1.AppendText(line);
}
Form1 のコンストラクタ InitializeComplnent(); の直後に this.ActiveControl = this.button1;
this.Text = "名前";
Application.Exit();
string line;
line = string.Format("{0} {1}\n",x,y);
{0} {1} は変数の順番
{a,b:c} のとき
a: 変数の順番
b: 桁数
c: F3 小数点以下 3 桁
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
private const int CF_ENHMETAFILE = 14;
[DllImport("user32.dll")]
private static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll")]
private static extern int IsClipboardFormatAvailable(int wFormat);
[DllImport("user32.dll")]
private static extern IntPtr GetClipboardData(int wFormat);
[DllImport("user32.dll")]
private static extern int CloseClipboard();
--------------------------------------
OpenClipboard(this.Handle);
IntPtr hmeta = GetClipboardData(CF_ENHMETAFILE);
Metafile emf2 = new System.Drawing.Imaging.Metafile(hmeta, true);
CloseClipboard();
line = string.Format("拡張メタファイル:幅 {0} 高さ {1}" + NL, emf2.Width, emf2.Height);
textBox1.AppendText(line);
pictureBox1.Image = emf2;
pictureBox1.Image = img; pictureBox1.Image = emf;
CWD は project_name\bin\Debug の下
アスキー出力
StreamWriter file = new StreamWriter(@"rgb.ppm");
file.WriteLine("P6");
file.Write(x);
file.Close();
バイナリ出力
FileStream fs = new FileStream(@"depth.pgm", FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
string header = "P5\n640 480\n255\n";
char[] array = header.ToCharArray();
bw.Write(array);
for (int i = 0; i < 480*640; i++)
{
byte pixel = (byte)(depthPixel[i] >> 8);
bw.Write(pixel);
}
string trailer = "\n";
char[] array2 = trailer.ToCharArray();
bw.Write(array2);
bw.Close();
fs.Close();
string line, line2;
string[] separator = {" "};
StreamReader sr = new StreamReader("sample.txt");
line = sr.ReadLine();
list = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
x = int.Parse(list[0]);
y = int.Parse(list[1]);
line2 = String.Format("x = {0} y = {1}\n",x,y);
memo.AppendText(line);
配列 list の要素数は list.Length で取得可能
C++ と名称は同じで内容が異なるものがある (char) C C# --------------------------- unsigned char byte char sbyte C# での char は 16bit unicode である。
値型 byte sbyte int double char, 構造体
参照型 string, クラス
構造体が値型でクラスが参照型であることに注意!!
代入のとき違いが発生する。
string は参照型だが例外的な性質を持つため後述する
---- 参照型の落とし穴 ----
class Myclass
{
public int x;
}
.......
MyClass a, b;
a = new MyClass();
b = new MyClass();
a.x = 1;
b.x = 2;
Console.WriteLine(b.x); // 2 である
b = a; // b は a のアドレスを指す
Console.WriteLine(b.x); // 1 である
a.x = 3;
Console.WriteLine(b.x); // 3 である
このように、a への代入が b に及ぶ。
---- 比較演算子 ----
a = b のとき、参照型の場合はアドレスが比較される。
内容は比較しない。
上記のプログラムにおいて class Myclass を
struct Myclass に変更すると、Consolw.WriteLine の
結果は
2
1
1
となる。
string は参照型だが、値型として扱ってよい。 a = b のとき b のアドレスを a に代入するのではなく、 右辺が新しいインスタンスとして自動生成され、 a に代入される。 比較演算子 a = b のとき、アドレスではなく 文字列の内容を比較する。
func(a, out b);
func(
{
}
値型の変数 値渡し
out をつけると参照渡し
ハンガリアン表記 strName 先頭に型を明示する パスカル UserName
int a; string str; str = a.ToString(); a = Convert.ToInt32(textbox1.Text); Convert.ToInt32() Convert.ToString() Convert.ToDouble()
Console.Write(); 改行なし Console.WriteLine(); 改行あり コンソールアプリで終了前にキー入力を 要求するときは Console.ReadLine(); あるいは Ctrl + F5