フォームを使用したアプリケーション開発方法論。 GUIアプリケーションの作成cでGUIアプリケーションを作成する方法

良い一日! このチュートリアルでは、MS VisualStudioで最初のGUIアプリケーションを作成します。 これは、グラフィカルアプリケーション向けの一種の「HelloWorld」になります。 Windowsフォームを使用することがC#プログラマー向けのグラフィカルアプリケーション(グラフィカルユーザーインターフェイスを備えたアプリケーション)を作成する唯一の方法ではありませんが、これから学び始める方がよいとすぐに言います。 そこで、VisualStudioを起動します。

ローンチ? それならビジネスへ! 次の図に示すように、メインメニューに移動し、[ファイル]-[新規]-[プロジェクト]の項目を選択します。

表示されるウィンドウで:

  • 左側で、[テンプレート-Visual C#-Windows]を選択します。
  • メインエリアで、要素「Windowsフォームアプリケーション」を選択します。
  • ウィンドウの下部に、プロジェクトの名前を入力し、ディスク上のその場所を示します。

一般的には、下図のようになります。

必要なものを指定しましたか? 次に、「OK」ボタンをクリックします。 これで、次のように表示されます(メイン領域は長方形で強調表示されています)。

上の画像では、主な領域にラベルを付けています。デザイナー領域(左上)、ソリューションエクスプローラー領域(右上)、およびプロパティ領域(右下)です。 これらは、私たちが最も頻繁に取り組む分野です。

デザイナーエリアには、空の「フォーム」があります。これはいわゆるウィンドウであり、この場合は、プログラムのメインウィンドウです。 プロパティ領域には、デザイナーで選択された要素(この場合はフォーム)のプロパティが表示されますが、ソリューションエクスプローラー領域には、プログラムのフォーム(ウィンドウ)に関連するファイルを含むプロジェクトファイルが含まれています。 それでは、フォームを少し変更して、この最初のアプリケーションを実行してみましょう。

これを行うには、デザイナでフォームを選択し(この場合、フォームを左クリックするだけです)、プロパティブロックに移動します。このブロックには、「テキスト」という行があります(単語はテキストです。探しています)。下の図に示すように、左の列にあります)。

アプリケーションのメインフォームのプロパティ「テキスト」

左側の列には名前(プロパティ名)が表示され、右側の列にはその値が表示されることに注意してください。

この場合、textプロパティを処理しており、その値はウィンドウタイトルに表示されているので、次の図に示すように、「メインウィンドウ」のような独自の何かをそこに配置しましょう。

これで、プロジェクトをビルドして実行できます。 これを行うには、メインメニューに移動し、[ビルド]-[ソリューションのビルド]を選択します。 次に、アプリケーションを起動します。このために、メインメニューで[デバッグ-デバッグなしで実行]を選択します。 その結果、次のウィンドウが表示されます。

次のレッスンでは、フォームデザイナを使用した簡単な作業と、GUI要素の設定について説明します。このレッスンは終了し、最初のグラフィカルアプリケーションを作成し、ビルドして起動しました。

C ++は、最も強力で需要の高いプログラミング言語の1つです。 多くの場合GUIを使用して、毎日何百ものアプリケーションが作成されています。 ただし、グラフィックの操作はプログラマーにとって必ずしも便利ではありません。この場合、既製のグラフィックライブラリが使用されます。 それらは、アプリケーションのグラフィック部分の開発を可能な限り迅速かつ便利にします。

SFML

Qt

クロスプラットフォームライブラリCocos2D-Xは、モバイルゲームの開発を簡素化するように設計されています。 Qtと同じプラットフォームをすべてサポートします。 利点の中で、可用性、使いやすさ、CocosCreatorライブラリに基づく別のゲームデザイナーの作成に注目する価値があります。 エンジンに基づくゲームのリストには、利用可能なすべてのプラットフォームで実行される世界的に有名なBADLANDが含まれています。

他の何か

ゲームを作成するときにグラフィックスやアニメーションを大量に操作する必要がある場合は、Cocos2D-Xの代わりにUnityを使用することをお勧めします。 Unityには、Photoshop、Maya、Blenderなどのツールとシームレスに統合する機能があります。 Cocos2D-Xでは、すべてのグラフィックが外部から追加され、コードから参照されます。

Runetにはこのライブラリに関するレッスンはありませんが、開発者による英語の優れたコースがあります。

ジュース

おそらく最も有名なグラフィックライブラリの1つです。 GTK +は、多くのシステムで広く使用されているグラフィックフレームワークです。 もともとはGIMPのコンポーネントとして考案されましたが、最初の安定バージョンがリリースされてから20年で、他の何百ものアプリケーションで使用されるようになりました。

現在、GTK +は、同じQTに劣らない本格的なグラフィカルフレームワークです。 さまざまなプログラミング言語をサポートし、進化を続けています。

他の何か

かつて、ライブラリは有料のQtの代わりに作成されました。 GTK +はC言語をサポートする数少ないフレームワークの1つであり、ライブラリはクロスプラットフォームですが、Linux上のプログラムはWindowsやMacよりもネイティブに見えるという意見があります(GTK +はKDEでも十分にサポートされています)。 興味深いことに、いくつかのクロスプラットフォームの問題により、WiresharkはQtに切り替えました。

最初のプログラムの例はウィキペディアで見ることができます。

C ++に関するその他の興味深い記事は、ここにあります。

結論

上記は、C ++だけでなく、他の言語(QtやGTK +など)でGUIを操作するための最も一般的なテクノロジーです。 ただし、特定のテクノロジの機能を常に考慮する必要があります。 アプリケーションの機能のリストを書き、すべてのライブラリとフレームワークの説明をもう一度読んでから、プロジェクトに最も適したものを選択してください。

最終更新日:2019年5月26日

Xamarin.Formsでは、ビジュアルインターフェイスはページで構成されています。 ページはクラスPageのオブジェクトであり、画面スペース全体を占めます。 つまり、モバイルデバイスの画面に表示されるのはページです。 アプリケーションは1つ以上のページを持つことができます。

このページは、レイアウトコンテナの1つをコンテンツとして受け入れます。このコンテナには、ボタンやテキストフィールドなどの標準の視覚要素、およびその他のレイアウト要素が含まれています。

前のトピックで作成したHelloAppプロジェクトを取り上げましょう(または新しいプロジェクトを作成します)。 デフォルトでは、インターフェイス全体がAppクラスに作成されます。このクラスは、App.xaml.csファイルにあり、現在のアプリケーションを表します。

デフォルトのコードは次のとおりです。

システムの使用; Xamarin.Formsを使用します。 Xamarin.Forms.Xamlを使用します。 名前空間HelloApp(public部分クラスApp:Application(public App()(InitializeComponent(); MainPage = new MainPage();)protected override void OnStart()(//アプリの起動時に処理します)protected override void OnSleep()(/ /アプリがスリープしているときに処理します)protected override void OnResume()(//アプリが再開したときに処理します)))

Appクラスはコンストラクターで始まり、InitializeComponent()メソッドが最初に呼び出され、オブジェクトが初期化されてから、MainPageプロパティが設定されます。 このプロパティを介して、Appクラスはアプリケーションのメインページを設定します。 この場合、HelloApp.MainPageクラスによって定義されます。これは、MainPage.xamlファイルとMainPage.xaml.csファイルで定義されているクラスです。

しかし、この道だけではありません。 Xamarin.Formsを使用すると、C#コードを使用するか、htmlと同様のxaml言語を宣言的に使用するか、またはこれらのアプローチの組み合わせを使用して、ビジュアルインターフェイスを作成できます。

C#コードからのインターフェイスの作成

通常のC#クラスをHelloAppプロジェクトに追加しましょう。これをStartPageと呼びます。

そして、このクラスで次のコンテンツを定義します。

Xamarin.Formsの使用; 名前空間HelloApp(クラスStartPage:ContentPage(public StartPage()(Label header = new Label()(Text = "Hello from Xamarin Forms"); this.Content = header;)))

このクラスはページを表すため、ContentPageクラスから継承します。 コンストラクターは、ページのコンテンツとして設定されるテキスト付きのラベルを作成します(this.Content = header)。

MainPageをスタートページとして指定するには、Appクラスを変更しましょう。

Xamarin.Formsの使用; 名前空間HelloApp(public部分クラスApp:Application(public App()(InitializeComponent(); MainPage = new StartPage();)protected override void OnStart()(//アプリの起動時に処理します)protected override void OnSleep()(/ /アプリがスリープしているときに処理します)protected override void OnResume()(//アプリが再開したときに処理します)))

MainPageプロパティは、新しく作成されたStartPageを指すようになりました。

Visual Studioには、最も単純なコードで新しいページクラスを追加するための既製のテンプレートがあることも注目に値します。 したがって、新しいページを追加するには、新しい要素を追加するときにコンテンツページ(C#)テンプレートを選択する必要があります。

このクラスは、ソリューションのメインプロジェクト(この場合はHelloApp)に追加されます。

追加されたページクラスには、次のコードが含まれます。

システムの使用; System.Collections.Genericを使用します。 System.Linqを使用します。 System.Reflection.Emitを使用します。 System.Textを使用します。 Xamarin.Formsを使用します。 名前空間HelloApp(public class Page1:ContentPage(public Page1()(Content = new StackLayout(Children =(new Label(Text = "Hello Page")));))))

このクラスも基本のContentPageクラスを継承し、上記で作成したMainPageクラスとほぼ同じ構成になります。

また、アプリケーションクラスでは、このページを開始ページとして設定できます。

Xamarin.Formsの使用; 名前空間HelloApp(public部分クラスApp:Application(public App()(InitializeComponent(); MainPage = new Page1();)// ...........))

私はすぐにC ++が私のお気に入りの言語であることを予約します、私はそれを実質的に「子供の頃から」書いてきました、そして私は書くための最高の言語の最高のものとしてのその重要性を否定しませんあらゆる目的のためのプログラム。 さらに、別のホリバーを開始したり、「ポインター」を測定したりする理由はありません。 この記事は、言語の悪い経験の説明であり、その側面のいくつかを説明しています。その知識は、将来、他のプログラマーに役立ちます。

ある日、開発中のGUIクラスライブラリに出くわしました。 C ++、より具体的にはそのクラス、インスタンス、および階層の観点から、この言語はGUIコントロールの概念、特にウィジェット、クラスウィンドウ、サブウィンドウなどの要素に非常に近いように見えます。 ただし、C ++のオブジェクト指向モデルとウィンドウシステムは異なります。 C ++は、トークンスコープ、静的型チェック、およびコンパイル時に定義された階層を備えた「静的」言語であることが意図されていました。 一方、Windowsとそのオブジェクトは本質的に動的であり、通常、作成された単一のプロシージャまたはブロックの外部に存在します。 ウィジェットの階層は、主にレイアウト、可視性、およびイベントストリームによって定義されます。 動的および幾何学的なウィンドウやコントロール階層、イベントフローなどのグラフィカルユーザーインターフェイスの基本は、C ++構文またはそのセマンティクスによって直接サポートされていません。 したがって、これらの関数はC ++ GUIコードで複製する必要があります。 これにより、グラフィカルツールキットまたはウィンドウマネージャー機能が重複し、コードが「肥大化」し、C ++の「強力な」機能の多くを放棄せざるを得なくなります(たとえば、コンパイル時の型チェック)。 この記事では、C ++ / GUIの「不一致」の簡単な例をいくつか紹介します。

コンストラクターを作成しないでください(または少なくともそれらを使用しないでください)

結果のクラスが親クラスの仮想メソッドをオーバーライドする場合、基本クラスのコンストラクターの実行中はオーバーライドが有効にならないことに注意してください。 これは、オブジェクトがGUIイベントに応答するウィジェットを要求するときに特に厄介です。 クラスを想定します Basic_Window画面上にバニラの白黒ウィンドウを作成することを目的としていました。

ClassBasic_Window(
公衆:
Basic_Window(Rect rect)(gt_create_window(rect、visible、this);)
virtual void handle_create_event()(set_background(WHITE);)
};

ここ gt_create_window()メインのグラフィカルツールキットの低レベルの呼び出しを担当します(たとえば、 xvt_win_create())。 この関数は、インストルメンテーションデータ用のスペースを割り当て、ウィンドウマネージャーに通知し、そのオブジェクトをイベントリスナーとして登録し、上記の例では、画面上のウィンドウへのグラフィカル出力を初期化します。
インスタンス化したいとします Basic_Window、ただし背景は赤です。 通常、クラスの動作を変更するには、クラスから抽出して、対応する仮想メソッドをオーバーライドする必要があります。 私たちは書いています:

クラスRedWindow:public Basic_Window(
virtual void handle_create_event()(set_background(RED);)
公衆:
RedWindow(Rect rect):Basic_Window(Rect rect)()
};
redWindow red_window(default_rect);

しかし red_window赤ではなく白で表示されます! 作成するには RedWindow、親オブジェクトを最初に作成する必要があります。 終了後 Basic_Window :: Basic_Window()、仮想テーブル RedWindow有効にする、方法 handle_create_event()無効になり、コンストラクター RedWindow()実行されます。 コンストラクタ Basic_Window()オブジェクトへのイベント(CREATEイベントなど)の送信をすぐに開始するグラフィックツールオブジェクトを登録します。 コンストラクタ Basic_Window()まだ終了していない(保証されていない)ため、オーバーライドされた仮想メソッドはまだ実行されていません。 したがって、CREATEイベントが処理されます Basic_Window :: handle_create_event()。 仮想テーブル RedWindowクラスは、基本クラスが完全に構築されている場合、つまりウィンドウがすでに画面に表示されている場合にのみ作成されます。 この段階でウィンドウの色を変更すると、迷惑なエラーが発生します。

簡単な回避策があります。各コンストラクターがGUIツールキットオブジェクトを登録しないようにします。 イベント処理は、派生クラスへの初期化の終了を遅らせるように構成されます。 画面上のウィジェットを、メモリ内のアプリケーションのGUIオブジェクトの「顔」と考えるのは非常に魅力的です。 上記の例が示すように、画面とC ++オブジェクト間のこの接続は、実装がそれほど簡単ではありません。これらは別々に生成されます。

イベントを切り替える構文上の手段はありません

クラスライブラリにクラスGUIが含まれていると仮定します PictWindowウィンドウに写真を表示します。

クラスPictWindow(
画像画像;
公衆:
virtual void repaint()(gt_draw_pict(picture);)
...
};

画像の特定の領域に小さな長方形をオーバーレイしたいと思います。 この目的のために、サブクラス化を試みることができます PictWindow:


レクテクト;
virtual void repaint()(gt_draw_rect(rect);)
};

残念ながら、インスタンス化すると OvWindow、空のウィンドウには長方形のみが表示され、画像は表示されません。 その瞬間から OvWindow :: repaint()再定義 PictWindow :: repaint()、ウィンドウが描画されようとしているとき、最後の関数は呼び出されません。 実装する必要がありました OvWindowそう:

クラスOvWindow:public PictWindow(
レクテクト;
virtual void repaint()(PictWindow :: repaint(); gt_draw_rect(rect);)
公衆:
OvWindow(void):PictWindow()()
};

コンストラクタ OvWindowその方法を強調するために着手 OvWindow :: repaint()コンストラクターと同様に、スーパークラスに延期する必要があります。 実際、派生オブジェクトのコンストラクターは、対応するオブジェクトのコンストラクターを最初から呼び出します。 repaint()は、それをオーバーライドする基本クラスの親:メソッドに延期する必要があります。

結論:C ++ / GUIの互換性が低い

C ++は、「静的」言語になるように設計されています。

  • トークントラッキング付き
  • 静的型チェック
  • 静的クラス階層を使用
  • ガベージコレクションなし
  • コンパイル時の階層が定義されていないメッセージシステムを使用する

GUIオブジェクト:

  • 動的なオブジェクトが特徴で、多くの場合、その種類のオブジェクトは1つだけです。
  • それらが作成された境界をはるかに超えて生きる傾向があります
  • 階層は、クラスの継承ではなく、イベントのフローとその場所によって大部分が決定されます。
  • 階層は実行時に構築および破棄され、多くの場合、予測できないユーザーアクションに応答します。

C ++は、メッセージングと転送の動的セキュリティをサポートするようには設計されていません(例外を除く)。 これはすべて、グラフィカルツールとウィンドウマネージャー機能の重複、コードの無秩序な増加、安全でない関数の使用、およびC ++の多くの長所の放棄につながります。

結論

もちろん、これらすべての「ひったくり」は致命的ではありません。 C ++は用途が広く強力な言語であるため、考えられるすべての計算アルゴリズムを表現できます。 したがって、アプリケーションが次のような動的機能を必要とする場合 tcl / tk, スキーム/ Tk, 追記および同様のもの。 C ++を使用すると、いつでもそのようなことができます。 一方、これらすべての機能が備わっている言語を使用してみませんか?

最終更新日:2019年7月10日

インターフェイスは、いくつかの機能(実装なしのメソッドとプロパティのセット)を定義できる参照型を表します。 次に、この機能は、これらのインターフェイスを使用するクラスと構造によって実装されます。

インターフェイスの定義

interfaceキーワードは、インターフェイスを定義するために使用されます。 原則として、C#のインターフェイス名は大文字のIで始まります。たとえば、IComparable、IEnumerable(いわゆるハンガリアン記法)ですが、これは必須ではなく、プログラミングスタイルです。

インターフェイスは何を定義できますか? 一般に、インターフェイスは次のエンティティを定義できます。

  • プロパティ

    インデクサー

  • 静的フィールドと定数(C#8.0以降)

ただし、インターフェイスは非静的変数を定義できません。 たとえば、これらすべてのコンポーネントを定義する最も単純なインターフェイスは次のとおりです。

インターフェイスIMovable(//定数const int minSpeed = 0; //最小速度//静的変数staticint maxSpeed = 60; //最大速度//メソッドvoidMove(); //移動//プロパティ文字列名前(get; set;)//デリゲート名void MoveHandler(string message); //イベントのデリゲートを定義する//イベントイベントMoveHandlerMoveEvent; //モーションイベント)

この場合、移動するオブジェクトを表すIMovableインターフェイスが定義されています。 このインターフェイスには、移動するオブジェクトの機能を説明するさまざまなコンポーネントが含まれています。 つまり、インターフェイスは、移動するオブジェクトが持つべきいくつかの機能を記述します。

インターフェイスのメソッドとプロパティには実装がない場合があります。この場合、これらは抽象メソッドと抽象クラスのプロパティに近くなります。 この場合、インターフェイスは、いくつかの動きを表すMoveメソッドを定義します。 実装がなく、パラメータを受け取らず、何も返しません。

この場合、Nameプロパティにも同じことが当てはまります。 一見、自動プロパティのように見えます。 しかし実際には、これは実装のないインターフェースのプロパティ定義であり、自動プロパティではありません。

インターフェイスの宣言のもう1つのポイント:そのメンバーの場合-メソッドとプロパティにアクセス修飾子がありませんが、インターフェイスの目的はそのクラスによる実装の機能を定義することであるため、実際にはアクセスはデフォルトでパブリックです。 これは、定数と静的変数にも当てはまります。これらは、デフォルトでクラスと構造体にプライベート修飾子を持っています。 インターフェイスでは、デフォルトでpublic修飾子があります。 たとえば、IMovableインターフェイスのminSpeed定数とmaxSpeed変数を参照できます。

Static void Main(string args)(Console.WriteLine(IMovable.maxSpeed); Console.WriteLine(IMovable.minSpeed);)

ただし、C#8.0以降では、インターフェイスコンポーネントのアクセス修飾子を明示的に指定できます。

インターフェイスIMovable(public const int minSpeed = 0; //最小速度privatestatic int maxSpeed = 60; //最大速度publicvoid Move();保護された内部文字列Name(get; set;)//名前publicデリゲートvoid MoveHandler(string message); //イベントのデリゲートを定義するpublicevent MoveHandler MoveEvent; //モーションイベント)

C#8.0以降、インターフェイスはメソッドとプロパティのデフォルトの実装をサポートします。 これは、通常のクラスや構造と同じように実装されたインターフェイスで、本格的なメソッドとプロパティを定義できることを意味します。 たとえば、Moveメソッドのデフォルトの実装を定義しましょう。

インターフェイスIMovable(//デフォルトのメソッド実装void Move()(Console.WriteLine( "Walking");))

インターフェイスにデフォルトプロパティを実装すると、インターフェイスで非静的変数を定義できず、したがってインターフェイスプロパティでオブジェクトの状態を操作できないため、状況はやや複雑になります。 ただし、プロパティのデフォルトの実装を定義することもできます。

Interface IMovable(void Move()(Console.WriteLine( "Walking");)//デフォルトのプロパティ実装//読み取り専用プロパティint MaxSpeed(get(return 0;)))

インターフェイスにプライベートメソッドとプロパティがある場合(つまり、プライベート修飾子を使用する場合)、デフォルトの実装が必要であることに注意してください。 同じことが静的メソッドとプロパティ(必ずしもプライベートである必要はありません)にも当てはまります。

インターフェイスIMovable(public const int minSpeed = 0; //最小速度privatestatic int maxSpeed = 60; //最大速度//速度で距離をカバーするのにかかる時間を見つけるstaticdouble GetTime(double distance、double speed )=>距離/速度; static int MaxSpeed(get(return maxSpeed;)set(if(value> 0)maxSpeed = value;)))class Program(static void Main(string args)(Console.WriteLine (IMovable.MaxSpeed); IMovable.MaxSpeed = 65; Console.WriteLine(IMovable.MaxSpeed); double time = IMovable.GetTime(100、10); Console.WriteLine(time);))

インターフェイスアクセス修飾子

クラスと同様に、インターフェイスにはデフォルトで内部アクセスレベルがあります。つまり、このようなインターフェイスは現在のプロジェクト内でのみ使用できます。 ただし、public修飾子を使用すると、インターフェイスをパブリックにすることができます。

パブリックインターフェイスIMovable(void Move();)

Visual Studioには、別のファイルに新しいインターフェイスを追加するための特別なコンポーネントがあることに注意してください。 プロジェクトにインターフェイスを追加するには、プロジェクトを右クリックして、表示されるコンテキストメニューで[追加]-> [新しいアイテム...]を選択し、新しいコンポーネントを追加するためのダイアログボックスで[インターフェイス]アイテムを選択します。

トピックの続き:
インターネット

半導体ダイオードは、新しいキャリア分布がすぐには確立されないため、電流または電圧の十分に速い変化に対して不活性です。 どのように...