Category Archives: C#

Windowsデスクトップアプリの座標関係覚書

.NETアプリ

Location

トップレベルのFormのLocationはスクリーン座標でフォームの左上の座標を表す。

ControlのLocationはコンテナからの相対座標の左上を表す。コントロールのスクリーン座標を知りたいときは、コンテナのPointToScreenにコントロールの相対座標を渡す。

最大化しているとき

フォームが最大化あるいは最小化しているときは、最大化する前のフォームの座標をRestoreBoundsから取得できる。

座標の保存

最大化しているときはRestoreBoundsを保存する。

座標の復元

このコードでは保存された座標がスクリーン上にあるかどうかは確認していない。

Win32アプリ

最大化しているとき

ウインドウが最小化されていてリストアしたとき最大化するかどうかはGetWindowPlacement()で調べることができる。WPF_RESTORETOMAXIMIZEDが立っていれば、リストアしたとき最大化する。

.NETではフォームが最小化されていて、リストアしたとき最大化するのかどうかを調べる方法はないと思われるので、Resizeイベントでその状態かどうかのフラグを用意する。

マルチスクリーン

マルチスクリーンのスクリーン座標はモニタをつなげて1つのスクリーンとみなせるような座標になる。

あるスクリーン座標がモニタ内にあるかは以下のように調べられる。(コードはC++/CLI)

C#でアセンブリのフルネームを知る

Linuxでdotnetをやってみる

インストール

いろいろなインストール方法があるようだが最も原始的なshファイルをダウンロードして実行する方法で行う。

これで~/.dotnet/にインストールされる。しかしパスが張られないので自分でやる必要がある。

これで使えるようになった。使えるようになったかテスト。

sdk,runtimeともに6.0.1がインストールされた。sdkは開発ツール、runtimeは実行環境。

コンソールアプリをつくる

つれくた。Program.csはC#のソースファイル、dntest.csprojはプロジェクトファイル。

実行してみる

できた

GUIアプリをつくってみる

WindowsではWinFormを使ったGUIアプリをつくれるが、Linuxではつくれない。そこでavaloniaというライブラリを利用してGUIアプリをつくってみる。まずはavaloniaテンプレートをインストールする必要がある。このテンプレートがあると新規アプリがつくれる。

つくれた。axamlファイルはウインドウの定義ファイル。

実行してみる

ランタイムの5.0がないため実行できないようだ。先程確認したように、今は6.0しかインストールされていない。

5.0をインストール

SDK、ランタイムとも5.0がインストールできた。

再び実行してみる

エラーが出てしまった。ここでは以下のようにして実行できた。

どうやら日本語環境だとエラーがでてしまうようだ。

C#のRichTextBoxのフォントが途中で変わる

RichTextBoxのIMF_DUALFONTIMF_AUTOFONTフラグをクリアする。デフォルトでオンになっている。

参考:http://pineplanter.moo.jp/non-it-salaryman/2017/11/25/post-5255/

C#のOpenFileDialogで拡張子exeの実行ファイルをフィルタして選択

C#とjavascriptの時間

基本

時間を表す言葉には時刻と時間間隔があるので時間という言葉ではあいまいになる。
どちらの場合も単位と基準点が問題になる。単位は秒とかミリ秒とかのこと、基準はUTCとか日本時間のこと。

Unix time stamp

UTCで1970/1/1からの秒を表す。今の値はこことかでわかる。

C#でこの値を得るには以下のコード

C#のDateTimeは0001/1/1からの100ナノ秒で管理しているようだ。3つの引数をとるコンストラクタはグレゴリオカレンダーで初期化するのでこれでいいらしい。

javscriptでこの値を得るには以下のコード

javascriptのDateはUTCで1970/1/1からのミリ秒で管理しているようだ。デフォルトのコンストラクタは今でgetTime()はミリ秒でUnix Epoch(=Unix time stamp)を返すので1000で割って秒にしている。

Unix time stampからオブジェクトをつくる

C#の場合は以下のようにやるらしい

これだとローカル時間が帰るので以下のように修正

javascriptの場合は以下

ソースコード

https://github.com/ambiesoft/blogprogs/tree/master/5705

System.Windows.Forms.TextBoxのvalidatingとvalidated

WinformのTextコントロールにはvalidatingvalidatedイベントがある。

validatingイベント

Textコントロールがフォーカスを失ったり、親のフォームが閉じられようとすると呼ばれる。引数はCancelEventArgsであり、Canceltrueを設定することで、キャンセルすることができる。

キャンセルされると、フォーカスが移動できなかったりする。

validatedイベント

validatingが成功すると(Cancelされなかった)呼ばれる。validatingは上記のような状況で呼ばれるので、そのときに呼ばれる。Text変更時にはvalidatingvalidatedも呼ばれない。

サンプル

https://github.com/ambiesoft/blogprogs/tree/master/5623/txtvalidateandchange

C# stringのreferenceEquals