Mfc-quick-guide

提供:Dev Guides
移動先:案内検索

MFC-概要

Microsoft Foundation Class(MFC)ライブラリは、Microsoft Windowsオペレーティングシステム用のアプリケーションの作成を簡素化するための一連の関数、定数、データ型、およびクラスを提供します。 このチュートリアルでは、MFCを使用してWindowsベースのアプリケーションを起動および作成する方法についてすべて学習します。

前提条件

私たちはあなたが次のことを知っていると仮定しました-

  • Windowsのプログラミングについて少し。
  • C ++でのプログラミングの基本。
  • オブジェクト指向プログラミングの基礎を理解します。

MFCとは何ですか?

Microsoft Foundation Class Library(MFC)は、Microsoft Windowsでプログラミングするための「アプリケーションフレームワーク」です。 MFCは、以下に必要なコードの多くを提供します-

  • Windowsの管理。
  • メニューとダイアログボックス。
  • 基本的な入出力を実行します。
  • データオブジェクトのコレクションなどの保存

アプリケーション固有のコードをMFCフレームワークに追加することにより、C ++アプリケーションのMFCフレームワークの基本機能を簡単に拡張またはオーバーライドできます。

MFCフレームワーク

  • MFCフレームワークは、Windowsプログラミングを簡素化するために設計された再利用可能なクラスのセットを提供します。
  • MFCは、日常のプログラミングで使用される文字列、ファイル、コレクションなど、多くの基本的なオブジェクトのクラスを提供します。
  • また、ウィンドウ、コントロール、デバイスコンテキストなどの一般的なWindows APIおよびデータ構造のクラスも提供します。
  • このフレームワークは、ActiveXやドキュメントビュー処理などのより高度な機能のための強固な基盤も提供します。
  • さらに、MFCは、アプリケーションアーキテクチャ階層を構成するクラスを含むアプリケーションフレームワークを提供します。

なぜMFCなのか?

MFCフレームワークは、Windowsのエキスパートプログラマーの作業を基盤とする強力なアプローチです。 MFCフレームワークには次の利点があります。

  • 開発時間を短縮します。
  • コードの移植性が向上します。
  • また、プログラミングの自由度と柔軟性を低下させることなく、途方もないサポートを提供します。
  • 「プログラムするのが難しい」ユーザーインターフェイス要素とテクノロジに簡単にアクセスできます。
  • MFCは、データアクセスオブジェクト(DAO)とOpen Database Connectivity(ODBC)によるデータベースプログラミング、およびWindowsソケットによるネットワークプログラミングを簡素化します。

MFC-環境設定

Microsoft Visual C は、Microsoft Windowsオペレーティングシステム用のアプリケーションを作成するために使用されるプログラミング環境です。 C アプリケーションでMFCフレームワークを使用するには、Microsoft Visual C またはMicrosoft Visual Studioをインストールしておく必要があります。 Microsoft Visual Studioには、Microsoft Visual C 環境も含まれています。

Microsoftは、SQL Serverを含むVisual Studioの無料版を提供しており、https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx [[[1]] studio-vs.aspx]。

インストール手順は次のとおりです。

  • ステップ1 *-Visual Studioがダウンロードされたら、インストーラーを実行します。 次のダイアログボックスが表示されます。

Visual Studio

  • ステップ2 *-[インストール]をクリックして、インストールプロセスを開始します。

Visual Studioのインストール

  • ステップ3 *-Visual Studioが正常にインストールされると、次のダイアログボックスが表示されます。

Visual Studioインストール済み

  • ステップ4 *-このダイアログボックスを閉じ、必要に応じてコンピューターを再起動します。
  • ステップ5 *-[スタート]メニューからVisual Studioを開きます。次のダイアログボックスが開きます。 初めて起動する場合、準備に時間がかかります。

Visual Studioの準備

  • ステップ6 *-次に、Visual Studioのメインウィンドウが表示されます。

Visual Studioメインウィンドウ

  • ステップ7 *-これで、アプリケーションを開始する準備ができました。

MFC-VC ++プロジェクト

この章では、さまざまなタイプのVC プロジェクトについて説明します。 Visual Studioには、いくつかの種類のVisual C プロジェクトテンプレートが含まれています。 これらのテンプレートは、基本的なプログラム構造、メニュー、ツールバー、アイコン、参照を作成し、作成するプロジェクトの種類に適したステートメントを含めるのに役立ちます。 次に、テンプレートの主要な機能の一部を示します。

  • これらのプロジェクトテンプレートの多くにウィザードが用意されており、作成時にプロジェクトをカスタマイズできます。
  • プロジェクトが作成されたら、アプリケーションをビルドして実行できます。
  • プロジェクトを作成するためにテンプレートを使用する必要はありませんが、ほとんどの場合、プロジェクトテンプレートを使用する方が効率的です。 *提供されたプロジェクトファイルと構造は、最初から作成するよりも変更する方が簡単です。

MFCでは、次のプロジェクトテンプレートを使用できます。

Sr.No. Project Template & Description
1
  • MFC Application*

MFCアプリケーションは、Microsoft Foundation Class(MFC)ライブラリに基づいたWindows用の実行可能アプリケーションです。 MFCアプリケーションを作成する最も簡単な方法は、MFCアプリケーションウィザードを使用することです。

2

MFC ActiveX Control

ActiveXコントロールプログラムは、特定の種類の機能を親アプリケーションに提供するように設計されたモジュラープログラムです。 たとえば、ダイアログ、ツールバー、またはWebページで使用するボタンなどのコントロールを作成できます。

3

MFC DLL

MFC DLLは、複数のアプリケーションで同時に使用できる関数の共有ライブラリとして機能するバイナリファイルです。 MFC DLLプロジェクトを作成する最も簡単な方法は、MFC DLLウィザードを使用することです。

以下は、MFCアプリケーションの作成にも使用できる一般的なテンプレートです-

Sr.No. Project Template & Description
1

Empty Project

プロジェクトは、アプリケーションの構築に必要なすべての論理的なコンテナです。 その後、必要に応じて、ソリューションに新規または既存のプロジェクトを追加できます。

2

Custom Wizard

Visual C ++カスタムウィザードは、新しいカスタムウィザードを作成する必要があるときに使用するツールです。 カスタムウィザードを作成する最も簡単な方法は、カスタムウィザードを使用することです。

MFC-はじめに

この章では、機能するMFCの例を見ていきます。 MFCアプリケーションを作成するには、ウィザードを使用してプロジェクトをカスタマイズできます。 アプリケーションを最初から作成することもできます。

プロジェクトテンプレートを使用してプロジェクトを作成する

Visual Studioで利用可能なプロジェクトテンプレートを使用してプロジェクトを作成する手順は次のとおりです。

  • ステップ1 *-Visual Studioを開き、[ファイル]→[新規]→[プロジェクト]メニューオプションをクリックします。
  • ステップ2 *-[新しいプロジェクト]ダイアログボックスが開いていることがわかります。

プロジェクト

  • ステップ3 *-左ペインから、テンプレート→Visual C ++→MFCを選択します
  • ステップ4 *-中央のペインで、MFCアプリケーションを選択します。
  • ステップ5 *-[名前]フィールドにプロジェクト名「MFCDemo」を入力し、[OK]をクリックして続行します。 次のダイアログが表示されます。

アプリケーションMFCDemo

  • ステップ6 *-[次へ]をクリックします。

MFCアプリケーションタイプ

  • ステップ7 *-上記のダイアログボックスに表示されるオプションを選択し、[次へ]をクリックします。

MFCアプリケーションオプション

  • ステップ8 *-すべてのオプションをオフにして、[完了]ボタンをクリックします。

これで、MFCウィザードがデフォルトでこのダイアログボックスとプロジェクトファイルを作成することがわかります。

MFCウィザード

  • ステップ9 *-このアプリケーションを実行すると、次の出力が表示されます。

MFCアプリケーション結果

最初からプロジェクトを作成する

MFCアプリケーションを最初から作成することもできます。 MFCアプリケーションを作成するには、次の手順に従う必要があります。

  • ステップ1 *-Visual Studioを開き、[ファイル]→[新規]→[プロジェクト]メニューオプションをクリックします。
  • ステップ2 *-[新しいプロジェクト]ダイアログボックスが表示されます。

スクラッチの作成

  • ステップ3 *-左ペインから、テンプレート→Visual C ++→一般を選択します。
  • ステップ4 *-中央のペインで、空を選択します
  • ステップ5 *-[名前]フィールドにプロジェクト名「MFCDemoFromScratch」を入力し、[OK]をクリックして続行します。 空のプロジェクトが作成されていることがわかります。

MFCDemoFromScratch

  • ステップ6 *-MFCプロジェクトにするには、プロジェクトを右クリックして[プロパティ]を選択します。

MFCプロジェクトとプロパティの選択

  • ステップ7 *-左側のセクションで、[構成プロパティ]→[全般]をクリックします。
  • ステップ8 *-[プロジェクトのデフォルト]セクションで[共有DLLでMFCを使用]オプションを選択し、[OK]をクリックします。
  • ステップ9 *-現在は空のプロジェクトです。 C ++ファイルを追加する必要があります。 そのため、プロジェクトを右クリックして、[追加]→[新しいアイテム…​]を選択します

新しいアイテムを追加

ステップ10 *-中央のペインで[ C ++ File(.cpp)*]を選択し、[名前]フィールドにファイル名を入力して、[追加]ボタンをクリックします。

ファイル名を入力

ステップ11 *-[ソースファイル]フォルダの下に *main.cpp ファイルが追加されました。

  • ステップ12 *-このファイルに次のコードを追加しましょう。
#include <iostream>
using namespace std;

void main() {
   cout << "***************************************\n";
   cout << "MFC Application Tutorial";
   cout << "\n***************************************";
   getchar();
}
  • ステップ13 *-このアプリケーションを実行すると、コンソールに次の出力が表示されます。
***************************************
MFC Application Tutorial
***************************************

MFC-Windowsの基礎

この章では、Windowsの基本について説明します。 アプリケーションとも呼ばれるプログラムを作成するには、MFCのCWinAppからクラスを派生します。 CWinApp は、* Windowsアプリケーションの*クラスを表します。

新しいWin32プロジェクトを作成して、簡単な例を見てみましょう。

  • ステップ1 *-Visual Studioを開き、[ファイル]→[新規]→[プロジェクト]メニューオプションをクリックします。
  • ステップ2 *-[新しいプロジェクト]ダイアログボックスが表示されます。

Windowsアプリケーション

  • ステップ3 *-左ペインから、テンプレート→Visual C ++→Win32を選択します。
  • ステップ4 *-中央のペインで、Win32プロジェクトを選択します。
  • ステップ5 *-[名前]フィールドにプロジェクト名「MFCWindowDemo」を入力し、[OK]をクリックして続行します。 次のダイアログボックスが表示されます。

Win32プロジェクトの選択

  • ステップ6 *-[次へ]をクリックします。

Win32アプリケーション設定

  • ステップ7 *-上記のダイアログボックスに表示されるオプションを選択し、[完了]をクリックします。

MFCWindowsDemo

  • ステップ8 *-空のプロジェクトが作成されます。
  • ステップ9 *-MFCプロジェクトにするには、プロジェクトを右クリックして[プロパティ]を選択します。

MFCWindowDemoプロパティページ

  • ステップ10 *-左側のセクションで、[構成プロパティ]→[全般]をクリックします。
  • ステップ11 *-[プロジェクトのデフォルト]セクションで[共有DLLでMFCを使用]オプションを選択し、[OK]をクリックします。
  • ステップ12 *-新しいソースファイルを追加します。
  • ステップ13 *-プロジェクトを右クリックして、[追加]→[新しいアイテム…​]を選択します。
  • ステップ14 *-[テンプレート]セクションで、[C ++ファイル(.cpp)]をクリックします。

MFCWindowDemo新しいアイテムの追加

  • ステップ15 *-名前を例として設定し、[追加]をクリックします。

ウィンドウ作成

どのアプリケーションにも2つの主要なセクションがあります-

  • クラス
  • フレームまたはウィンドウ

私たちは次の手順を使用してウィンドウを作成しましょう-

  • ステップ1 *-アプリケーションを作成するには、MFCのCWinAppからクラスを派生させる必要があります。
#include
class CExample : public CWinApp {
   BOOL InitInstance() {
      return TRUE;
   }
};
  • ステップ2 *-アプリケーションのコンテンツを表示するフレーム/ウィンドウも必要です。

ステップ3 *-このために、別のクラスを追加し、MFCの *CFrameWnd クラスから派生させ、そのコンストラクターを実装し、Create()メソッドを呼び出して、次のコードに示すようにフレーム/ウィンドウを作成する必要があります。

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"));
      }
};
  • ステップ4 *-Create()メソッドには、NULLとして渡す必要があるクラスの名前と、タイトルバーに表示される文字列であるウィンドウの名前の2つのパラメーターが必要であることがわかります。 。

メインウィンドウ

ウィンドウを作成した後、アプリケーションで使用できるようにするには、ポインターを使用して、ウィンドウの作成に使用したクラスを表示できます。 この場合、ポインターはCFrameWndになります。 フレームウィンドウを使用するには、そのポインターをCWinThread
m_pMainWndメンバー変数に割り当てます。 これは、アプリケーションのInitInstance()実装で行われます。
  • ステップ1 *-CExampleクラスのInitInstance()の実装です。
class CExample : public CWinApp {
   BOOL InitInstance() {
      CMyFrame *Frame = new CMyFrame();  m_pMainWnd = Frame;

      Frame->ShowWindow(SW_NORMAL);
      Frame->UpdateWindow();

      return TRUE;
   }
};
  • ステップ2 *-以下は、Example.cppファイルの完全な実装です。
#include <afxwin.h>

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"));
      }
};

class CExample : public CWinApp {
   BOOL InitInstance() {
      CMyFrame *Frame = new CMyFrame();
      m_pMainWnd = Frame;

      Frame->ShowWindow(SW_NORMAL);
      Frame->UpdateWindow();

      return TRUE;
   }
};

CExample theApp;
  • ステップ3 *-上記のアプリケーションを実行すると、次のウィンドウが作成されます。

作成されたウィンドウ

Windowsスタイル

Windowsスタイルは、ウィンドウの外観、境界線、最小化または最大化された状態、またはその他のサイズ変更状態などの機能を制御する特性です。

以下は、ウィンドウの作成中に使用できるスタイルのリストです。

Sr.No. Style & Description
1

WS_BORDER

境界線を持つウィンドウを作成します。

2

WS_CAPTION

タイトルバーを持つウィンドウを作成します(WS_BORDERスタイルを意味します)。 WS_DLGFRAMEスタイルでは使用できません。

3

WS_CHILD

子ウィンドウを作成します。 WS_POPUPスタイルでは使用できません。

4

WS_CHILDWINDOW

WS_CHILDスタイルと同じです。

5

WS_CLIPCHILDREN

親ウィンドウ内に描画するときに、子ウィンドウが占める領域を除外します。 親ウィンドウを作成するときに使用されます。

6

WS_CLIPSIBLINGS

子ウィンドウを相互にクリップします。つまり、特定の子ウィンドウがペイントメッセージを受信すると、WS_CLIPSIBLINGSスタイルは、更新される他のすべての子ウィンドウを子ウィンドウの領域からクリップします。 (WS_CLIPSIBLINGSが指定されておらず、子ウィンドウがオーバーラップしている場合、子ウィンドウのクライアント領域内に描画すると、隣接する子ウィンドウのクライアント領域内に描画できます。)WS_CHILDスタイルでのみ使用します。

7

WS_DISABLED

最初は無効になっているウィンドウを作成します。

8

WS_DLGFRAME

二重の枠線が付いたタイトルのないウィンドウを作成します。

9

WS_GROUP

ユーザーが矢印キーを使用してあるコントロールから次のコントロールに移動できるコントロールのグループの最初のコントロールを指定します。 最初のコントロールの後にWS_GROUPスタイルFALSEで定義されたすべてのコントロールは、同じグループに属します。 WS_GROUPスタイルの次のコントロールは、次のグループを開始します(つまり、1つのグループが次のグループの開始位置で終了します)。

10

WS_HSCROLL

水平スクロールバーを持つウィンドウを作成します。

11

WS_ICONIC

最初は最小化されているウィンドウを作成します。 WS_MINIMIZEスタイルと同じです。

12

WS_MAXIMIZE

最大サイズのウィンドウを作成します。

13

WS_MAXIMIZEBOX

最大化ボタンを持つウィンドウを作成します。

14

WS_MINIMIZE

最初は最小化されているウィンドウを作成します。 WS_OVERLAPPEDスタイルでのみ使用します。

15

WS_MINIMIZEBOX

最小化ボタンを持つウィンドウを作成します。

16

WS_OVERLAPPED

オーバーラップウィンドウを作成します。 オーバーラップウィンドウには、通常、キャプションと境界線があります。

17

WS_OVERLAPPED WINDOW

WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX、およびWS_MAXIMIZEBOXスタイルでオーバーラップウィンドウを作成します。

18

WS_POPUP

ポップアップウィンドウを作成します。 WS_CHILDスタイルでは使用できません。

19

WS_POPUPWINDOW

WS_BORDER、WS_POPUP、およびWS_SYSMENUスタイルでポップアップウィンドウを作成します。 コントロールメニューを表示するには、WS_CAPTIONスタイルをWS_POPUPWINDOWスタイルと組み合わせる必要があります。

20

WS_SIZEBOX

サイズ変更境界線を持つウィンドウを作成します。 WS_THICKFRAMEスタイルと同じです。

21

WS_SYSMENU

タイトルバーにコントロールメニューボックスを持つウィンドウを作成します。 タイトルバーのあるウィンドウにのみ使用されます。

22

WS_TABSTOP

Tabキーを使用してユーザーが移動できるコントロールの数を指定します。 Tabキーは、ユーザーをWS_TABSTOPスタイルで指定された次のコントロールに移動します。

23

WS_THICKFRAME

ウィンドウのサイズを設定するために使用できる太いフレームのウィンドウを作成します。

24

WS_TILED

オーバーラップウィンドウを作成します。 オーバーラップウィンドウには、タイトルバーと境界線があります。 WS_OVERLAPPEDスタイルと同じです。

25

WS_TILEDWINDOW

WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX、およびWS_MAXIMIZEBOXスタイルでオーバーラップウィンドウを作成します。 WS_OVERLAPPEDWINDOWスタイルと同じです。

26

WS_VISIBLE

最初に表示されるウィンドウを作成します。

27

WS_VSCROLL

垂直スクロールバーを持つウィンドウを作成します。

  • ステップ1 *-スタイリングを追加する簡単な例を見てみましょう。 ウィンドウを作成した後、ユーザーに表示するために、WS_VISIBLEスタイルをそのウィンドウに適用できます。さらに、WS_OVERLAPPEDスタイルも追加します。 ここに実装があります-
class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_VISIBLE | WS_OVERLAPPED);
      }
};
  • ステップ2 *-このアプリケーションを実行すると、次のウィンドウが作成されます。

作成されたウィンドウ

これで、最小化、最大化、および閉じるオプションが表示されなくなったことがわかります。

Windowsロケーション

モニターに表示されているものを見つけるために、コンピューターはデカルト座標系に似た座標系を使用しますが、原点は画面の左上隅にあります。 この座標系を使用すると、水平軸と垂直軸の画面の左上隅からの距離によって任意のポイントを見つけることができます。

  • Win32ライブラリ*は、次のように定義されたPOINTと呼ばれる構造を提供します-
typedef struct tagPOINT {
   LONG x;
   LONG y;
} POINT;
  • 「x」メンバー変数は、画面の左端からポイントまでの距離です。
  • 「y」変数は、画面の上端からポイントまでの距離を表します。
  • Win32のPOINT構造に加えて、Microsoft Foundation Class(MFC)ライブラリはCPointクラスを提供します。
  • これにより、POINT構造体と同じ機能が提供されます。 C ++クラスとして、ポイントを見つけるために必要な機能を追加します。 2つのコンストラクターを提供します。
CPoint();
CPoint(int X, int Y);

Windowsサイズ

画面上のオブジェクトを見つけるためにポイントが使用されますが、各ウィンドウにはサイズがあります。 サイズは、オブジェクトに関連する2つの指標を提供します。

  • オブジェクトの幅。
  • オブジェクトの高さ。

Win32ライブラリは、次のように定義されたSIZE構造を使用します-

typedef struct tagSIZE {
   int cx;
   int cy;
} SIZE;

Win32のSIZE構造に加えて、MFCはCSizeクラスを提供します。 このクラスにはSIZEと同じ機能がありますが、C ++クラスの機能が追加されています。 任意の方法でサイズ変数を作成できる5つのコンストラクターを提供します。

CSize();
CSize(int initCX, int initCY);
CSize(SIZE initSize);
CSize(POINT initPt);
CSize(DWORD dwSize);

Windowsの寸法

ウィンドウが表示されると、画面上でモニターの境界線に関する位置によって識別できます。 ウィンドウは、幅と高さでも識別できます。 これらの特性は、* Create()*メソッドの_rect_引数によって指定または制御されます。 この引数は、Win32 RECT構造を介して作成できる長方形です。

typedef struct _RECT {
   LONG left;
   LONG top;
   LONG right;
   LONG bottom;
} RECT, *PRECT;

Win32の RECT 構造に加えて、MFCは次のコンストラクタを持つCRectクラスを提供します-

CRect();
CRect(int l, int t, int r, int b);
CRect(const RECT& srcRect);
CRect(LPCRECT lpSrcRect);
CRect(POINT point, SIZE size);
CRect(POINT topLeft, POINT bottomRight);

ウィンドウの位置とサイズを指定する簡単な例を見てみましょう

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, CRect(90, 120,
            550, 480));
      }
};

このアプリケーションを実行すると、最初の2つのパラメーターのCRectコンストラクターで指定されているように、画面の左上隅に次のウィンドウが作成されます。 最後の2つのパラメーターは、ウィンドウのサイズです。

作成されたアプリケーションウィンドウ

Windows親

現実の世界では、多くのアプリケーションは異なるWindowsで構成されています。 アプリケーションがさまざまなWindowsを使用する場合、ほとんどのオブジェクトは特定のWindowsに依存します。 作成された最初のウィンドウまたは指定した別のウィンドウである可能性があります。 このようなウィンドウは、*親ウィンドウ*と呼ばれます。 他のすべてのウィンドウは、直接または間接的にそれに依存しています。

  • 作成しているウィンドウが別のウィンドウに依存している場合、そのウィンドウに親があることを指定できます。
  • これは、CFrameWnd :: Create()メソッドのpParentWnd引数を使用して行われます。
  • Windowに親がない場合、引数にNULL値を渡します。

私たちは1つだけのウィンドウがあり、利用可能な親ウィンドウがないので、次のコードに示すように、NULL値で引数を渡す例を見てみましょう-

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU,
            CRect(90, 120, 550, 480), NULL);
      }
};

上記のアプリケーションを実行すると、同じ出力が表示されます。

作成されたアプリケーションウィンドウ

MFC-ダイアログボックス

この章では、ダイアログボックスについて説明します。 Windows用アプリケーションは、ダイアログボックスを介してユーザーと頻繁に通信します。 * CDialogクラス*は、ダイアログボックスを管理するためのインターフェイスを提供します。 Visual C ++ダイアログエディターを使用すると、ダイアログボックスを簡単に設計し、ダイアログテンプレートリソースを作成できます。

  • ダイアログオブジェクトの作成は2段階の操作です-
  • ダイアログオブジェクトを構築します。
  • ダイアログウィンドウを作成します。

新しいWin32プロジェクトを作成して、簡単な例を見てみましょう。

  • ステップ1 *-Visual Studioを開き、[ファイル]→[新規]→[プロジェクト]メニューオプションをクリックします。
  • ステップ2 *-[新しいプロジェクト]ダイアログボックスが表示されます。

新規プロジェクトダイアログボックス

  • ステップ3 *-左ペインから、テンプレート→Visual C ++→Win32を選択します。
  • ステップ4 *-中央のペインで、Win32プロジェクトを選択します。
  • ステップ5 *-[名前]フィールドにプロジェクト名「MFCDialogDemo」を入力し、[OK]をクリックして続行します。 次のダイアログが表示されます。

MFCDialogDemoプロジェクト

  • ステップ6 *-[次へ]をクリックします。

MFCDialogDemo設定

  • ステップ7 *-上記のダイアログボックスに表示されるオプションを選択し、[完了]をクリックします。

MFCDialogDemoオプション

  • ステップ8 *-空のプロジェクトが作成されます。
  • ステップ9 *-MFCプロジェクトにするには、プロジェクトを右クリックして[プロパティ]を選択します。

MFCDialogDemoプロパティ

  • ステップ10 *-左側のセクションで、[構成プロパティ]→[全般]をクリックします。
  • ステップ11 *-[プロジェクトのデフォルト]セクションで[共有DLLでMFCを使用]オプションを選択し、[OK]をクリックします。
  • ステップ12 *-新しいソースファイルを追加します。
  • ステップ13 *-プロジェクトを右クリックして、[追加]→[新しいアイテム]を選択します。
  • ステップ14 *-[テンプレート]セクションで、[C ++ファイル(.cpp)]をクリックします

MFCDialogDemoアイテムの追加

  • ステップ15 *-名前を例として設定し、[追加]をクリックします。
  • ステップ16 *-アプリケーションを作成するには、クラスを追加し、MFCのCWinAppから派生させる必要があります。
#include <afxwin.h>

class CExample : public CWinApp {
   public:
      BOOL InitInstance();
};

ダイアログボックスの作成

  • ステップ1 *-ダイアログボックスを作成するには、ソリューションエクスプローラーで[リソースファイル]フォルダーを右クリックし、[追加]→[リソース]を選択します。

リソースの追加

  • ステップ2 *-[リソースの追加]ダイアログボックスで、[ダイアログ]を選択し、[新規]をクリックします。
  • ステップ3 *-ダイアログボックスでは、実際にプログラムで作成する前に準備が必要です。
  • ステップ4 *-ダイアログボックスは、最初にテキストファイル(リソースファイル)として手動で作成できます。
  • ステップ5 *-リソースファイルの下に作成されたMFCDialogDemo.rcファイルを確認できます。

MFCDialogDemoファイル

  • ステップ6 *-リソースファイルはデザイナーで開いています。 同じファイルをテキストファイルとして開くことができます。 リソースファイルを右クリックして、[アプリケーションから開く]を選択します。

MFCDialogDemoファイルで開く

  • ステップ7 *-ソースコード(テキスト)エディターを選択し、[追加]ボタンをクリックします。

ソースコードエディター

  • ステップ8 *-デザイナーに戻り、ダイアログを右クリックして[プロパティ]を選択します。

ダイアログボックス選択プロパティ

  • ステップ9 *-多くのオプションから選択する必要があります。
  • ステップ10 *-他のほとんどのコントロールと同様に、ダイアログボックスを識別する必要があります。 通常、ダイアログボックスの識別子(ID)はIDD_で始まります。IDをIDD_EXAMPLE_DLGに変更します。

ダイアログの場所

ダイアログボックスは、アプリケーション上に「物理的に」配置する必要があります。 通常、ダイアログボックスは他のコントロールの親として作成されるため、その場所は親ウィンドウまたはデスクトップとの関係に依存します。

プロパティウィンドウを見ると、X PosとY Posの2つのフィールドがあります。

ダイアログの場所

  • Xは、モニターの左境界からダイアログボックスの左境界までの距離です。
  • Yは、モニターの上部境界からダイアログボックスの上部境界までの距離です。

デフォルトでは、これらのフィールドはゼロに設定されています。 上記のように変更することもできます。

これらの2つの寸法を0に指定すると、ダイアログボックスの左と上の境界が設定され、オブジェクトが画面の中央中央に表示されます。

ダイアログボックスの寸法

ダイアログボックスの寸法は、その幅と高さを指します。 デザイナーウィンドウのマウスを使用して、幅と高さのサイズを変更できます。

ダイアログボックスの寸法

ステータスバーで幅と高さの変化を確認できます。

ダイアログボックスのメソッド

画面にダイアログボックスを表示するために使用される基本クラスは、CDialogクラスです。 ダイアログボックスを作成するには、CDialogからクラスを派生する必要があります。 CDialogクラス自体は、次の3つのコンストラクタを提供します-

CDialog();
CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);
CDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

別のクラスCExampleDlgを作成し、CDialogから派生させます。 次のコードに示すように、デフォルトのコンストラクタデストラクタを実装します。

class CExampleDlg : public CDialog {
   public:
      enum { IDD = IDD_EXAMPLE_DLG };

      CExampleDlg();
      ~CExampleDlg();
};

CExampleDlg::CExampleDlg():CDialog(CExampleDlg::IDD) {

}

CExampleDlg::~CExampleDlg() {

}
次のコードに示すように、CExample
InitInstance()メソッドでこのダイアログをインスタンス化する必要があります。
BOOL CExample::InitInstance() {
   CExampleDlg myDlg;
   m_pMainWnd = &myDlg;

   return TRUE;
}

モーダルダイアログボックス

ダイアログボックスには、 modelessmodal の2種類があります。 モーダルおよびモードレスダイアログボックスは、作成および表示に使用されるプロセスによって異なります。

モードレスダイアログボックス

  • モードレスダイアログボックスの場合、ダイアログクラスで独自のパブリックコンストラクターを提供する必要があります。
  • モードレスダイアログボックスを作成するには、パブリックコンストラクターを呼び出してから、ダイアログオブジェクトのCreateメンバー関数を呼び出してダイアログリソースを読み込みます。
  • コンストラクターの呼び出し中または呼び出し後にCreateを呼び出すことができます。 ダイアログリソースにプロパティWS_VISIBLEがある場合、ダイアログボックスがすぐに表示されます。
  • そうでない場合は、ShowWindowメンバー関数を呼び出す必要があります。

モーダルダイアログ

  • モーダルダイアログボックスを作成するには、CDialogで宣言されている2つのパブリックコンストラクターのいずれかを呼び出します。
  • 次に、ダイアログオブジェクトの DoModal メンバー関数を呼び出して、ダイアログボックスを表示し、ユーザーが[OK]または[キャンセル]を選択するまでダイアログボックスとの対話を管理します。
  • DoModalによるこの管理は、ダイアログボックスをモーダルにするものです。 モーダルダイアログボックスの場合、DoModalはダイアログリソースを読み込みます。
    *ステップ1 *-ダイアログボックスをモーダルとして表示するには、CExample
    InitInstance()イベントで、ダイアログ変数を使用してDoModal()メソッドを呼び出します-
BOOL CExample::InitInstance() {
   CExampleDlg myDlg;
   m_pMainWnd = &myDlg;
   myDlg.DoModal();
   return TRUE;
}
  • ステップ2 *-これはExample.cppファイルの完全な実装です。
#include <afxwin.h>
#include "resource.h"

class CExample : public CWinApp {
   public:
      BOOL InitInstance();
};

class CExampleDlg : public CDialog {
   public:
      enum { IDD = IDD_EXAMPLE_DLG };

      CExampleDlg();
     ~CExampleDlg();
};

CExampleDlg::CExampleDlg():CDialog(CExampleDlg::IDD) {

}

CExampleDlg::~CExampleDlg() {

}

BOOL CExample::InitInstance() {
   CExampleDlg myDlg;
   m_pMainWnd = &myDlg;
   myDlg.DoModal();
   return TRUE;
}
CExample MyApp;
  • ステップ3 *-上記のコードをコンパイルして実行すると、次のダイアログボックスが表示されます。

ダイアログボックス

ダイアログベースのアプリケーション

Microsoft Visual Studioは、主にダイアログボックスに基づくアプリケーションを作成する簡単な方法を提供します。 Visual Studioで利用可能なプロジェクトテンプレートを使用して、ダイアログベースのプロジェクトを作成する手順を次に示します-

  • ステップ1 *-Visual Studioを開き、[ファイル]→[新規]→[プロジェクト]メニューオプションをクリックします。 [新しいプロジェクト]ダイアログボックスが表示されます。

ダイアログベースのプロジェクトテンプレート

  • ステップ2 *-左ペインから、テンプレート→Visual C ++→MFCを選択します。
  • ステップ3 *-中央のペインで、MFCアプリケーションを選択します。
  • ステップ4 *-[名前]フィールドにプロジェクト名「MFCModalDemo」を入力し、[OK]をクリックして続行します。 次のダイアログボックスが表示されます。

MFCModalDemo Application2

  • ステップ5 *-[次へ]をクリックします。

MFCModalDemoタイプ

  • ステップ6 *-上記のダイアログボックスに表示されるオプションを選択し、[次へ]をクリックします。

MFCModalDemoアプリケーションオプション

  • ステップ7 *-ボックスの最大化や最小化など、ダイアログボックスで選択するオプションをすべてチェックし、[次へ]をクリックします。

MFCModalDemoの高度な機能

  • ステップ8 *-[次へ]をクリックします。

MFCModalDemo生成クラス

  • ステップ9 *-これらの2つのクラスを生成します。 クラスの名前を変更して、[完了]をクリックできます。
  • ステップ10 *-MFCウィザードがデフォルトでこのダイアログボックスとプロジェクトファイルを作成することがわかります。

ダイアログボックスアプリケーション

  • ステップ11 *-このアプリケーションを実行すると、次の出力が表示されます。

MFCModalDemo結果

MFC-Windowsリソース

  • リソース*は、コンパイラが画像、音声、マウスカーソル、ダイアログボックスなどのオブジェクトを管理できるようにするテキストファイルです。 Microsoft Visual Studioは、プログラミングに使用されるのと同じ環境で必要なツールを提供することにより、リソースファイルの作成を特に簡単にします。 つまり、通常、外部アプリケーションを使用してリソースファイルを作成または構成する必要はありません。 以下は、リソースに関連するいくつかの重要な機能です。
  • リソースは、ユーザーに情報を提供するインターフェース要素です。
  • ビットマップ、アイコン、ツールバー、およびカーソルはすべてリソースです。
  • 一部のリソースは、メニューからの選択やダイアログボックスへのデータ入力などのアクションを実行するために操作できます。
  • アプリケーションは、互いに独立して動作するさまざまなリソースを使用できます。これらのリソースは、*。rc拡張子を持つテキストファイルにグループ化されます。
  • ほとんどのリソースは、[リソースの追加]ダイアログボックスから目的のリソースを選択して作成されます。

リソースの追加

  • [リソースの追加]ダイアログボックスには、要件に従って使用できるリソースの広範なリストが表示されますが、使用できないものが必要な場合は、プログラムを実行する前に* .rcファイルに手動で追加できます。

識別子

  • 識別子*は、名前が通常IDで始まる定数整数であるシンボルです。 整数値(シンボル値)にマッピングされたテキスト文字列(シンボル名)の2つの部分で構成されます。
  • シンボルは、ソースコード内およびリソースエディタで作業している間、リソースとユーザーインターフェイスオブジェクトを説明する記述的な方法を提供します。
  • 新しいリソースまたはリソースオブジェクトを作成すると、*リソースエディター*は、IDC_DIALOG1などのリソースのデフォルト名を提供し、それに値を割り当てます。
  • 名前と値の定義は、Resource.hファイルに保存されます。

ステップ1 *-ダイアログボックスを作成し、そのIDが *IDD_EXAMPLE_DLG である最後の章の CMFCDialogDemo の例を見てみましょう。

CMFCDialogDemo

  • ステップ2 *-ソリューションエクスプローラーに移動すると、ヘッダーファイルの下にresource.hファイルが表示されます。 エディタでこのファイルを開くことで続行すると、ダイアログボックスの識別子とその整数値も表示されます。

Identifiers2

アイコン

  • アイコン*は、アプリケーションを表すウィンドウで使用される小さな画像です。 2つの主なシナリオで使用されます。
  • ウィンドウのフレームでは、タイトルバーのウィンドウ名の左側に表示されます。
  • Windowsエクスプローラー、デスクトップ、マイコンピューター、またはコントロールパネルウィンドウ。

MFCModalDemoの例を見ると、次のスナップショットに示すように、Visual Studioがタイトルバーにデフォルトアイコンを使用していることがわかります。

アイコン

以下の手順に従って、独自のアイコンを作成できます-

  • ステップ1 *-プロジェクトを右クリックして[追加]→[リソース]を選択すると、[リソースの追加]ダイアログボックスが表示されます。

リソースの追加を選択

  • ステップ2 *-アイコンを選択して[新規]ボタンをクリックすると、次のアイコンが表示されます。

アイコン

  • ステップ3 *-ソリューションエクスプローラーで、リソースビューに移動し、MFCModalDemo>アイコンを展開します。 2つのアイコンが表示されます。 IDR_MAINFRAMEはデフォルトのもので、IDI_ICON1は新しく作成されたアイコンです。
  • ステップ4 *-新しく作成されたアイコンを右クリックし、[プロパティ]を選択します。
  • ステップ5 *-IDI_ICON1はこのアイコンのIDです。このIDをIDR_MYICONに変更しましょう。
  • ステップ6 *-必要に応じて、デザイナーでこのアイコンを変更できます。 同じアイコンを使用します。
  • ステップ7 *-このアイコンを保存します。
  • ステップ8 *-次のコードのように見えるCMFCModalDemoDlg.cppファイルのCMFCModalDemoDlgコンストラクターに移動します。
CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent/* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME);
}
  • ステップ9 *-デフォルトのアイコンがコンストラクターにロードされていることがわかります。 次のコードに示すように、IDR_ MYICONに変更します。
CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent/* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_ MYICON);
}
  • ステップ10 *-上記のコードをコンパイルして実行すると、ダイアログボックスに新しいアイコンが表示されます。

モーダルデモ

メニュー

  • メニュー*を使用すると、論理的で見つけやすい方法でコマンドを配置できます。 メニューエディターを使用すると、完成したアプリケーションのメニューバーによく似たメニューバーを直接操作して、メニューを作成および編集できます。 メニューを作成するには、以下の手順に従ってください-
  • ステップ1 *-プロジェクトを右クリックして、[追加]→[リソース]を選択します。 [リソースの追加]ダイアログボックスが表示されます。

リソースの追加メニュー

  • ステップ2 *-メニューを選択し、[新規]をクリックします。 メニューバーに「ここに入力」を含む四角形が表示されます。

ここにメニューバーを入力

  • ステップ3 *-ファイル、編集などのメニューオプションを記述します。 次のスナップショットに示すように。

メニューオプション

  • ステップ4 *-リソースビューでメニューフォルダーを展開すると、メニューID IDR_MENU1が表示されます。 この識別子を右クリックして、IDM_MAINMENUに変更します。

メニュー識別子

  • ステップ5 *-すべての変更を保存します。
  • ステップ6 *-このメニューをダイアログボックスに添付する必要があります。 ソリューションエクスプローラーでDialogフォルダーを展開し、ダイアログボックス識別子をダブルクリックします。

ダイアログフォルダー

  • ステップ7 *-[プロパティ]にメニューフィールドが表示されます。 上記のように、ドロップダウンからメニュー識別子を選択します。
  • ステップ8 *-このアプリケーションを実行すると、メニューオプションを含む次のダイアログボックスが表示されます。

メニューオプション

ツールバー

  • ツールバー*は、ユーザーがメニューを使用する代わりにボタンをクリックすることでフォーム上でいくつかのアクションを実行できるようにするWindowsコントロールです。
  • ツールバーは、最もアクセスしやすいアクションをボタンとして提供することにより、ユーザーの仕事を簡素化する便利なボタンのグループを提供します。
  • ツールバーは、このような一般的なアクションをユーザーに近づけることができます。
  • 通常、ツールバーはメインメニューの下に表示されます。
  • ボタンを装備することもできますが、ボタンまたはボタンの一部にキャプションが付いている場合があります。
  • ツールバーには、他のタイプのコントロールを装備することもできます。

ツールバーを作成するには、次の手順を実行します。

  • ステップ1 *-プロジェクトを右クリックして、[追加]→[リソース]を選択します。 [リソースの追加]ダイアログボックスが表示されます。

ツールバー

  • ステップ2 *-ツールバーを選択し、[新規]をクリックします。 次の画面が表示されます。

ツールバーの選択

  • ステップ3 *-次のスクリーンショットに示すように、デザイナーでツールバーを設計し、IDも指定します。

デザインツールバー

  • ステップ4 *-CMFCModalDemoDlgクラスにこれらの2つの変数を追加します。
   CToolBar m_wndToolBar;
   BOOL butD;
  • ステップ5 *-CMFCModalDemoDlg.hファイルのCMFCModalDemoDlgの完全な実装を次に示します-
class CMFCModalDemoDlg : public CDialogEx {
  //Construction
   public:
      CMFCModalDemoDlg(CWnd* pParent = NULL);//standard constructor
  //Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCMODALDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support

  //Implementation
   protected:
      HICON m_hIcon;
      CToolBar m_wndToolBar;
      BOOL butD;

     //Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()

   public:
      afx_msg void OnBnClickedOk();
};
*ステップ6 *-次のコードに示すようにCMFCModalDemoDlg
OnInitDialog()を更新します。
BOOL CMFCModalDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);      //Set big icon
   SetIcon(m_hIcon, FALSE);     //Set small icon

   if (!m_wndToolBar.Create(this)
      || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
     //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
     //WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
     //CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
     //!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) {
         TRACE0("Failed to Create Dialog Toolbar\n");
         EndDialog(IDCANCEL);
      }
      butD = TRUE;
      CRect rcClientOld;//Old Client Rect
      CRect rcClientNew;//New Client Rect with Tollbar Added

     //Retrive the Old Client WindowSize
     //Called to reposition and resize control bars in the client area of a window
     //The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.
     //And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.

      GetClientRect(rcClientOld);
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNew);
     //All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
     //Offest to move all child controls after adding Tollbar
      CPoint ptOffset(rcClientNew.left - rcClientOld.left, rcClientNew.top - rcClientOld.top);

      CRect rcChild;
      CWnd* pwndChild = GetWindow(GW_CHILD);//Handle to the Dialog Controls

      while (pwndChild)//Cycle through all child controls {
         pwndChild -> GetWindowRect(rcChild);//Get the child control RECT
         ScreenToClient(rcChild);

        //Changes the Child Rect by the values of the claculated offset
         rcChild.OffsetRect(ptOffset);
         pwndChild -> MoveWindow(rcChild, FALSE);//Move the Child Control
         pwndChild = pwndChild -> GetNextWindow();
      }

      CRect rcWindow;
     //Get the RECT of the Dialog
      GetWindowRect(rcWindow);

     //Increase width to new Client Width
      rcWindow.right += rcClientOld.Width() - rcClientNew.Width();

     //Increase height to new Client Height
       rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
     //Redraw Window
      MoveWindow(rcWindow, FALSE);

     //Now we REALLY Redraw the Toolbar
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

  //TODO: Add extra initialization here

   return TRUE;//return TRUE unless you set the focus to a control
}
  • ステップ7 *-このアプリケーションを実行します。 ツールバーを含む次のダイアログボックスが表示されます。

Toolbar4

加速器

  • アクセスキー*は、マウスの代わりにキーボードを使用することにより、ユーザーがメニューアクションをより速く実行できるようにする文字です。 これは通常、ユーザーがマウスをどこにでも配置する必要がないため高速であり、アクションの実行にかかる時間を短縮します。
  • ステップ1 *-アクセスキーを作成するには、メニュー項目の左側にアンパサンド「&」を入力します。

アクセスキーの作成

  • ステップ2 *-すべてのメニューオプションに対してこのステップを繰り返します。 このアプリケーションを実行し、Altキーを押します。 すべてのメニューオプションの最初の文字に下線が付いていることがわかります。

メニューオプション

ショートカットキー

ショートカットキーは、上級ユーザーがメニュー項目に対して実行するアクションを実行するために使用するキーまたはキーの組み合わせです。 ほとんどのショートカットは、Ctrlキーと文字キーを同時に押すことの組み合わせです。 たとえば、Ctrl + N、Ctrl + O、またはCtrl +D。

ショートカットを作成するには、メニューキャプションを構成する文字列の右側で、メニュー項目を右クリックしてプロパティを選択します。

[キャプション]フィールドに\ tを入力し、次に[新規]メニューオプションのように目的の組み合わせを入力します。 すべてのメニューオプションに対してこの手順を繰り返します。

ショートカットキー

アクセラレータテーブル

アクセラレータテーブルは、テーブルの各アイテムが識別子、ショートカットキー、およびアクセラレータキーの種類を指定する定数を組み合わせたアイテムのリストです。 他のリソースと同様に、アクセラレータテーブルは.rcファイルに手動で作成できます。 アクセラレータテーブルを作成する手順は次のとおりです。

ステップ1 *-アクセラレータテーブルを作成するには、ソリューションエクスプローラーで .rcファイルを右クリックします。

アクセラレータテーブル

  • ステップ2 *-アクセラレータを選択して、[新規]をクリックします。

アクセラレータを選択

  • ステップ3 *-IDコンボボックスの矢印をクリックし、メニュー項目を選択します。

アクセラレータテーブル

  • ステップ4 *-修飾子ドロップダウンからCtrlを選択します。
  • ステップ5 *-[キー]ボックスをクリックし、両方のメニューオプションに対応するキーを入力します。

また、新しいメニュー項目イベントハンドラーをテストに追加します。 [新規]メニューオプションを右クリックします。

イベントハンドラー

  • ステップ6 *-クラス、メッセージタイプ、ハンドラー名を指定できます。 とりあえず、そのままにして[追加と編集]ボタンをクリックします。

メッセージタイプハンドラー名

  • ステップ7 *-[イベントハンドラーの追加]を選択します。
  • ステップ8 *-CMFCModalDemoDlg.cppファイルの最後に追加されたイベントが表示されます。
void CMFCModalDemoDlg::OnFileNew() {
  //TODO: Add your command handler code here
   MessageBox(L"File > New menu option");
}
  • ステップ9 *-*今*シンプルなメニューオプションメッセージを表示するメッセージボックスを追加しましょう。

作業中にアクセラレータテーブルを開始するには、次のCMFCModalDemoAppに示すように、HACCEL変数とProcessMessageFilterを追加します。

class CMFCModalDemoApp : public CWinApp {
   public:
      CMFCModalDemoApp();

  //Overrides
   public:
      virtual BOOL InitInstance();
      HACCEL m_hAccelTable;

     //Implementation

      DECLARE_MESSAGE_MAP()
      virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg);
};
*ステップ10 *-CMFCModalDemoApp
InitInstance()でアクセラレータと次の呼び出しをロードします。
m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
   MAKEINTRESOURCE(IDR_ACCELERATOR1));
  • ステップ11 *-ProcessMessageFilterの実装です。
BOOL CMFCModalDemoApp::ProcessMessageFilter(int code, LPMSG lpMsg) {
   if (code >= 0 && m_pMainWnd && m_hAccelTable) {
      if (::TranslateAccelerator(m_pMainWnd -> m_hWnd, m_hAccelTable, lpMsg))
      return TRUE;
   }
   return CWinApp::ProcessMessageFilter(code, lpMsg);
}
  • ステップ12 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

アクセラレータ結果

  • ステップ13 *-Altキーを押してからFキーを押し、次にNキーを押すか、Ctrl + Nを押します。 次のメッセージが表示されます。

アクセラレータテーブル

MFC-プロパティシート

  • プロパティシート*はタブダイアログボックスとも呼ばれ、プロパティページを含むダイアログボックスです。 各プロパティページはダイアログテンプレートリソースに基づいており、コントロールが含まれています。 上部にタブがあるページに囲まれています。 タブはページに名前を付け、その目的を示します。 ユーザーはプロパティシートのタブをクリックして、コントロールのセットを選択します。

プロパティページを作成するには、ダイアログベースのMFCプロジェクトを作成して、簡単な例を見てみましょう。

MFCプロジェクト

プロジェクトが作成されたら、プロパティページを追加する必要があります。

Visual Studioでは、[リソースの追加]ダイアログボックスを表示し、[ダイアログ]ノードを展開してIDD_PROPPAGE_Xアイテムの1つを選択することにより、プロパティページのリソースを簡単に作成できます。

  • ステップ1 *-ソリューションエクスプローラーでプロジェクトを右クリックし、[追加]→[リソース]を選択します。

IDD Propage Larg

  • ステップ2 *-IDD_PROPPAGE_LARGEを選択し、[新規]をクリックします。

IDD Propage Larg New

ステップ3 *-上記のように、このプロパティページのIDとキャプションをそれぞれ *IDD_PROPPAGE_1 と*プロパティページ1 *に変更します。

  • ステップ4 *-デザイナーウィンドウのプロパティページを右クリックします。

デザイナーウィンドウのプロページ

  • ステップ5 *-[クラスの追加]オプションを選択します。

Propageクラス追加オプション

  • ステップ6 *-クラス名を入力し、基本クラスのドロップダウンリストからCPropertyPageを選択します。
  • ステップ7 *-[完了]をクリックして続行します。
  • ステップ8 *-上記の手順に従って、IDD_PROPPAGE_2およびCaption Property Page 2のプロパティページをもう1つ追加します。
  • ステップ9 *-2つのプロパティページが作成されました。 その機能を実装するには、プロパティシートが必要です。

プロパティシートは、プロパティページをグループ化し、エンティティとして保持します。

プロパティシートを作成するには、以下の手順に従ってください-

  • ステップ1 *-プロジェクトを右クリックして、[追加]> [クラス]メニューオプションを選択します。

プロパティシートの作成

  • ステップ2 *-左ペインからVisual C ++→MFCを選択し、テンプレートペインでMFCクラスを選択して、[追加]をクリックします。

テンプレートペインのMFCクラス

  • ステップ3 *-クラス名を入力し、基本クラスのドロップダウンリストからCPropertySheetを選択します。
  • ステップ4 *-[完了]をクリックして続行します。
  • ステップ5 *-このプロパティシートを起動するには、メインプロジェクトクラスで以下の変更が必要です。
  • ステップ6 *-CMFCPropSheetDemo.cppファイルに次の参照を追加します。
#include "MySheet.h"
#include "PropPage1.h"
#include "PropPage2.h"
*ステップ7 *-CMFCPropSheetDemoApp
InitInstance()メソッドを次のコードに示すように変更します。
CMySheet mySheet(L"Property Sheet Demo");
CPropPage1 page1;
CPropPage2 page2;

mySheet.AddPage(&page1);
mySheet.AddPage(&page2);

m_pMainWnd = &mySheet;
INT_PTR nResponse = mySheet.DoModal();
  • ステップ8 *-CMFCPropSheetDemo.cppファイルの完全な実装を次に示します。
//MFCPropSheetDemo.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "MFCPropSheetDemo.h"
#include "MFCPropSheetDemoDlg.h"
#include "MySheet.h"
#include "PropPage1.h"
#include "PropPage2.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


//CMFCPropSheetDemoApp
BEGIN_MESSAGE_MAP(CMFCPropSheetDemoApp, CWinApp)
   ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


//CMFCPropSheetDemoApp construction

CMFCPropSheetDemoApp::CMFCPropSheetDemoApp() {

  //support Restart Manager
   m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
  //TODO: add construction code here,
  //Place all significant initialization in InitInstance
}


//The one and only CMFCPropSheetDemoApp object

CMFCPropSheetDemoApp theApp;


//CMFCPropSheetDemoApp initialization

BOOL CMFCPropSheetDemoApp::InitInstance() {

  //InitCommonControlsEx() is required on Windows XP if an application
  //manifest specifies use of ComCtl32.dll version 6 or later to enable
  //visual styles. Otherwise, any window creation will fail.
   INITCOMMONCONTROLSEX InitCtrls;
   InitCtrls.dwSize = sizeof(InitCtrls);
  //Set this to include all the common control classes you want to use
  //in your application.
   InitCtrls.dwICC = ICC_WIN95_CLASSES;
   InitCommonControlsEx(&InitCtrls);

   CWinApp::InitInstance();


   AfxEnableControlContainer();

  //Create the shell manager, in case the dialog contains
  //any shell tree view or shell list view controls.
   CShellManager *pShellManager = new CShellManager;

  //Activate "Windows Native" visual manager for enabling themes in MFC controls
   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
  //Standard initialization
  //If you are not using these features and wish to reduce the size
  //of your final executable, you should remove from the following
  //the specific initialization routines you do not need
  //Change the registry key under which our settings are stored
  //TODO: You should modify this string to be something appropriate
  //such as the name of your company or organization
   SetRegistryKey(_T("Local AppWizard-Generated Applications"));

   CMySheet mySheet(L"Property Sheet Demo");
   CPropPage1 page1;
   CPropPage2 page2;

   mySheet.AddPage(&page1);
   mySheet.AddPage(&page2);

   m_pMainWnd = &mySheet;
   INT_PTR nResponse = mySheet.DoModal();
   if (nResponse == IDOK) {
     //TODO: Place code here to handle when the dialog is
     //dismissed with OK
   }else if (nResponse == IDCANCEL) {
     //TODO: Place code here to handle when the dialog is
     //dismissed with Cancel
   }else if (nResponse == -1) {
      TRACE(traceAppMsg, 0, "Warning: dialog creation failed,
        so application is terminating unexpectedly.\n");
      TRACE(traceAppMsg, 0, "Warning: if you are using MFC controls on the dialog,
        you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
   }

  //Delete the shell manager created above.
   if (pShellManager != NULL) {
      delete pShellManager;
   }

  //Since the dialog has been closed, return FALSE so that we exit the
  //application, rather than start the application's message pump.
   return FALSE;
}
  • ステップ9 *-上記のコードをコンパイルして実行すると、次のダイアログボックスが表示されます。 このダイアログボックスには、2つのプロパティページが含まれています。

プロパティページ

MFC-Windowsレイアウト

  • コントロールのレイアウト*は、アプリケーションのユーザビリティにとって非常に重要かつ重要です。 アプリケーションでGUI要素のグループを配置するために使用されます。 レイアウトを選択する際に考慮すべき特定の重要な事項があります-
  • 子要素の位置。
  • 子要素のサイズ。

コントロールを追加する

新しいダイアログベースのMFCプロジェクトMFCLayoutDemoを作成しましょう。

  • ステップ1 *-プロジェクトが作成されると、次の画面が表示されます。

追加コントロールの作成

  • ステップ2 *-ダイアログボックスからTODOを削除します。
  • ステップ3 *-左側にあるツールボックスからいくつかのコントロールをドラッグします。

(次のスナップショットに示すように、1つの静的テキストと1つのエディットコントロールをドラッグします)。

MFCLayoutDemo Edit

  • ステップ4 *-静的テキストのキャプションを名前に変更します。

名前への静的テキスト

制御グリッド

コントロールグリッドはガイドグリッドドットであり、設計時に追加するコントロールの配置に役立ちます。

コントロールグリッドを有効にするには、次のスナップショットに示すように、ツールバーの[グリッドの切り替え]ボタンをクリックする必要があります。

コントロールグリッド

サイズ変更のコントロール

ダイアログボックスにコントロールを追加すると、デフォルトのサイズまたはそれを描画したサイズのいずれかが想定されます。 フォームまたはダイアログボックス上のコントロールのサイズを支援するために、Visual Studioは黒い点で作られた視覚的なグリッドを提供します。

コントロールのサイズを変更するには、つまり特定の幅または高さを指定するには、いずれかのハンドルにマウスを置き、目的の方向にドラッグします。

サイズ変更の制御

この点線のグリッドを使用して、コントロールのサイズを変更できます。

コントロールの位置

ダイアログボックスまたはフォームに配置するコントロールは、指定された場所を想定しています。 ほとんどの場合、これらのポジションは実用的ではありません。 好きな位置に移動できます。

さらにいくつかのコントロールを追加しましょう-

コントロール位置

  • ステップ1 *-コントロールを移動するには、目的の位置に到達するまで、クリックして目的の方向にドラッグします。
  • ステップ2 *-コントロールのグループを移動するには、最初にそれらを選択します。 次に、選択範囲を目的の場所にドラッグします。 静的テキストと編集コントロールを選択しましょう。

静的テキストと編集コントロール

  • ステップ3 *-これらの選択したコントロールを左側に移動します。

Selecred Controlの移動

セレクティブコントロールの移動

コントロールの配置を支援するために、Visual Studioには次のボタンを備えたダイアログツールバーがあります。

コントロール位置5

  • ステップ1 *-これらすべてのコントロールを選択して、チェックボックスと静的テキストコントロールを左に揃えます。

Align Format

  • ステップ2 *-[形式]→[整列]→[左]を選択します。

左揃え

  • ステップ3 *-これらのコントロールがすべて左に揃えられていることがわかります。

タブの順序

フォームまたはダイアログボックスに追加するコントロールは、追加された順序に従った順序で配置されます。 新しいコントロールを配置するセクションまたは領域に関係なくコントロールを追加すると、既存のコントロールの最後に順番に配置されます。 修正しないと、ユーザーはコントロールの操作に苦労します。 コントロールナビゲーションのシーケンスは、タブオーダーとも呼ばれます。

タブを変更するには、[フォーマット]→[タブ順序]メニューオプションを使用するか、Ctrl + Dショートカットを使用します。 Ctrl + Dを押しましょう。

タブの順序

これで、これらすべてのコントロールがこのダイアログボックスに追加される順序を確認できます。 コントロールの順序または順序を変更するには、ナビゲートする順序ですべてのコントロールをクリックします。

この例では、最初にチェックボックスをクリックし、続いて名前とアドレスの編集コントロールをクリックします。 次に、次のスナップショットに示すように、[OK]および[キャンセル]をクリックします。

テーブルの順序

このアプリケーションを実行すると、次の出力が表示されます。

タブ注文結果

MFC-コントロール管理

MFCアプリケーションでは、アプリケーションに視覚的にコントロールを追加した後、コード内でコントロールを参照する場合、そのコントロールに基づいて、または関連付けられた変数を宣言できます。 MFCライブラリを使用すると、アプリケーションで使用される一部のコントロールの2種類の変数を値またはコントロール変数として宣言できます。

  • 1つの変数は、コントロールに保存されている情報に使用されます。これは、*コントロール変数/インスタンス*とも呼ばれます。
  • 他の変数は Control Value Variable として知られています。 ユーザーは、この変数を使用して、そのコントロールに対して何らかのアクションを実行できます。

制御変数/インスタンス

制御変数は、制御を管理するクラスに基づく変数です。 たとえば、ボタンコントロールはCButtonクラスに基づいています。

これらの概念を実際のプログラミングで見るために、MFCダイアログベースのプロジェクトMFCControlManagementを作成しましょう。

MFCControlManagement

プロジェクトが作成されると、デザイナーウィンドウに次のダイアログボックスが表示されます。

作成されたMFCControlManagement

  • ステップ1 *-次のスナップショットに示すように、TODO行を削除し、1つのチェックボックスと1つの編集コントロールをドラッグします。 チェックボックスのキャプションを[制御を有効にする]に変更します。

キャプションの変更

  • ステップ2 *-チェックボックスを右クリックします。

MFCControlManagement Checkbox

  • ステップ3 *-[変数の追加]を選択します。
  • ステップ4 *-メンバー変数の追加ウィザードが表示されます。

メンバー変数の追加

このダイアログボックスでさまざまなオプションを選択できます。 チェックボックスの場合、変数タイプはCButtonです。 このダイアログボックスではデフォルトで選択されています。

同様に、コントロールIDもデフォルトで選択されています。カテゴリコンボボックスで[コントロール]を選択し、[変数名]編集ボックスにm_enableDisableCheckと入力して[完了]をクリックする必要があります。

  • ステップ5 *-同様に、次のスナップショットに示されている設定で編集コントロールのコントロール変数を追加します。

制御変数6

ダイアログクラスのヘッダーファイルを確認します。 新しい変数が追加されたことがわかります。

CButton m_enableDisableCheck;
CEdit m_myEditControl;

制御値変数

コントロールに対して宣言できる別のタイプの変数は、値変数です。 すべてのコントロールが値変数を提供するわけではありません。

  • 値変数は、参照するコントロールに格納されている値のタイプを処理できる必要があります。
  • たとえば、テキストベースのコントロールはテキストの処理に使用されるため、テキストベースのデータ型を宣言できます。 通常、これはCString変数になります。

チェックボックスと編集制御のためにこのタイプの変数を見てみましょう。

  • ステップ1 *-チェックボックスを右クリックして、変数の追加を選択します。

変数の追加

  • ステップ2 *-変数のタイプはBOOLです。 [カテゴリ]ドロップダウンリストから[値]を選択します。
  • ステップ3 *-[完了]をクリックして続行します。
  • ステップ4 *-同様に、次のスナップショットに示すように、編集コントロールの値変数を設定で追加します。

値変数

  • ステップ5 *-変数タイプにCString、変数名フィールドにm_editControlValと入力します。
  • ステップ6 *-これらの変数がヘッダーファイルに追加されたことを確認できます。
bool m_enableDisableVal;
CString m_editControlVal;

イベントハンドラーの制御

コントロールをアプリケーションに追加した後、視覚的に追加するか動的に作成するかに関係なく、ユーザーがコントロールに対して実行できるアクションの処理方法も決定します。

  • 既にクラスに関連付けられているプロジェクトダイアログボックスの場合、イベントハンドラーを作成するときにいくつかのショートカットを利用できます。
  • デフォルトのコントロール通知イベントまたは適用可能なWindowsメッセージのいずれかのハンドラーをすばやく作成できます。

チェックボックスのイベントハンドラーを追加した同じ例を見てみましょう。

  • ステップ1 *-通知イベントを処理するコントロールを右クリックします。

イベントハンドラー1

  • ステップ2 *-ショートカットメニューで、[イベントハンドラーの追加]をクリックして、イベントハンドラーウィザードを表示します。

イベントハンドラーウィザード

  • ステップ3 *-[メッセージタイプ]ボックスでイベントを選択して、[クラス]リストボックスで選択したクラスに追加します。
  • ステップ4 *-[関数ハンドラー名]ボックスでデフォルト名を受け入れるか、選択した名前を入力します。
  • ステップ5 *-[追加と編集]をクリックして、イベントハンドラーを追加します。
  • ステップ6 *-CMFCControlManagementDlg.cppファイルの最後に次のイベントが追加されました。
void CMFCControlManagementDlg::OnBnClickedCheck1() {
  //TODO: Add your control notification handler code here
}

コントロール管理

これまで、コントロールをアプリケーションに追加する方法を見てきました。 ユーザーの要件に応じてこれらのコントロールを管理する方法について説明します。 特定のイベントハンドラーで制御変数/インスタンスを使用できます。

  • ステップ1 *-次の例を見てみましょう。 ここでは、チェックボックスがオン/オフになったときに編集コントロールを有効/無効にします。
  • ステップ2 *-チェックボックスクリックイベントハンドラーを追加しました。 ここに実装があります-
void CMFCControlManagementDlg::OnBnClickedCheck1() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_enableDisableVal)
      m_myEditControl.EnableWindow(TRUE);
   else
      m_myEditControl.EnableWindow(FALSE);
}
*ステップ3 *-ダイアログが作成されたら、CMFCControlManagementDlg
OnInitDialog()に次のコードを追加する必要があります。 これにより、これらのコントロールが管理されます。
UpdateData(TRUE);
if (m_enableDisableVal)
   m_myEditControl.EnableWindow(TRUE);
else
   m_myEditControl.EnableWindow(FALSE);
  • ステップ4 *-CMFCControlManagementDlg.cppファイルの完全な実装です。
//MFCControlManagementDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCControlManagement.h"
#include "MFCControlManagementDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


//CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx {
   public:
      CAboutDlg();

  //Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_ABOUTBOX };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support

  //Implementation
   protected:
      DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) {

}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
   CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

//CMFCControlManagementDlg dialog


CMFCControlManagementDlg::CMFCControlManagementDlg(CWnd* pParent/* = NULL*/)
   :CDialogEx(IDD_MFCCONTROLMANAGEMENT_DIALOG, pParent) ,
   m_enableDisableVal(FALSE) , m_editControlVal(_T("")) {
   m_hIcon = AfxGetApp()&rarr LoadIcon(IDR_MAINFRAME);
}

void CMFCControlManagementDlg::DoDataExchange(CDataExchange* pDX) {
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_CHECK1, m_enableDisableCheck);
   DDX_Control(pDX, IDC_EDIT1, m_myEditControl);
   DDX_Check(pDX, IDC_CHECK1, m_enableDisableVal);
   DDX_Text(pDX, IDC_EDIT1, m_editControlVal);
}
BEGIN_MESSAGE_MAP(CMFCControlManagementDlg, CDialogEx)
   ON_WM_SYSCOMMAND()
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   ON_BN_CLICKED(IDC_CHECK1, &CMFCControlManagementDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()

//CMFCControlManagementDlg message handlers

BOOL CMFCControlManagementDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Add "About..." menu item to system menu.
  //IDM_ABOUTBOX must be in the system command range.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);

   CMenu* pSysMenu = GetSystemMenu(FALSE);
   if (pSysMenu != NULL) {
      BOOL bNameValid;
      CString strAboutMenu;
      bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
      ASSERT(bNameValid);
      if (!strAboutMenu.IsEmpty()) {
         pSysMenu → AppendMenu(MF_SEPARATOR);
         pSysMenu → AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
   }

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);       //Set big icon
   SetIcon(m_hIcon, FALSE);      //Set small icon

  //TODO: Add extra initialization here
   UpdateData(TRUE);
   if (m_enableDisableVal)
      m_myEditControl.EnableWindow(TRUE);
   else
      m_myEditControl.EnableWindow(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}
void CMFCControlManagementDlg::OnSysCommand(UINT nID, LPARAM lParam) {
   if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
      CAboutDlg dlgAbout;
      dlgAbout.DoModal();
   }else {
      CDialogEx::OnSysCommand(nID, lParam);
   }
}

//If you add a minimize button to your dialog, you will need the code below
//to draw the icon. For MFC applications using the document/view model,
//this is automatically done for you by the framework.

void CMFCControlManagementDlg::OnPaint() {
   if (IsIconic()) {
      CPaintDC dc(this);//device context for painting

      SendMessage(WM_ICONERASEBKGND,
         reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

     //Center icon in client rectangle
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
      GetClientRect(&rect);
      int x = (rect.Width() - cxIcon + 1)/2;
      int y = (rect.Height() - cyIcon + 1)/2;

     //Draw the icon
      dc.DrawIcon(x, y, m_hIcon);
   }else {
      CDialogEx::OnPaint();
   }
}

//The system calls this function to obtain the cursor to display while the user drags
//the minimized window.
HCURSOR CMFCControlManagementDlg::OnQueryDragIcon() {
   return static_cast<HCURSOR>(m_hIcon);
}

void CMFCControlManagementDlg::OnBnClickedCheck1() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_enableDisableVal)
      m_myEditControl.EnableWindow(TRUE);
   else
      m_myEditControl.EnableWindow(FALSE);
}
  • ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。 デフォルトでは、チェックボックスはオフになっています。 これにより、編集コントロールも無効になります。

コントロール管理

  • ステップ6 *-[コントロールを有効にする]チェックボックスをオンにします。 これにより、編集コントロールが自動的に有効になります。

コントロール管理

MFC-Windowsコントロール

  • Windowsコントロール*は、ユーザーがデータを入力または操作するために対話できるオブジェクトです。 これらは通常、ダイアログボックスまたはツールバーに表示されます。 コントロールのさまざまな種類があります-
  • ユーザーにテキストを表示したり、ユーザーにテキストを要求したりするために使用される text based control
  • *リストベースのコントロール*はアイテムのリストを表示します。
  • progress based control は、アクションの進行状況を示すために使用されます。
  • *静的コントロール*を使用して、色、写真、または上記のカテゴリに定期的に収まらない何かを表示できます。
Sr.No. Controls & Description
1

Static Control

静的コントロールは、ユーザーの直接の介入なしに情報をユーザーに表示するオブジェクトです。 色、幾何学的形状、またはアイコン、ビットマップ、アニメーションなどの画像を表示するために使用できます。

2

Animation Control

アニメーションコントロールは、AVI形式でオーディオクリップを表示するウィンドウです。 AVIクリップは、映画のような一連のビットマップフレームです。 アニメーションコントロールは単純なAVIクリップのみを再生でき、サウンドはサポートしていません。 CAnimateCtrl クラスで表されます。

3

Button

ボタン*は、ユーザーがアクションを開始するためにクリックするオブジェクトです。 ボタンコントロールは CButtonクラス*で表されます。

4

Bitmap Button

ビットマップボタン*は、その表面に画像または画像とテキストを表示します。 これは通常、ボタンを少し明確にすることを目的としています。 ビットマップボタンは、CButtonから派生した CBitmapButtonクラス*を使用して作成されます。

5

Command Button

  • コマンドボタン*は、通常のボタンの拡張バージョンです。 左側に緑色の矢印アイコンが表示され、その後に通常のサイズのキャプションが表示されます。 メインキャプションの下に、より多くの情報を提供するためのヒントとして機能する別の小さなキャプションを表示できます。
6

Static Text

  • 静的コントロール*は、テキスト文字列、ボックス、長方形、アイコン、カーソル、ビットマップ、または拡張メタファイルを表示します。 * CStaticクラス*で表されます。 これは、ラベル付け、ボックス化、または他のコントロールの分離に使用できます。 通常、静的コントロールは入力を受け取らず、出力も提供しません。
7

List Box

リストボックス*には、ユーザーが表示および選択できるファイル名などのアイテムのリストが表示されます。 リストボックスは CListBoxクラス*で表されます。 単一選択リストボックスでは、ユーザーは1つの項目のみを選択できます。 複数選択リストボックスでは、さまざまなアイテムを選択できます。 ユーザーがアイテムを選択すると、そのアイテムが強調表示され、リストボックスが親ウィンドウに通知メッセージを送信します。

8

Combo Boxes

  • コンボボックス*は、静的コントロールまたは編集コントロールのいずれかと組み合わされたリストボックスで構成されます。 * CComboBoxクラス*で表されます。 コントロールのリストボックス部分は常に表示される場合と、ユーザーがコントロールの横にあるドロップダウン矢印を選択した場合にのみドロップダウンする場合があります。
9

Radio Buttons

  • ラジオボタン*は、丸いボックスで囲まれたドットとして表示されるコントロールです。 実際には、ラジオボタンには、グループとして表示および動作する1つ以上の他のラジオボタンが付随しています。
10

Checkboxes

チェックボックスは、ユーザーがアイテムの値をtrueまたはfalseに設定または変更できるWindowsコントロールです。

11

Image Lists

画像リスト*は、同じサイズの画像のコレクションであり、各画像はゼロベースのインデックスで参照できます。 画像リストは、アイコンまたはビットマップの大きなセットを効率的に管理するために使用されます。 画像リストは CImageListクラス*で表されます。

12

Edit Box

  • 編集ボックス*は、ユーザーがテキストを入力できる長方形の子ウィンドウです。 * CEditクラス*で表されます。
13

Rich Edit

  • リッチ編集*コントロールは、ユーザーがテキストを入力および編集できるウィンドウです。 テキストには文字と段落の書式を割り当てることができ、埋め込みOLEオブジェクトを含めることができます。 * CRichEditCtrlクラス*で表されます。
14

Group Box

  • グループボックス*は、コントロールの表示グループまたはプログラムグループを設定するために使用される静的コントロールです。 コントロールは、他のコントロールをグループ化する長方形です。
15

Spin Button

  • スピンボタン*コントロール(アップダウンコントロールとも呼ばれます)は、スクロール位置やコンパニオンコントロールに表示される数値など、ユーザーがクリックして値を増減できる矢印ボタンのペアです。 * CSpinButtonCtrlクラス*で表されます。
16

Managing the Updown Control

アップダウンコントロールを管理します。

17

Progress Control

  • プログレスバーコントロール*は、アプリケーションが長時間の操作の進行状況を示すために使用できるウィンドウです。 これは、左から右に徐々に塗りつぶされる長方形で構成され、操作の進行に合わせてシステムのハイライトカラーが表示されます。 * CProgressCtrlクラス*で表されます。
18

Progress Bars

  • 進行状況バー*は、アプリケーションが操作の進行状況を示すために使用できるウィンドウです。
19

Timer

*タイマー*は、コンピューターまたはアプリケーションからの繰り返しの時間経過を使用する非空間オブジェクトです。 動作するために、期間の経過ごとに、コントロールはオペレーティングシステムにメッセージを送信します。 他のほとんどのコントロールとは異なり、MFCタイマーには、それを表すボタンもクラスもありません。 タイマーを作成するには、CWnd
SetTimer()メソッドを呼び出すだけです。 この関数呼び出しは、アプリケーションのタイマーを作成します。 他のコントロールと同様に、タイマーは識別子を使用します。
20

Date & Time Picker

日付と時刻のピッカーコントロール( CDateTimeCtrl )は、特定の日付を入力または選択する直感的で認識可能な方法を実装します。 コントロールのメインインターフェイスは、機能がコンボボックスに似ています。 ただし、ユーザーがコントロールを展開すると、(デフォルトで)月間カレンダーコントロールが表示され、ユーザーは特定の日付を指定できます。 日付を選択すると、月間カレンダーコントロールが自動的に消えます。

21

Picture

アプリケーションの画像を表示する必要がある場合、Visual C ++はそのための特別なコントロールを提供します。

22

Image Editor

  • 画像エディター*には、画像を作成および編集するための広範なツールセットと、ツールバービットマップの作成に役立つ機能があります。 ビットマップ、アイコン、カーソルに加えて、画像メニューのコマンドと画像エディターツールバーのツールを使用して、GIFまたはJPEG形式の画像を編集できます。
23

Slider Controls

  • Slider Control* (トラックバーとも呼ばれます)は、スライダーとオプションの目盛りを含むウィンドウです。 ユーザーがマウスまたは方向キーを使用してスライダーを動かすと、コントロールは変更を示す通知メッセージを送信します。 スライダーには、水平と垂直の2種類があります。 * CSliderCtrlクラス*で表されます。
24

Scrollbars

  • scrollbar* はグラフィカルコントロール要素で、矢印をクリックすることにより、コントロールに沿って連続するテキスト、画像、その他を2方向にスクロールできます。 このコントロールは、水平または垂直の2つの方向のいずれかを想定できます。 *CScrollBar* クラスで表されます。
25

Tree Control

ツリービューコントロール*は、ドキュメントの見出し、インデックスのエントリ、ディスク上のファイルやディレクトリなど、アイテムの階層リストを表示するウィンドウです。 各アイテムはラベルとオプションのビットマップ画像で構成され、各アイテムにはサブアイテムのリストを関連付けることができます。 ユーザーはアイテムをクリックすることにより、関連するサブアイテムのリストを展開したり折りたたんだりできます。 *CTreeCtrl クラスで表されます。

26

List Control

リストビューコントロールの機能をカプセル化します。リストビューコントロールは、アイコン(イメージリストから)とラベルで構成されるアイテムのコレクションを表示します。 CListCtrl クラスで表されます。 リストコントロールは、4つのビューのいずれかを使用してアイテムのリストを表示することで構成されます。

MFC-メッセージとイベント

アプリケーションはさまざまなオブジェクトで構成されています。 ほとんどの場合、複数のアプリケーションがコンピューターで実行されており、オペレーティングシステムは常にいくつかの割り当てを実行するように求められます。 予測できないほど多くの要求が提示される可能性があるため、オペレーティングシステムはオブジェクトに任せて、必要なもの、必要な場合、および期待される動作または結果を指定します。

概要

  • Microsoft Windowsオペレーティングシステムは、1つのオブジェクトを処理する必要がある要求の種類と、別のオブジェクトが必要とする割り当ての種類を予測できません。
  • これらすべての割り当てと要求を管理するために、オブジェクトはメッセージを送信します。
  • 各オブジェクトには、どのメッセージをいつ送信するかを決定する責任があります。
  • メッセージを送信するには、コントロールがイベントを作成する必要があります。
  • この2つを区別するために、メッセージの名前は通常、ウィンドウメッセージを表すWM_で始まります。
  • 通常、イベントの名前はOnで始まり、アクションを示します。
  • イベントは、メッセージを送信するアクションです。

メッセージの地図

Windowsはメッセージ指向のオペレーティングシステムであるため、Windows環境のプログラミングの大部分はメッセージ処理に関係しています。 キーストロークやマウスクリックなどのイベントが発生するたびに、メッセージがアプリケーションに送信され、アプリケーションでイベントを処理する必要があります。

  • コンパイラーがメッセージを管理するには、それらをクラス定義に含める必要があります。
  • 次のコードに示すように、クラス定義の最後に DECLARE_MESSAGE_MAP マクロを提供する必要があります。
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
  • 実際のメッセージは、DECLARE_MESSAGE_MAP行のすぐ上にリストする必要があります。
  • メッセージを実装するには、プログラムが使用しているメッセージのテーブルを作成する必要があります。
  • この表では、2つの区切りマクロを使用しています。
  • BEGIN_MESSAGE_MAP で始まり、 END_MESSAGE_MAP マクロで終わります。
  • BEGIN_MESSAGE_MAPマクロは、次のコードに示すように、クラスの名前とクラスの派生元のMFCクラスの2つの引数を取ります。
#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

  //Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
                                      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance(){
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

新しいWin32プロジェクトを作成して、簡単な例を見てみましょう。

Win32プロジェクト

  • ステップ1 *-MFCプロジェクトを作成するには、プロジェクトを右クリックして[プロパティ]を選択します。
  • ステップ2 *-左側のセクションで、[構成プロパティ]→[全般]をクリックします。
  • ステップ3 *-[プロジェクトのデフォルト]セクションで[共有DLLでMFCを使用]オプションを選択し、[OK]をクリックします。
  • ステップ4 *-新しいソースファイルを追加する必要があります。
  • ステップ5 *-プロジェクトを右クリックして、[追加]→[新しいアイテム]を選択します。
  • ステップ6 *-[テンプレート]セクションで、[C ++ファイル(.cpp)]をクリックします。

Winプロジェクト

  • ステップ7 *-[追加]をクリックして続行します。

ステップ8 *-次に、。cppファイルに次のコードを追加します。

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};

CMainFrame::CMainFrame() {
  //Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}

class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance() {
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Windowsメッセージ

ウィンドウの作成、ウィンドウの表示など、Windowsメッセージにはさまざまな種類があります。 一般的に使用されるWindowsメッセージの一部を次に示します。

以下に、さまざまな種類のウィンドウメッセージを示します。

Message Map entry Description
WM_ACTIVATE ON_WM_ACTIVATE() The framework calls this member function when a CWnd object is being activated or deactivated.
WM_ACTIVATEA PP ON_WM_ACTIVATEAPP() The framework calls this member function to all top-level windows of the task being activated and for all top-level windows of the task being deactivated.
WM_APPCOMM AND ON_WM_APPCOMMAND() The framework calls this member function when the user generates an application command event.
WM_CANCELMODE WM_CANCELMODE() The framework calls this member function to inform CWnd to cancel any internal mode.
WM_CHILDACTIVATE ON_WM_CHILDACTIVATE() If the CWnd object is a multiple document interface (MDI) child window, OnChildActivate is called by the framework when the user clicks the window’s title bar or when the window is activated, moved, or sized.
WM_CLIPBOAR DUPDATE ON_WM_CLIPBOARDUPDATE() The framework calls this member function when the contents of the clipboard have changed.
WM_CLOSE ON_WM_CLOSE() The framework calls this member function as a signal that the CWnd or an application is to terminate.
WM_CONTEXTMENU ON_WM_CONTEXTMENU() Called by the framework when the user has clicked the right mouse button (rightclicked) in the window.
WM_COPYDATA ON_WM_COPYDATA() This member function is called by the framework to copy data from one application to another.
WM_CREATE ON_WM_CREATE() The framework calls this member function when an application requests that the Windows window be created by calling the Create or CreateEx member function.
WM_CTLCOLOR ON_WM_CTLCOLOR() The framework calls this member function when a child control is about to be drawn.
WM_DELETEITEM ON_WM_DELETEITEM() The framework calls this member function to inform the owner of an owner-draw list box or combo box that the list box or combo box is destroyed or that items have been removed.
WM_DESTROY ON_WM_DESTROY() he framework calls this member function to inform the CWnd object that it is being destroyed.
WM_DRAWITEM ON_WM_DRAWITEM() The framework calls this member function for the owner of an owner-draw button control, combo-box control, list-box control, or menu when a visual aspect of the control or menu has changed.
WM_DROPFILES ON_WM_DROPFILES() The framework calls this member function when the user releases the left mouse button over a window that has registered itself as the recipient of dropped files.
WM_ENABLE ON_WM_ENABLE() The framework calls this member function when an application changes the enabled state of the CWnd object. Syntax.
WM_HELPINFO ON_WM_HELPINFO() Handles F1 Help within the application (using the current context).
WM_HOTKEY ON_WM_HOTKEY() The framework calls this member function when the user presses a system-wide hot key.
WM_HSCROLL ON_WM_HSCROLL() The framework calls this member function when the user clicks a window’s horizontal scroll bar.
WM_KEYDOWN ON_WM_KEYDOWN() The framework calls this member function when a nonsystem key is pressed.
WM_KEYUP ON_WM_KEYUP() The framework calls this member function when a nonsystem key is released.
WM_KILLFOCUS ON_WM_KILLFOCUS() The framework calls this member function immediately before losing the input focus.
WM_LBUTTONDBLCLK ON_WM_LBUTTONDBLCLK() The framework calls this member function when the user double-clicks the left mouse button.
WM_LBUTTONDOWN ON_WM_LBUTTONDOWN() The framework calls this member function when the user presses the left mouse button.
WM_LBUTTONUP ON_WM_LBUTTONUP() The framework calls this member function when the user releases the left mouse button.
WM_MBUTTONDBLCLK ON_WM_MBUTTONDBLCLK() The framework calls this member function when the user double-clicks the middle mouse button.
WM_MBUTTONDOWN ON_WM_MBUTTONDOWN() The framework calls this member function when the user presses the middle mouse button.
WM_MBUTTONUP ON_WM_MBUTTONUP() The framework calls this member function when the user releases the middle mouse button.
WM_MENUSELECT ON_WM_MENUSELECT() If the CWnd object is associated with a menu, OnMenuSelect is called by the framework when the user selects a menu item.
WM_MOUSEACTIVATE ON_WM_MOUSEACTIVATE() The framework calls this member function when the cursor is in an inactive window and the user presses a mouse button.
WM_MOUSEHOVER ON_WM_MOUSEHOVER() The framework calls this member function when the cursor hovers over the client area of the window for the period of time specified in a prior call to TrackMouseEvent.
WM_MOUSEHWHEEL ON_WM_MOUSEHWHEEL() The framework calls this member when the current window is composed by the Desktop Window Manager (DWM), and that window is maximized.
WM_MOUSELEAVE ON_WM_MOUSELEAVE() The framework calls this member function when the cursor leaves the client area of the window specified in a prior call to TrackMouseEvent.
WM_MOUSEMOVE ON_WM_MOUSEMOVE() The framework calls this member function when the mouse cursor moves.
WM_MOVE ON_WM_MOVE() The framework calls this member function after the CWnd object has been moved.
WM_PAINT ON_WM_PAINT() The framework calls this member function when Windows or an application makes a request to repaint a portion of an application’s window.
WM_SETFOCUS() ON_WM_SETFOCUS( ) The framework calls this member function after gaining the input focus.
WM_SIZE( ) ON_WM_SIZE( ) The framework calls this member function after the window’s size has changed.
WM_TIMER ON_WM_TIMER() The framework calls this member function after each interval specified in the SetTimer member function used to install a timer.
WM_VSCROLL ON_WM_VSCROLL() The framework calls this member function when the user clicks the window’s vertical scroll bar.
WM_WINDOWPOSCHANGED ON_WM_WINDOWPOSCHANGED() The framework calls this member function when the size, position, or Z-order has changed as a result of a call to the SetWindowPos member function or another window-management function.

ウィンドウ作成の簡単な例を見てみましょう。

*WM_CREATE* -ウィンドウと呼ばれるオブジェクトが作成されると、オブジェクトを作成するフレームは *ON_WM_CREATE* として識別されるメッセージを送信します。
  • ステップ1 *-ON_WM_CREATEを作成するには、afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);を追加します。以下に示すように、DECLARE_MESSAGE_MAP()の前。
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};
  • ステップ2 *-BEGIN_MESSAGE_MAP(CMainFrame、CFrameWnd)の後でEND_MESSAGE_MAP()の前にON_WM_CREATE()を追加します
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()
  • ステップ3 *-これがOnCreate()の実装です
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
  //Call the base class to create the window
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {

     //If the window was successfully created, let the user know
      MessageBox(L"The window has been created!!!");
     //Since the window was successfully created, return 0
      return 0;
   }
  //Otherwise, return -1
   return -1;
}

ステップ4 *-これで、。cppファイルは次のコードのようになります。

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

  //Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
  //Call the base class to create the window
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {
     //If the window was successfully created, let the user know
      MessageBox(L"The window has been created!!!");
     //Since the window was successfully created, return 0
      return 0;
   }
  //Otherwise, return -1
   return -1;
}
BOOL CMessagesApp::InitInstance() {
   m_pMainWnd = new CMainFrame;
   m_pMainWnd -> ShowWindow(SW_SHOW);
   m_pMainWnd -> UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;
  • ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

メッセージ

  • ステップ6 *-[OK]をクリックすると、メインウィンドウが表示されます。

メッセージ

コマンドメッセージ

グラフィカルアプリケーションの主な機能の1つは、ユーザーがマシンと対話できるようにするWindowsコントロールとリソースを提示することです。 学習するコントロールの例は、ボタン、リストボックス、コンボボックスなどです。

前のレッスンで紹介したリソースの1つのタイプはメニューです。 このようなコントロールとリソースは、ユーザーがクリックすると独自のメッセージを開始できます。 Windowsコントロールまたはリソースから発せられるメッセージは、コマンドメッセージと呼ばれます。

コマンドメッセージの簡単な例を見てみましょう。

アプリケーションに新しいドキュメントを作成する機能を提供するために、CWinAppクラスはOnFileNew()メソッドを提供します。

afx_msg void OnFileNew();

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_COMMAND(ID_FILE_NEW, CMainFrame::OnFileNew)
END_MESSAGE_MAP()

ここにメソッド定義があります-

void CMainFrame::OnFileNew() {
  //Create New file
}

キーボードメッセージ

  • キーボード*は、コンピューターに接続されているハードウェアオブジェクトです。 デフォルトでは、認識可能な記号、文字、その他の文字をコントロールに入力するために使用されます。 キーボードの各キーには、記号、文字、またはそれらの組み合わせが表示され、キーの用途を示すことができます。 ユーザーは通常、プログラムに信号を送信するキーを押します。

各キーには、オペレーティングシステムが認識できるコードがあります。 このコードは*仮想キーコード*と呼ばれます。

____仮想キーコードは次のとおりです。

Sr.No. Constant/value & Description
1

VK_LBUTTON

左マウスボタン

2

VK_RBUTTON

右マウスボタン

3

VK_CANCEL

コントロールブレーク処理

4

VK_MBUTTON

中マウスボタン(3ボタンマウス)

5

VK_BACK

BACKSPACEキー

6

VK_RETURN

キーを入力してください

7

VK_TAB

Tabキー

8

VK_CLEAR

クリアキー

9

VK_SHIFT

シフトキー

10

VK_CONTROL

Ctrlキー

11

VK_MENU

ALTキー

12

VK_PAUSE

一時停止キー

13

VK_CAPITAL

Caps Lockキー

14

VK_ESCAPE

ESCキー

15

VK_SPACE

スペースキー

16

VK_PRIOR

PAGE UPキー

17

VK_NEXT

Page Downキー

18

VK_END

ENDキー

19

VK_HOME

ホームキー

20

VK_LEFT

左矢印キー

21

VK_UP

上矢印キー

22

VK_RIGHT

右矢印キー

23

VK_DOWN

下矢印キー

24

VK_SELECT

SELECTキー

25

VK_PRINT

印刷キー

26

VK_EXECUTE

実行キー

27

VK_SNAPSHOT

印刷画面キー

28

VK_INSERT

INSキー

29

VK_DELETE

DELキー

30

VK_NUMPAD0

テンキー0キー

31

VK_NUMPAD1

テンキー1キー

32

VK_NUMPAD2

テンキー2キー

33

VK_NUMPAD3

テンキー3キー

34

VK_NUMPAD4

テンキー4キー

35

VK_NUMPAD5

数字キーパッド5キー

36

VK_NUMPAD6

テンキー6キー

37

VK_NUMPAD7

テンキー7キー

38

VK_NUMPAD8

テンキー8キー

39

VK_NUMPAD9

テンキー9キー

40

VK_MULTIPLY

乗算キー

41

VK_ADD

キーを追加

42

VK_SEPARATOR

区切りキー

43

VK_SUBTRACT

減算キー

44

VK_DECIMAL

10進数のキー

45

VK_DIVIDE

分割キー

46

VK_F1

F1キー

47

VK_F2

F2キー

48

VK_F3

F3キー

49

VK_F4

F4キー

50

VK_F5

F5キー

52

VK_F6

F6キー

53

VK_F7

F7キー

54

VK_F8

F8キー

55

VK_F9

F9キー

56

VK_F10

F10キー

57

VK_F11

F11キー

58

VK_F12

F12キー

59

VK_NUMLOCK

NUM LOCKキー

60

VK_SCROLL

スクロールロックキー

61

VK_LSHIFT

左Shiftキー

62

VK_RSHIFT

右Shiftキー

63

VK_LCONTROL

左コントロールキー

64

VK_RCONTROL

右コントロールキー

キーを押すと、https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keydown [WM_KEYDOWN]またはhttps://docs.microsoft.com/en-us/windows/desktop/が発生しますinputdev/wm-syskeydown [WM_SYSKEYDOWN]メッセージがスレッドメッセージに配置されます。 これは次のように定義することができます-

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

簡単な例を見てみましょう。

  • ステップ1 *-これがメッセージです。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()
  • ステップ2 *-OnKeyDown()の実装です。
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
   switch (nChar) {

      case VK_RETURN:
         MessageBox(L"You pressed Enter");
         break;
      case VK_F1:
         MessageBox(L"Help is not available at the moment");
         break;
      case VK_DELETE:
         MessageBox(L"Can't Delete This");
         break;
      default:
         MessageBox(L"Whatever");
   }
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

メッセージウィンドウ

  • ステップ4 *-Enterキーを押すと、次のメッセージが表示されます。

メッセージ出力

マウスメッセージ

マウスは、コンピューターに接続されている別のオブジェクトで、ユーザーがマシンと対話できるようにします。

  • マウスの左ボタンが押された場合、ON_WM_LBUTTONDOWNメッセージが送信されます。 このメッセージの構文は次のとおりです-
  • afx_msg void OnLButtonDown(UINT nFlags、CPointポイント)
  • マウスの右ボタンが押された場合、ON_WM_RBUTTONDOWNメッセージが送信されます。 その構文は-
  • afx_msg void OnRButtonDown(UINT nFlags、CPointポイント)
  • 同様に、左マウスを離すと、ON_WM_LBUTTONUPメッセージが送信されます。 その構文は-
  • afx_msg void OnLButtonUp(UINT nFlags、CPointポイント)
  • 右マウスボタンを離すと、ON_WM_TBUTTONUPメッセージが送信されます。 その構文は-
  • afx_msg void OnRButtonUp(UINT nFlags、CPointポイント)

簡単な例を見てみましょう。

  • ステップ1 *-次のコードに示すように、CMainFrameクラス定義に次の2つの関数を追加します。
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
      afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
      afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
      DECLARE_MESSAGE_MAP()
};
  • ステップ2 *-次の2つのメッセージマップを追加します。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_KEYDOWN()
   ON_WM_LBUTTONDOWN()
   ON_WM_RBUTTONUP()
END_MESSAGE_MAP()
  • ステップ3 *-これが関数の定義です。
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) {
   CString MsgCoord;
   MsgCoord.Format(L"Left Button at P(%d, %d)", point.x, point.y);
   MessageBox(MsgCoord);
}
void CMainFrame::OnRButtonUp(UINT nFlags, CPoint point) {
   MessageBox(L"Right Mouse Button Up");
}
  • ステップ4 *-このアプリケーションを実行すると、次の出力が表示されます。

マウスメッセージ

  • ステップ5 *-[OK]をクリックすると、次のメッセージが表示されます。

マウスメッセージ

  • ステップ6 *-このウィンドウを右クリックします。 これで、マウスの右ボタンを放すと、次のメッセージが表示されます。

マウスメッセージ

MFC-Activexコントロール

  • ActiveXコントロールコンテナ*は、実行するActiveX(以前のOLE)コントロールの環境を提供する親プログラムです。
  • ActiveXコントロールは、Microsoft ActiveXテクノロジーを使用したコントロールです。
  • ActiveXはプログラミング言語ではなく、アプリケーションが情報を共有する方法に関する一連のルールです。
  • プログラマは、C、C ++、Visual Basic、Javaなどのさまざまな言語でActiveXコントロールを開発できます。
  • MFCの有無にかかわらずActiveXコントロールを含むことができるアプリケーションを作成できますが、MFCを使用する方がはるかに簡単です。

MFCダイアログベースのアプリケーションにActiveXコントロールを追加する簡単な例を見てみましょう。

  • ステップ1 *-デザイナーウィンドウでダイアログを右クリックし、[ActiveXコントロールの挿入]を選択します。

Activexコントロールの挿入

  • ステップ2 *-Microsoft Picture Clip Controlを選択し、[OK]をクリックします。

Microsoft Picture Control

  • ステップ3 *-ピクチャコントロールのサイズを変更し、[プロパティ]ウィンドウで[ピクチャ]フィールドをクリックします。
  • ステップ4 *-写真を含むフォルダーを参照します。 任意の画像を選択します。
  • ステップ5 *-このアプリケーションを実行すると、次の出力が表示されます。

Activexの挿入

別の簡単な例を見てみましょう。

  • ステップ1 *-デザイナーウィンドウのダイアログを右クリックします。

デザイナーウィンドウ

  • ステップ2 *-[ActiveXコントロールの挿入]を選択します。

デザイナーウィンドウ

  • ステップ3 *-Microsoft ProgressBar Control 6.0を選択し、[OK]をクリックします。

ステップ4 *-プログレスバーを選択し、プロパティウィンドウで方向を *1 – ccOrientationVertical に設定します。

  • ステップ5 *-プログレスバーの制御変数を追加します。

デザイナーウィンドウ

  • ステップ6 *-OnInitDialog()に次のコードを追加します
m_progBarCtrl.SetScrollRange(0,100,TRUE);
m_progBarCtrl.put_Value(53);
  • ステップ7 *-このアプリケーションを再度実行すると、垂直方向の進行状況バーも表示されます。

デザイナーウィンドウ

MFC-ファイルシステム

この章では、ファイルシステムのさまざまなコンポーネントについて説明します。

ドライブ

  • ドライブ*は、情報を保存できるようにコンピューターに接続された物理デバイスです。 論理ディスク、論理ボリューム、または仮想ディスク(略してVDまたはvdisk)は、コンピューターシステム内の1つ以上の物理ディスクドライブに使用可能なストレージ容量の領域を提供する仮想デバイスです。 ドライブには、ハードディスク、CD ROM、DVD ROM、フラッシュ(USB)ドライブ、メモリカードなどがあります。

実行する主な操作の1つは、コンピューター上のドライブのリストを取得することです。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

  • ステップ1 *-ツールボックスから1つのボタンをドラッグし、キャプションをGet Drives Infoに変更します。
  • ステップ2 *-静的コントロールのキャプション(TODO行)を削除し、そのIDをIDC_STATIC_TEXTに変更します。

静的キャプション

  • ステップ3 *-ボタンを右クリックして、[イベントハンドラーの追加]を選択します。

静的キャプション

  • ステップ4 *-BN_CLICKEDメッセージタイプを選択し、[追加と編集]ボタンをクリックします。
  • ステップ5 *-静的テキストコントロールの値変数m_strDrivesを追加します。

静的キャプション

コンピューター上のドライブをサポートするために、Win32ライブラリはMicrosoft WindowのGetLogicalDrives()関数を提供し、現在のコンピューター上のすべてのドライブのリストを取得します。

  • ステップ6 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

静的キャプション

  • ステップ7 *-ボタンをクリックすると、コンピューター上のすべてのドライブが表示されます。

静的キャプション

ディレクトリ

コンピューティングでは、*ディレクトリ*は、他のコンピューターファイル、および場合によっては他のディレクトリへの参照を含むファイルシステムカタログ構造です。 ディレクトリは物理的な場所です。 ドライブで使用できない操作を処理できます。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

  • ステップ1 *-ツールボックスから3つのボタンをドラッグします。 キャプションを変更して、ディレクトリの作成、ディレクトリの削除、ディレクトリの移動を行います。

ステップ2 *-これらのボタンのIDを *IDC_BUTTON_CREATEIDC_BUTTON_DELETE 、および IDC_BUTTON_MOVE に変更します。

  • ステップ3 *-TODO行を削除します。

ディレクトリ

  • ステップ4 *-各ボタンにイベントハンドラーを追加します。
  • ステップ5 *-ディレクトリを作成するには、Win32ライブラリのCreateDirectory()メソッドを呼び出します。
  • ステップ6 *-Createボタンイベントハンドラーの実装で、1つのディレクトリを作成し、さらに2つのサブディレクトリを作成します。
void CMFCDirectoriesDemoDlg::OnBnClickedButtonCreate() {
  //TODO: Add your control notification handler code here
   SECURITY_ATTRIBUTES saPermissions;

   saPermissions.nLength = sizeof(SECURITY_ATTRIBUTES);
   saPermissions.lpSecurityDescriptor = NULL;
   saPermissions.bInheritHandle = TRUE;

   if (CreateDirectory(L"D:\\MFCDirectoryDEMO", &saPermissions) == TRUE)
      AfxMessageBox(L"The directory was created.");
   CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir1", NULL);
   CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir2", NULL);
}

ステップ7 *-ディレクトリを削除するには、Win32ライブラリの RemoveDirectory()*関数を呼び出します。 削除ボタンイベントハンドラーの実装を次に示します。

void CMFCDirectoriesDemoDlg::OnBnClickedButtonDelete() {
  //TODO: Add your control notification handler code here
   if (RemoveDirectory(L"D:\\MFCDirectoryDEMO\\Dir1") == TRUE)
      AfxMessageBox(L"The directory has been deleted");
}
  • ステップ8 *-ディレクトリを移動する場合は、同じMoveFile()関数を呼び出すこともできます。 移動ボタンイベントハンドラーの実装を次に示します。このハンドラーでは、最初に新しいディレクトリを作成してから、Dir2をそのディレクトリに移動します。
void CMFCDirectoriesDemoDlg::OnBnClickedButtonMove() {
  //TODO: Add your control notification handler code here
   CreateDirectory(L"D:\\MFCDirectory", NULL);

   if (MoveFile(L"D:\\MFCDirectoryDEMO\\Dir1", L"D:\\MFCDirectory\\Dir1") == TRUE)
      AfxMessageBox(L"The directory has been moved");
}
  • ステップ9 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

ディレクトリ

  • ステップ10 *-[ディレクトリの作成]ボタンをクリックすると、これらのディレクトリが作成されます。

ディレクトリ

  • ステップ11 *-[ディレクトリの削除]ボタンをクリックすると、Dir1が削除されます。

ディレクトリ

ファイル処理

MFCアプリケーションのほとんどの*ファイル処理*は、 CArchive という名前のクラスと組み合わせて実行されます。 CArchiveクラスは、アプリケーションと、データの保存または使用可能にするために使用されるメディアとの間のリレーとして機能します。 これにより、オブジェクトの複雑なネットワークを永続的なバイナリ形式(通常はディスクストレージ)で保存し、それらのオブジェクトを削除した後も保持できます。

CArchiveクラスのメソッドのリストは次のとおりです-

以下の____は、CDCクラスのメソッドのリストです。

Sr.No. Name & Description
1

Abort

例外をスローせずにアーカイブを閉じます。

2

Close

書き込まれていないデータをフラッシュし、 CFile から切断します。

3

Flush

アーカイブバッファから未書き込みデータをフラッシュします。

4

GetFile

このアーカイブのCFileオブジェクトポインターを取得します。

5

GetObjectSchema

  • Serialize* 関数から呼び出され、逆シリアル化されているオブジェクトのバージョンを判断します。
6

IsBufferEmpty

Windows Sockets受信プロセス中にバッファが空になったかどうかを判断します。

7

IsLoading

アーカイブがロードされているかどうかを判別します。

8

IsStoring

アーカイブが保存されているかどうかを判断します。

9

MapObject

ファイルにシリアル化されていないが、サブオブジェクトが参照できるオブジェクトをマップに配置します。

10

Read

生バイトを読み取ります。

11

ReadClass

以前に WriteClass で保存されたクラス参照を読み取ります。

12

ReadObject

ロードのためにオブジェクトのSerialize関数を呼び出します。

13

ReadString

1行のテキストを読み取ります。

14

SerializeClass

CArchiveの方向に応じて、CArchiveオブジェクトへのクラス参照を読み書きします。

15

SetLoadParams

ロード配列が成長するサイズを設定します。 オブジェクトをロードする前、または MapObject または ReadObject を呼び出す前に呼び出す必要があります。

16

SetObjectSchema

アーカイブオブジェクトに格納されているオブジェクトスキーマを設定します。

17

SetStoreParams

シリアル化プロセス中に一意のオブジェクトを識別するために使用されるマップのハッシュテーブルサイズとブロックサイズを設定します。

18

Write

生のバイトを書き込みます。

19

WriteClass

  • CRuntimeClass* への参照をCArchiveに書き込みます。
20

WriteObject

格納するためにオブジェクトのSerialize関数を呼び出します。

21

WriteString

1行のテキストを書き込みます。

データの保存と取得に使用される演算子のリストは次のとおりです

Sr.No. Name & Description
1

operator <<

オブジェクトとプリミティブ型をアーカイブに保存します。

2

operator >>

アーカイブからオブジェクトとプリミティブ型をロードします。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

  • ステップ1 *-次のスナップショットに示すように、1つの編集コントロールと2つのボタンをドラッグします。

新しいMFC

ステップ2 *-編集制御用に制御変数 *m_editCtrl および値変数 m_strEdit を追加します。

  • ステップ3 *-[開く]ボタンと[保存]ボタンのクリックイベントハンドラーを追加します。
  • ステップ4 *-これはイベントハンドラの実装です。
void CMFCFileProcessingDlg::OnBnClickedButtonOpen() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CFile file;

   file.Open(L"ArchiveText.rpr", CFile::modeRead);
   if(file) {
      CArchive ar(&file, CArchive::load);

      ar >> m_strEdit;

      ar.Close();
      file.Close();
   }
   UpdateData(FALSE);
}

void CMFCFileProcessingDlg::OnBnClickedButtonSave() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);

   if (m_strEdit.GetLength() == 0) {
      AfxMessageBox(L"You must enter the name of the text.");
      return;
   }
   CFile file;

   file.Open(L"ArchiveText.rpr", CFile::modeCreate | CFile::modeWrite);
   CArchive ar(&file, CArchive::store);
   ar << m_strEdit;

   ar.Close();
   file.Close();
}
  • ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

新しいMFC

  • ステップ6 *-何かを書いて[保存]をクリックします。 データをバイナリ形式で保存します。

新しいMFC

  • ステップ7 *-編集コントロールからテストを削除します。 [開く]をクリックすると、同じテキストが再び読み込まれることを確認します。

MFC-標準I/O

MFCライブラリは、独自のバージョンのファイル処理を提供します。 これは、CStdioFileという名前のクラスを通じて行われます。 CStdioFileクラスはCFileから派生しています。 Unicodeテキストファイルと通常のマルチバイトテキストファイルの読み取りと書き込みを処理できます。

CStdioFileオブジェクトを初期化できるコンストラクタのリストは次のとおりです-

CStdioFile();
CStdioFile(CAtlTransactionManager* pTM);
CStdioFile(FILE* pOpenStream);
CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags);
CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager *pTM);

CStdioFileのメソッドのリストは次のとおりです-

Sr.No. Name & Description
1
  • Open*
    オーバーロード。 Openは、デフォルトのCStdioFileコンストラクターで使用するように設計されています(CFile
    Openをオーバーライドします)。
2

ReadString

1行のテキストを読み取ります。

3

Seek

現在のファイルポインターを配置します。

4

WriteString

1行のテキストを書き込みます。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例をもう一度見てみましょう。

  • ステップ1 *-次のスナップショットに示すように、1つの編集コントロールと2つのボタンをドラッグします。

スナップショット

ステップ2 *-編集制御用の値変数 *m_strEditCtrl を追加します。

スナップショット

  • ステップ3 *-[開く]ボタンと[保存]ボタンのクリックイベントハンドラーを追加します。
  • ステップ4 *-これはイベントハンドラの実装です。
void CMFCStandardIODlg::OnBnClickedButtonOpen() {

  //TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CStdioFile file;
   file.Open(L"D:\\MFCDirectoryDEMO\\test.txt", CFile::modeRead | CFile::typeText);

   file.ReadString(m_strEditCtrl);
   file.Close();
   UpdateData(FALSE);
}

void CMFCStandardIODlg::OnBnClickedButtonSave() {

  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CStdioFile file;
   if (m_strEditCtrl.GetLength() == 0) {

      AfxMessageBox(L"You must specify the text.");
      return;
   }
   file.Open(L"D:\\MFCDirectoryDEMO\\test.txt", CFile::modeCreate |
      CFile::modeWrite | CFile::typeText);
   file.WriteString(m_strEditCtrl);
   file.Close();
}
  • ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

スナップショット

ステップ6 *-何かを書いて[保存]をクリックします。 データを .txtファイルに保存します。

スナップショット

  • ステップ7 *-ファイルの場所を見ると、test.txtファイルが含まれていることがわかります。

スナップショット

  • ステップ8 *-次に、アプリケーションを閉じます。 同じアプリケーションを実行します。 [開く]をクリックすると、同じテキストが再び読み込まれます。
  • ステップ9 *-ファイルを開いてファイルを読み取り、続いてエディットコントロールを更新します。

MFC-ドキュメントビュー

  • Document/Viewアーキテクチャ*は、Microsoft Foundation Classesライブラリに基づいてアプリケーションを作成するために使用される基盤です。 ユーザーがアプリケーションの一部として見ているものや、ユーザーが作業するドキュメントなど、コンピュータープログラムを構成するさまざまな部分を区別することができます。 これは、アンサンブルとして機能する個別のクラスの組み合わせによって行われます。

ドキュメント/ビューアーキテクチャを構成する部分は、フレーム、1つ以上のドキュメント、およびビューです。 まとめると、これらのエンティティは使用可能なアプリケーションを構成します。

View

*view* は、ユーザーが仕事をするために作業しているプラ​​ットフォームです。 ユーザーがアプリケーションで何でもできるようにするには、CViewクラスに基づくオブジェクトであるビューを提供する必要があります。 CViewから派生したクラスの1つを直接使用するか、CViewまたはその子クラスの1つから独自のカスタムクラスを派生できます。

資料

  • ドキュメント*はバケットに似ています。 コンピューターアプリケーションの場合、ドキュメントはユーザーのデータを保持します。 このアーキテクチャのドキュメント部分を作成するには、CDocumentクラスからオブジェクトを派生する必要があります。

フレーム

名前が示すように、*フレーム*は、ビルディングブロック、構造、およびアイテムの境界の組み合わせです。 フレームは、ウィンドウに「物理的な」存在感を与えます。 また、Windowsデスクトップに関するオブジェクトの場所も定義します。

シングルドキュメントインターフェイス(SDI)

Single Document Interface 」またはSDIという表現は、ユーザーに1つのビューのみを表示できるドキュメントを指します。 これは、アプリケーションが一度に複数のドキュメントを表示できないことを意味します。 現在のアプリケーションの別の種類のドキュメントを表示する場合は、アプリケーションの別のインスタンスを作成する必要があります。 メモ帳とワードパッドは、SDIアプリケーションの例です。

新しいMFCダイアログベースのアプリケーションを作成して、単一ドキュメントインターフェイスまたはSDIの簡単な例を見てみましょう。

ステップ1 *-以下の設定で新しいMFCアプリケーション *MFCSDIDemo を作成します。

SDI

  • ステップ2 *-アプリケーションタイプから[単一ドキュメント]を選択し、プロジェクトスタイルからMFC標準を選択します。
  • ステップ3 *-[完了]をクリックして続行します。
  • ステップ4 *-プロジェクトが作成されたら、アプリケーションを実行すると、次の出力が表示されます。

SDI

マルチドキュメントインターフェイス(MDI)

ユーザーがアプリケーションを閉じずに複数のドキュメントを開くことができる場合、アプリケーションは Multiple Document Interface またはMDIと呼ばれます。 この機能を提供するために、アプリケーションは、コンピュータープログラムのメインフレームとして機能する親フレームを提供します。 このフレーム内で、アプリケーションは個々のフレームでビューを作成し、各ビューを互いに区別できるようにします。

新しいMFCダイアログベースのアプリケーションを作成して、複数のドキュメントインターフェイスまたはMDIの簡単な例を見てみましょう。

ステップ1 *-以下の設定で新しいMFCアプリケーション *MFCMDIDemo を作成します。

MDI

  • ステップ2 *-アプリケーションの種類から複数のドキュメントを選択し、プロジェクトスタイルからMFC標準を選択します。
  • ステップ3 *-[完了]をクリックして続行します。
  • ステップ4 *-プロジェクトが作成されたら、アプリケーションを実行すると、次の出力が表示されます。

MDI

  • ステップ5 *-[ファイル]→[新規]メニューオプションをクリックすると、次のスナップショットに示すように、別の子ウィンドウが作成されます。

MDI

  • ステップ6 *-マルチドキュメントインターフェイス(MDI)アプリケーションでは、アプリケーションごとに1つのメインフレームがあります。 この場合、CMDIFrameWnd、および各ドキュメントの1つのCMDIChildWnd派生子フレーム。

MFC-ストリング

  • 文字列*は、文字のシーケンスを表すオブジェクトです。 Cスタイルの文字列は、C言語内で作成され、C ++内で引き続きサポートされます。
  • この文字列は、実際にはヌル文字「\ 0」で終了する文字の1次元配列です。
  • NULLで終わる文字列には、文字列とそれに続くヌルを構成する文字が含まれます。

文字配列の簡単な例を次に示します。

char word[12] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0' };

以下は、別の表現方法です。

char word[] = "Hello, World";

Microsoft Foundation Class(MFC)ライブラリは、 CString と呼ばれる文字列を操作するクラスを提供します。 以下は、CStringの重要な機能です。

  • CStringには基本クラスがありません。
  • CStringオブジェクトは、可変長の文字シーケンスで構成されます。
  • CStringは、Basicと同様の構文を使用して関数と演算子を提供します。 *連結演算子と比較演算子は、メモリ管理の簡素化とともに、CStringオブジェクトを通常の文字配列よりも使いやすくします。

CStringのコンストラクタは次のとおりです。

Sr.No. Method & Description
1
  • CString*

さまざまな方法でCStringオブジェクトを構築します

ここに配列メソッドのリストがあります-

Sr.No. Method & Description
1

GetLength

CStringオブジェクトの文字数を返します。

2

IsEmpty

CStringオブジェクトに文字が含まれていないかどうかをテストします。

3

Empty

文字列の長さを0にします。

4

GetAt

指定された位置の文字を返します。

5

SetAt

指定された位置に文字を設定します。

ここに比較方法のリストがあります-

Sr.No. Method & Description
1

Compare

2つの文字列を比較します(大文字と小文字を区別します)。

2

CompareNoCase

2つの文字列を比較します(大文字と小文字は区別されません)。

ここに抽出方法のリストがあります-

Sr.No. Method & Description
1

Mid

文字列の中央部分を抽出します(Basic MID $関数など)。

2

Left

文字列の左部分を抽出します(Basic LEFT $関数など)。

3

Right

文字列の右部分を抽出します(Basic RIGHT $関数など)。

4

SpanIncluding

指定された文字セットにある文字列から文字を抽出します。

5

SpanExcluding

指定された文字セットにない文字列から文字を抽出します。

変換方法のリストは次のとおりです。

Sr.No. Method & Description
1

MakeUpper

この文字列のすべての文字を大文字に変換します。

2

MakeLower

この文字列のすべての文字を小文字に変換します。

3

MakeReverse

この文字列の文字を反転します。

4

Format

sprintfのように文字列をフォーマットします。

5

TrimLeft

文字列から先頭の空白文字を削除します。

6

TrimRight

文字列から末尾の空白文字を削除します。

以下に検索方法のリストを示します。

Sr.No. Method & Description
1

Find

大きな文字列内の文字または部分文字列を検索します。

2

ReverseFind

大きな文字列内の文字を検索します。最後から始まります。

3

FindOneOf

セットから最初に一致する文字を検索します。

バッファアクセスメソッドのリストを以下に示します。

Sr.No. Method & Description
1

GetBuffer

CString内の文字へのポインターを返します。

2

GetBufferSetLength

CString内の文字へのポインターを返し、指定された長さに切り捨てます。

3

ReleaseBuffer

GetBufferによって返されたバッファの制御を解放します

4

FreeExtra

文字列に以前に割り当てられた余分なメモリを解放することにより、この文字列オブジェクトのオーバーヘッドを削除します。

5

LockBuffer

参照カウントを無効にし、バッファ内の文字列を保護します。

6

UnlockBuffer

参照カウントを有効にし、バッファ内の文字列を解放します。

Windows固有のメソッドのリストを以下に示します。

Sr.No. Method & Description
1

AllocSysString

CStringデータからBSTRを割り当てます。

2

SetSysString

CStringオブジェクトからのデータで既存のBSTRオブジェクトを設定します。

3

LoadString

Windows CEリソースから既存のCStringオブジェクトをロードします。

CStringオブジェクトのさまざまな操作は次のとおりです-

文字列を作成

文字列リテラルを使用するか、CStringクラスのインスタンスを作成することにより、文字列を作成できます。

BOOL CMFCStringDemoDlg::OnInitDialog() {

   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);        //Set big icon
   SetIcon(m_hIcon, FALSE);      //Set small icon

   CString string1 = _T("This is a string1");
   CString string2("This is a string2");

   m_strText.Append(string1 + L"\n");
   m_strText.Append(string2);

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

文字列を作成

空の文字列

空の文字列リテラルを使用するか、CString
Empty()メソッドを使用して、空の文字列を作成できます。 ブール型プロパティisEmptyを使用して、文字列が空かどうかを確認することもできます。
BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);           //Set big icon
   SetIcon(m_hIcon, FALSE);          //Set small icon

   CString string1 = _T("");
   CString string2;
   string2.Empty();

   if(string1.IsEmpty())
      m_strText.Append(L"String1 is empty\n");
   else
      m_strText.Append(string1 + L"\n");

   if(string2.IsEmpty())
      m_strText.Append(L"String2 is empty");
   else
      m_strText.Append(string2);
   UpdateData(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

空の文字列

文字列連結

2つ以上の文字列を連結するには、+演算子を使用して2つの文字列またはCString
Append()メソッドを連結します。
BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             //Set big icon
   SetIcon(m_hIcon, FALSE);             //Set small icon

  //To concatenate two CString objects
   CString s1 = _T("This ");          //Cascading concatenation
   s1 += _T("is a ");
   CString s2 = _T("test");
   CString message = s1;
   message.Append(_T("big ") + s2);
  //Message contains "This is a big test".

   m_strText = L"message: " + message;

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

文字列連結

ストリングの長さ

文字列の長さを調べるには、CStringオブジェクトの文字数を返すCString
GetLength()メソッドを使用できます。
BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             //Set big icon
   SetIcon(m_hIcon, FALSE);             //Set small icon

   CString string1 = _T("This is string 1");
   int length = string1.GetLength();
   CString strLen;

   strLen.Format(L"\nString1 contains %d characters", length);
   m_strText = string1 + strLen;

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

文字列の長さ

文字列比較

2つの文字列変数を比較するには、==演算子を使用できます

BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);           //Set big icon
   SetIcon(m_hIcon, FALSE);         //Set small icon

   CString string1 = _T("Hello");
   CString string2 = _T("World");

   CString string3 = _T("MFC Tutorial");
   CString string4 = _T("MFC Tutorial");

   if (string1 == string2)
      m_strText = "string1 and string1 are same\n";
   else
      m_strText = "string1 and string1 are not same\n";

   if (string3 == string4)
      m_strText += "string3 and string4 are same";
   else
      m_strText += "string3 and string4 are not same";

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

文字列比較

MFC-CArray

*CArray* は、ランダムまたは非シーケンシャルな方法でアクセスされるデータに最適なコレクションです。 CArrayクラスは、C配列のような配列をサポートしますが、必要に応じて動的に縮小および拡大できます。
  • 配列インデックスは常に位置0から始まります。
  • 現在の境界を超えて要素を追加するときに、上限を修正するか、配列を展開できるようにするかを決定できます。 *一部の要素がnullであっても、メモリは上限に連続して割り当てられます。

____これはCArrayクラスのメソッドのリストです。

Sr.No. Name & Description
1
  • Add*

配列の最後に要素を追加します。必要に応じて配列を拡大します。

2

Append

別の配列を配列に追加します。必要に応じて配列を拡大します

3

Copy

別の配列を配列にコピーします。必要に応じて配列を拡大します。

4

ElementAt

配列内の要素ポインターへの一時的な参照を返します。

5

FreeExtra

現在の上限を超える未使用のメモリをすべて解放します。

6

GetAt

現在の上限を超える未使用のメモリをすべて解放します。

7

GetCount

この配列内の要素の数を取得します。

8

GetData

配列内の要素へのアクセスを許可します。 NULL にすることができます。

9

GetSize

この配列内の要素の数を取得します。

10

GetUpperBound

最大の有効なインデックスを返します。

11

InsertAt

指定されたインデックスに要素(または別の配列のすべての要素)を挿入します。

12

IsEmpty

配列が空かどうかを判別します。

13

RemoveAll

この配列からすべての要素を削除します。

14

RemoveAt

特定のインデックスの要素を削除します。

15

SetAt

特定のインデックスの値を設定します。配列は拡大できません。

16

SetAtGrow

特定のインデックスの値を設定します。必要に応じて配列を拡大します。

17

SetSize

この配列に含まれる要素の数を設定します。

以下は、CArrayオブジェクトのさまざまな操作です-

CArrayオブジェクトを作成

CArray値またはオブジェクトのコレクションを作成するには、まずコレクションの値のタイプを決定する必要があります。 int、CString、doubleなど、既存のプリミティブデータ型のいずれかを使用できます。 以下に示すように。

CArray<CString, CString>strArray;

アイテムを追加

アイテムを追加するには、CArray
Add()関数を使用できます。 配列の最後にアイテムを追加します。 OnInitDialog()では、CArrayオブジェクトが作成され、次のコードに示すように3つの名前が追加されます。
CArray<CString, CString>strArray;

//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");

アイテムを取得する

アイテムを取得するには、CArray
GetAt()関数を使用できます。 この関数は、配列のインデックスとして1つの整数パラメーターを取ります。
  • ステップ1 *-すべての名前を取得する簡単な例を見てみましょう。
//Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }
*ステップ2 *-CMFCCArrayDlg
OnInitDialog()の完全な実装です。
BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              //Set big icon
   SetIcon(m_hIcon, FALSE);            //Set small icon

  //TODO: Add extra initialization here
   CArray<CString, CString>strArray;

  //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

  //Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

アイテムの取得

中間にアイテムを追加

配列の中央にアイテムを追加するには、CArray ::。InsertAt()関数を使用できます。 これには2つのパラメータが必要です。1つ目はインデックスで、2つ目は値です。

次のコードに示すように、インデックス1に新しいアイテムを挿入しましょう。

BOOL CMFCCArrayDlg::OnInitDialog() {

   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);            //Set big icon
   SetIcon(m_hIcon, FALSE);           //Set small icon

  //TODO: Add extra initialization here
   CArray<CString, CString>strArray;
  //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

  //Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、2番目のインデックスとしてAllan ddedという名前が表示されます。

アイテムの追加

アイテムの値を更新

配列の中央の項目を更新するには、CArray ::。SetAt()関数を使用できます。 これには2つのパラメータが必要です。1つ目はインデックスで、2つ目は値です。

次のコードに示すように、配列の3番目の要素を更新しましょう。

BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);                //Set big icon
   SetIcon(m_hIcon, FALSE);              //Set small icon

  //TODO: Add extra initialization here
   CArray<CString, CString>strArray;

  //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

   strArray.SetAt(2, L"Salman");

  //Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、3番目の要素の値が更新されていることがわかります。

アイテムの更新

配列をコピー

配列全体を別のCArrayオブジェクトにコピーするには、CArray

Copy()関数を使用できます。

*Step1* -次のコードに示すように、別の配列を作成し、最初の配列からすべての要素をコピーします。
BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Add "About..." menu item to system menu.

  //IDM_ABOUTBOX must be in the system command range.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);
   CMenu* pSysMenu = GetSystemMenu(FALSE);
   if (pSysMenu != NULL) {
      BOOL bNameValid;
      CString strAboutMenu;
      bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
      ASSERT(bNameValid);
      if (!strAboutMenu.IsEmpty()) {
         pSysMenu→AppendMenu(MF_SEPARATOR);
         pSysMenu→AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
   }
  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              //Set big icon
   SetIcon(m_hIcon, FALSE);             //Set small icon

  //TODO: Add extra initialization here
   CArray<CString, CString>strArray;
  //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

   strArray.SetAt(2, L"Salman");

   CArray<CString, CString>strArray2;
   strArray2.Copy(strArray);
  //Retrive names from CArray
   for (int i = 0; i < strArray2.GetSize(); i++) {
      m_strText.Append(strArray2.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}

これで、2 ^ nd ^配列から要素を取得したことがわかります。コピー関数を使用したため、出力は同じです。

アレイのコピー

アイテムを削除

特定の項目を削除するには、CArray
RemoveAt()関数を使用できます。 リストからすべての要素を削除するには、CArray :: RemoveAll()関数を使用できます。

配列から2番目の要素を削除しましょう。

BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   SetIcon(m_hIcon, TRUE);            //Set big icon
   SetIcon(m_hIcon, FALSE);           //Set small icon

  //TODO: Add extra initialization here
   CArray<CString, CString>strArray;

  //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

   strArray.SetAt(2, L"Salman");

   CArray<CString, CString>strArray2;
   strArray2.Copy(strArray);

   strArray2.RemoveAt(1);

  //Retrive names from CArray
   for (int i = 0; i < strArray2.GetSize(); i++) {
      m_strText.Append(strArray2.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、Allanという名前が配列の一部ではなくなっていることがわかります。

アイテムの削除

MFC-リンクリスト

  • リンクリスト*は、各要素が個別のオブジェクトである線形データ構造です。 リストの各要素(ノードと呼びます)は、データと次のノードへの参照という2つの項目で構成されます。 最後のノードにはnullへの参照があります。

リンクされたリストは、一緒にシーケンスを表すノードのグループで構成されるデータ構造です。 プログラマが必要なときにいつでもデータを保存するための新しい場所を自動的に作成できるように、データを構造とともに保存する方法です。 その顕著な特徴のいくつかは-

  • リンクリストは、アイテムを含む一連のリンクです。
  • 各リンクには、別のリンクへの接続が含まれています。
  • リスト内の各アイテムはノードと呼ばれます。
  • リストに少なくとも1つのノードが含まれている場合、新しいノードがリストの最後の要素として配置されます。
  • リストにノードが1つしかない場合、そのノードは最初と最後のアイテムを表します。

リンクリストには2種類あります-

単一リンクリスト

単一リンクリストは、データ構造の一種です。 単一リンクリストでは、リスト内の各ノードに、ノードの内容とリスト内の次のノードへのポインターまたは参照が格納されます。

単一のリンクリスト

二重リンクリスト

二重リンクリストは、ノードと呼ばれる一連のリンクされたレコードで構成されるリンクされたデータ構造です。 各ノードには、ノードのシーケンス内の前のノードと次のノードへの参照である2つのフィールドが含まれています。

二重リンクリスト

CListクラス

MFCは、テンプレートリンクリスト実装であり、完全に機能するクラス CList を提供します。 CListリストは、二重リンクリストのように動作します。 POSITION型の変数は、リストのキーです。 POSITION変数は、リストを順番にたどるイテレータとして、および場所を保持するブックマークとして使用できます。

____CListクラスのメソッドのリストです。

Sr.No. Name & Description
1

AddHead

要素(または別のリストのすべての要素)をリストの先頭に追加します(新しい先頭を作成します)。

2

AddTail

要素(または別のリストのすべての要素)をリストの末尾に追加します(新しい末尾を作成します)。

3

Find

ポインター値で指定された要素の位置を取得します。

4

FindIndex

ゼロから始まるインデックスで指定された要素の位置を取得します。

5

GetAt

指定された位置にある要素を取得します。

6

GetCount

リスト内の要素数を返します。

7

GetHead

リストの先頭要素を返します(空にはできません)。

8

GetHeadPosition

リストの先頭要素の位置を返します。

9

GetNext

反復する次の要素を取得します。

10

GetPrev

反復する前の要素を取得します。

11

GetSize

リスト内の要素数を返します。

12

GetTail

リストの末尾要素を返します(空にはできません)。

13

GetTailPosition

リストの末尾要素の位置を返します。

14

InsertAfter

指定された位置の後に新しい要素を挿入します。

15

InsertBefore

指定された位置の前に新しい要素を挿入します。

16

IsEmpty

空のリスト条件(要素なし)をテストします。

17

RemoveAll

このリストからすべての要素を削除します。

18

RemoveAt

位置で指定されたこのリストから要素を削除します。

19

RemoveHead

リストの先頭から要素を削除します。

20

RemoveTail

リストの末尾から要素を削除します。

21

SetAt

指定された位置に要素を設定します。

以下は、CListオブジェクトのさまざまな操作です-

CListオブジェクトを作成

CList値またはオブジェクトのコレクションを作成するには、最初にコレクションの値のタイプを決定する必要があります。 int、CString、doubleなど、既存のプリミティブデータ型のいずれかを使用できます。 以下のコードで以下に示すように。

CList<double, double>m_list;

アイテムを追加

アイテムを追加するには、CList
AddTail()関数を使用できます。 リストの最後にアイテムを追加します。 リストの先頭に要素を追加するには、CList :: AddHead()関数を使用できます。 OnInitDialog()CListで、次のコードに示すように、オブジェクトが作成され、4つの値が追加されます。
CList<double, double>m_list;

//Add items to the list
m_list.AddTail(100.75);
m_list.AddTail(85.26);
m_list.AddTail(95.78);
m_list.AddTail(90.1);

アイテムを取得する

POSITION型の変数は、リストのキーです。 POSITION変数を反復子として使用して、リストを順番に走査できます。

  • ステップ1 *-リストから要素を取得するには、すべての値を取得する次のコードを使用できます。
//iterate the list
POSITION pos = m_list.GetHeadPosition();
while (pos) {
   double nData = m_list.GetNext(pos);
   CString strVal;
   strVal.Format(L"%.2f\n", nData);
   m_strText.Append(strVal);
}
*ステップ2 *-完全なCMFCCListDemoDlg
OnInitDialog()関数です。
BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);            //Set big icon
   SetIcon(m_hIcon, FALSE);            //Set small icon

  //TODO: Add extra initialization here
   CList<double, double>m_list;

  //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

  //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.f\n", nData);
      m_strText.Append(strVal);
   }

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

取得

中間にアイテムを追加

リストの中央にアイテムを追加するには、CList ::。InsertAfter()およびCList ::。InsertBefore()関数を使用できます。 2つのパラメーターが必要です。1つ目は位置(追加できる場所)、2つ目は値です。

  • ステップ1 *-次のコードに示すように、新しいアイテムを挿入しましょう。
BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);            //Set big icon
   SetIcon(m_hIcon, FALSE);         //Set small icon

  //TODO: Add extra initialization here
   CList<double, double>m_list;

  //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);

  //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}
  • ステップ2 *-最初に値85.26の位置を取得し、その値の前に1つの要素を挿入し、その値の後に1つの要素を挿入したことがわかります。
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

アイテムの追加

アイテムの値を更新

配列の中央にあるアイテムを更新するには、CArray ::。SetAt()関数を使用できます。 これには2つのパラメーターが必要です。1つ目は位置、2つ目は値です。

次のコードに示すように、リスト内の300.00を400に更新します。

BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             //Set big icon
   SetIcon(m_hIcon, FALSE);           //Set small icon

  //TODO: Add extra initialization here
   CList<double, double>m_list;

  //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);

   position = m_list.Find(300.00);
   m_list.SetAt(position, 400.00);

  //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }

   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。 300.00の値が400.00に更新されていることがわかります。

アイテムの更新

アイテムを削除

特定のアイテムを削除するには、CList
RemoveAt()関数を使用できます。 リストからすべての要素を削除するには、CList :: RemoveAll()関数を使用できます。

値として95.78を持つ要素を削除しましょう。

BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             //Set big icon
   SetIcon(m_hIcon, FALSE);            //Set small icon

  //TODO: Add extra initialization here
   CList<double, double>m_list;

  //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);

   position = m_list.Find(300.00);
   m_list.SetAt(position, 400.00);

   position = m_list.Find(95.78);
   m_list.RemoveAt(position);

  //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }
   UpdateData(FALSE);

   return TRUE;//return TRUE unless you set the focus to a control
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、95.78の値がリストの一部ではなくなっていることがわかります。

アイテムの削除

MFC-データベースクラス

  • データベース*は、簡単にアクセス、管理、および更新できるように編成された情報のコレクションです。 ODBCに基づくMFCデータベースクラスは、ODBCドライバーが利用可能なデータベースへのアクセスを提供するように設計されています。 クラスはODBCを使用するため、アプリケーションは多くの異なるデータ形式および異なるローカル/リモート構成のデータにアクセスできます。

異なるデータベース管理システム(DBMS)を処理するために特別なケースのコードを記述する必要はありません。 ユーザーがアクセスしたいデータに適したODBCドライバーを持っている限り、ユーザーはプログラムを使用してそこに保存されているテーブルのデータを操作できます。 データソースは、データベース管理システム(DBMS)によってホストされるデータの特定のインスタンスです。 例には、Microsoft SQL Server、Microsoft Accessなどが含まれます。

CDatabase

MFCは、データソースへの接続を表すクラス CDatabase を提供します。これを使用して、データソースを操作できます。 アプリケーションで一度に1つ以上のCDatabaseオブジェクトをアクティブにすることができます。

____CDatabaseクラスのメソッドのリストです。

Sr.No. Name & Description
1

BeginTrans

接続されたデータソースで、クラス CRecordset のAddNew、Edit、Delete、およびUpdateメンバー関数の一連の可逆呼び出しである「トランザクション」を開始します。 データソースは、 BeginTrans が効果を発揮するためのトランザクションをサポートする必要があります。

2

BindParameters

  • ExecuteSQL* を呼び出す前にパラメーターをバインドできます。
3

Cancel

非同期操作または2番目のスレッドからのプロセスをキャンセルします。

4

CanTransact

データソースがトランザクションをサポートする場合、ゼロ以外を返します。

5

CanUpdate

  • CDatabase* オブジェクトが更新可能な場合(読み取り専用ではない場合)、ゼロ以外を返します。
6

Close

データソース接続を閉じます。

7

CommitTrans

BeginTransによって開始されたトランザクションを完了します。 データソースを変更するトランザクション内のコマンドが実行されます。

8

ExecuteSQL

SQLステートメントを実行します。 データレコードは返されません。

9

GetBookmarkPersistence

レコードセットオブジェクトでブックマークが保持される操作を識別します。

10

GetConnect

CDatabaseオブジェクトをデータソースに接続するために使用されるODBC接続文字列を返します。

11

GetCursorCommitBehavior

開いているレコードセットオブジェクトでトランザクションをコミットする効果を識別します。

12

GetCursorRollbackBehavior

開いているレコードセットオブジェクトでトランザクションをロールバックする効果を識別します。

13

GetDatabaseName

現在使用中のデータベースの名前を返します。

14

IsOpen

  • CDatabase* オブジェクトが現在データソースに接続されている場合、ゼロ以外を返します。
15

OnSetOptions

フレームワークによって呼び出され、標準の接続オプションを設定します。 デフォルトの実装では、クエリのタイムアウト値が設定されます。 SetQueryTimeout を呼び出すことにより、これらのオプションを事前に確立できます。

16

Open

(ODBCドライバーを介して)データソースへの接続を確立します。

17

OpenEx

(ODBCドライバーを介して)データソースへの接続を確立します。

18

Rollback

現在のトランザクション中に行われた変更を取り消します。 データソースは、BeginTrans呼び出しで定義された変更されていない前の状態に戻ります。

19

SetLoginTimeout

データソース接続の試行がタイムアウトになるまでの秒数を設定します。

20

SetQueryTimeout

データベースクエリ操作がタイムアウトするまでの秒数を設定します。 後続のすべてのレコードセットのOpen、AddNew、Edit、およびDelete呼び出しに影響します。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

  • ステップ1 *-TODO行のキャプションを*データベースからデータを取得*に変更し、次のスナップショットに示すように1つのボタンと1つのリストコントロールをドラッグします。

DBからデータを取得

  • ステップ2 *-ボタンのクリックイベントハンドラーとリストコントロールの変数m_ListControlを追加します。
  • ステップ3 *-次のスナップショットに示すように、いくつかのレコードを持つ1つのEmployeesテーブルを含む単純なデータベースがあります。

従業員表

  • ステップ4 *-CDatabaseクラスを使用できるように、次のヘッダーファイルを含める必要があります。
#include "odbcinst.h"
#include "afxdb.h"

クエリを挿入

SQL INSERT INTOステートメントは、データベースのテーブルに新しいデータ行を追加するために使用されます。

  • ステップ1 *-新しいレコードを追加するには、次のコードに示すように、CDatabaseクラスのExecuteSQL()関数を使用します。
CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
CString sDsn;
CString sFile = L"D:\\Test.mdb";
//You must change above path if it's different
int iRec = 0;

//Build ODBC connection string
sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY {
  //Open the database
   database.Open(NULL,false,false,sDsn);

   SqlString = "INSERT INTO Employees (ID,Name,age) VALUES (5,'Sanjay',69)";
   database.ExecuteSQL(SqlString);
  //Close the database
   database.Close();
}CATCH(CDBException, e) {
  //If a database exception occured, show error msg
   AfxMessageBox(L"Database error: " + e→m_strError);
}
END_CATCH;
  • ステップ2 *-上記のコードをコンパイルして実行すると、データベースに新しいレコードが追加されていることがわかります。

キューを挿入

レコードを取得

MFCアプリケーションで上記のテーブルを取得するには、次の手順に示すように、ボタンイベントハンドラーでデータベース関連の操作を実装します。

  • ステップ1 *-CDatabaseを使用するには、CDatabaseオブジェクトを作成し、そのOpen()関数を呼び出します。 これにより、接続が開きます。
  • ステップ2 *-接続されたデータソースで操作するためのCRecordsetオブジェクトを構築し、レコードセットコンストラクターにCDatabaseオブジェクトへのポインターを渡します。
  • ステップ3 *-接続の使用後、Close関数を呼び出してCDatabaseオブジェクトを破棄します。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
  //TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sFile = L"D:\\Test.mdb";
  //You must change above path if it's different
   int iRec = 0;

  //Build ODBC connection string
   sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
   TRY {
     //Open the database
      database.Open(NULL,false,false,sDsn);

     //Allocate the recordset
      CRecordset recset( &database );

     //Build the SQL statement
      SqlString = "SELECT ID, Name, Age " "FROM Employees";

     //Execute the query

      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
     //Reset List control if there is any data
      ResetListControl();
     //populate Grids
      ListView_SetExtendedListViewStyle(m_ListControl,LVS_EX_GRIDLINES);

     //Column width and heading
      m_ListControl.InsertColumn(0,"Emp ID",LVCFMT_LEFT,-1,0);
      m_ListControl.InsertColumn(1,"Name",LVCFMT_LEFT,-1,1);
      m_ListControl.InsertColumn(2, "Age", LVCFMT_LEFT, -1, 1);
      m_ListControl.SetColumnWidth(0, 120);
      m_ListControl.SetColumnWidth(1, 200);
      m_ListControl.SetColumnWidth(2, 200);

     //Loop through each record
      while( !recset.IsEOF() ) {
        //Copy each column into a variable
         recset.GetFieldValue("ID",strID);
         recset.GetFieldValue("Name",strName);
         recset.GetFieldValue("Age", strAge);

        //Insert values into the list control
         iRec = m_ListControl.InsertItem(0,strID,0);
         m_ListControl.SetItemText(0,1,strName);
         m_ListControl.SetItemText(0, 2, strAge);

        //goto next record
         recset.MoveNext();
      }
     //Close the database
      database.Close();
   }CATCH(CDBException, e) {
     //If a database exception occured, show error msg
      AfxMessageBox("Database error: "+e→m_strError);
   }
   END_CATCH;
}

//Reset List control
void CMFCDatabaseDemoDlg::ResetListControl() {
   m_ListControl.DeleteAllItems();
   int iNbrOfColumns;
   CHeaderCtrl* pHeader = (CHeaderCtrl*)m_ListControl.GetDlgItem(0);
   if (pHeader) {
      iNbrOfColumns = pHeader→GetItemCount();
   }
   for (int i = iNbrOfColumns; i >= 0; i--) {
      m_ListControl.DeleteColumn(i);
   }
}
  • ステップ4 *-これがヘッダーファイルです。
//MFCDatabaseDemoDlg.h : header file
//

#pragma once
#include "afxcmn.h"


//CMFCDatabaseDemoDlg dialog
class CMFCDatabaseDemoDlg : public CDialogEx {
  //Construction
   public:
      CMFCDatabaseDemoDlg(CWnd* pParent = NULL);   //standard constructor

  //Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCDATABASEDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX);   //DDX/DDV support
      void ResetListControl();

  //Implementation
   protected:
      HICON m_hIcon;

     //Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
   public:
      CListCtrl m_ListControl;
      afx_msg void OnBnClickedButtonRead();
};
  • ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

レコードの取得

  • ステップ6 *-読み取りボタンを押して、データベース操作を実行します。 Employeesテーブルを取得します。

レコードの取得

レコードを更新

SQL UPDATEクエリは、テーブル内の既存のレコードを変更するために使用されます。 UPDATEクエリでWHERE句を使用して、選択した行を更新できます。更新しないと、すべての行が影響を受けます。

  • ステップ1 *-IDが5であるAgeを更新して、簡単な例を見てみましょう。
SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);
  • ステップ2 *-ボタンクリックイベントの完全なコードです。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
  //TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sDsn;
   CString sFile =
      L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";
  //You must change above path if it's different
   int iRec = 0;

  //Build ODBC connection string
   sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
   TRY {
     //Open the database
      database.Open(NULL,false,false,sDsn);

     //Allocate the recordset
      CRecordset recset(&database);

      SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";

      database.ExecuteSQL(SqlString);

      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Build the SQL statement
      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Execute the query
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);

     //Reset List control if there is any data
      ResetListControl();
     //populate Grids
      ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);

     //Column width and heading
      m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
      m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
      m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
      m_listCtrl.SetColumnWidth(0, 120);
      m_listCtrl.SetColumnWidth(1, 200);
      m_listCtrl.SetColumnWidth(2, 200);

     //Loop through each record
      while (!recset.IsEOF()) {
        //Copy each column into a variable
         recset.GetFieldValue(L"ID",strID);
         recset.GetFieldValue(L"Name",strName);
         recset.GetFieldValue(L"Age", strAge);

        //Insert values into the list control
         iRec = m_listCtrl.InsertItem(0,strID,0);
         m_listCtrl.SetItemText(0,1,strName);
         m_listCtrl.SetItemText(0, 2, strAge);

        //goto next record
         recset.MoveNext();
      }

     //Close the database
      database.Close();
   }CATCH(CDBException, e) {
     //If a database exception occured, show error msg
      AfxMessageBox(L"Database error: " + e→m_strError);
   }
   END_CATCH;
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

レコードの取得

  • ステップ4 *-読み取りボタンを押して、データベース操作を実行します。 次のEmployeesテーブルを取得します。

レコードの更新

  • ステップ5 *-年齢が69から59に更新されていることがわかります。

レコードを削除

SQL DELETEクエリは、テーブルから既存のレコードを削除するために使用されます。 DELETEクエリでWHERE句を使用して、選択した行を削除できます。そうしないと、すべてのレコードが削除されます。

  • ステップ1 *-IDが3であるレコードを削除して、簡単な例を見てみましょう。
SqlString = L"DELETE FROM Employees WHERE ID = 3;";

database.ExecuteSQL(SqlString);
  • ステップ2 *-ボタンクリックイベントの完全なコードです。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
  //TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sDsn;
   CString sFile =
       L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";

  //You must change above path if it's different
   int iRec = 0;

  //Build ODBC connection string
   sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
   TRY {
     //Open the database
      database.Open(NULL,false,false,sDsn);

     //Allocate the recordset
      CRecordset recset(&database);

      SqlString = L"DELETE FROM Employees WHERE ID = 3;";

      database.ExecuteSQL(SqlString);

      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Build the SQL statement
      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Execute the query
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);

     //Reset List control if there is any data
      ResetListControl();
     //populate Grids
      ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);
     //Column width and heading
      m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
      m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
      m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
      m_listCtrl.SetColumnWidth(0, 120);
      m_listCtrl.SetColumnWidth(1, 200);
      m_listCtrl.SetColumnWidth(2, 200);

     //Loop through each record
      while (!recset.IsEOF()) {
        //Copy each column into a variable
         recset.GetFieldValue(L"ID",strID);
         recset.GetFieldValue(L"Name",strName);
         recset.GetFieldValue(L"Age", strAge);

        //Insert values into the list control
         iRec = m_listCtrl.InsertItem(0,strID,0);
         m_listCtrl.SetItemText(0,1,strName);
         m_listCtrl.SetItemText(0, 2, strAge);

        //goto next record
         recset.MoveNext();
      }
     //Close the database
      database.Close();
   }CATCH(CDBException, e) {
     //If a database exception occured, show error msg
      AfxMessageBox(L"Database error: " + e→m_strError);
   }
   END_CATCH;
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

レコードの取得

  • ステップ4 *-読み取りボタンを押して、データベース操作を実行します。 Employeesテーブルを取得します。

レコードの更新

MFC-シリアル化

  • シリアル化*は、ディスクファイルなどの永続的なストレージメディアとの間でオブジェクトを読み書きするプロセスです。 シリアル化は、プログラムの実行中または実行後に構造化データ(C ++クラスや構造など)の状態を維持することが望ましい状況に最適です。

ファイル処理を実行する場合、値は通常、プリミティブ型(char、short、int、float、またはdouble)です。 同様に、一度に1つずつ、多くの値を個別に保存できます。 この手法には、クラスから(変数として)作成されたオブジェクトは含まれません。

MFCライブラリは、シリアル化を高度にサポートしています。 これは、Serialize()メンバー関数を備えたほとんどのMFCクラスの祖先であるCObjectクラスで始まります。

新しいMFCプロジェクトを作成して、簡単な例を見てみましょう。

  • ステップ1 *-TODO行を削除し、次のスナップショットに示すようにダイアログボックスを設計します。

TODO行の削除

  • ステップ2 *-すべての編集コントロールの値変数を追加します。 前述のEmp IDとAgeの場合、値の型は次のスナップショットに示すように整数です。

シリアル化変数の追加

  • ステップ3 *-両方のボタンにイベントハンドラーを追加します。
  • ステップ4 *-シリアル化する必要がある単純なEmployeeクラスを追加しましょう。 ヘッダーファイルのEmployeeクラスの宣言は次のとおりです。
class CEmployee : public CObject {
   public:
      int empID;
      CString empName;
      int age;
      CEmployee(void);
      ~CEmployee(void);
   private:

   public:
      void Serialize(CArchive& ar);
      DECLARE_SERIAL(CEmployee);
};

ステップ5 *-ソース( .cpp)ファイルのEmployeeクラスの定義です。

IMPLEMENT_SERIAL(CEmployee, CObject, 0)
CEmployee::CEmployee(void) {

}

CEmployee::~CEmployee(void) {

}

void CEmployee::Serialize(CArchive& ar) {
   CObject::Serialize(ar);

   if (ar.IsStoring())
      ar << empID << empName << age;
   else
      ar >> empID >> empName >> age;
}
  • ステップ6 *-保存ボタンイベントハンドラーの実装です。
void CMFCSerializationDlg::OnBnClickedButtonSave() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CEmployee employee;
   CFile file;
   file.Open(L"EmployeeInfo.hse", CFile::modeCreate | CFile::modeWrite);
   CArchive ar(&file, CArchive::store);
   employee.empID = m_id;
   employee.empName = m_strName;
   employee.age = m_age;
   employee.Serialize(ar);
   ar.Close();
}
  • ステップ7 *-Openボタンイベントハンドラーの実装です。
void CMFCSerializationDlg::OnBnClickedButtonOpen() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CFile file;

   file.Open(L"EmployeeInfo.hse", CFile::modeRead);
   CArchive ar(&file, CArchive::load);
   CEmployee employee;

   employee.Serialize(ar);

   m_id = employee.empID;
   m_strName = employee.empName;
   m_age = employee.age;
   ar.Close();
   file.Close();

   UpdateData(FALSE);
}
  • ステップ8 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

シリアル化結果

  • ステップ9 *-すべてのフィールドに情報を入力し、[保存]をクリックしてこのプログラムを閉じます。

シリアル化挿入情報

  • ステップ10 *-データを保存します。 アプリケーションを再度実行し、開くをクリックします。 従業員情報をロードします。

シリアル化保存情報

MFC-マルチスレッド

Microsoft Foundation Class(MFC)ライブラリは、マルチスレッドアプリケーションのサポートを提供します。 スレッドは、プロセス内の実行のパスです。 メモ帳を起動すると、オペレーティングシステムによってプロセスが作成され、そのプロセスのプライマリスレッドの実行が開始されます。 このスレッドが終了すると、プロセスも終了します。

必要に応じて、アプリケーションに追加のスレッドを作成できます。 MFCアプリケーションのすべてのスレッドは、CWinThreadオブジェクトによって表されます。 ほとんどの場合、これらのオブジェクトを明示的に作成する必要はありません。代わりに、フレームワークヘルパー関数AfxBeginThreadを呼び出して、CWinThreadオブジェクトを作成します。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

ステップ1 *-静的コントロールのキャプションとIDをそれぞれ[スレッドの開始]ボタン*と *IDC_STATIC_TEXT に変更します。

  • ステップ2 *-2つのボタンをドラッグし、これらのボタンのクリックイベントハンドラーを追加します。

スレッド開始ボタン

  • ステップ3 *-静的テキストコントロールのコントロール変数を追加します。
  • ステップ4 *-CMFCMultithreadingDlg.cppファイルの先頭に次の3つのグローバル変数を追加します。
int currValue;
int maxValue;
BOOL stopNow;
  • ステップ5 *-CMFCMultithreadingDlgクラスにWM_TIMERメッセージを追加します。

OnTimer()の実装は次のとおりです

void CMFCMultithreadingDlg::OnTimer(UINT_PTR nIDEvent) {
  //TODO: Add your message handler code here and/or call default
   CString sStatusMsg;
   sStatusMsg.Format(L"Running: %d", currValue);
   m_ctrlStatus.SetWindowText(sStatusMsg);

   CDialogEx::OnTimer(nIDEvent);
}
  • ステップ6 *-CMFCMultithreadingDlgクラスのAfxBeginThreadで使用するサンプル関数を追加します。
UINT MyThreadProc(LPVOID Param) {
   while (!stopNow && (currValue < maxValue)) {
      currValue++;
      Sleep(50);    //would do some work here
   }

   return TRUE;
}
  • ステップ7 *-スレッドを開始する[スレッドの開始]ボタンのイベントハンドラーの実装です。
void CMFCMultithreadingDlg::OnBnClickedButtonStart() {
  //TODO: Add your control notification handler code here
   currValue = 0;
   maxValue = 5000;
   stopNow = 0;
   m_ctrlStatus.SetWindowText(L"Starting...");
   SetTimer(1234, 333, 0);//3 times per second

   AfxBeginThread(MyThreadProc, 0);//<<== START THE THREAD
}
  • ステップ8 *-スレッドを停止する[スレッドの停止]ボタンのイベントハンドラーの実装です。
void CMFCMultithreadingDlg::OnBnClickedButtonStop() {

  //TODO: Add your control notification handler code here
   stopNow = TRUE;
   KillTimer(1234);
   m_ctrlStatus.SetWindowText(L"Stopped");
}
  • ステップ9 *-完全なソースファイルです。
//MFCMultithreadingDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCMultithreading.h"
#include "MFCMultithreadingDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//CMFCMultithreadingDlg dialog

int currValue;
int maxValue;
BOOL stopNow;

CMFCMultithreadingDlg::CMFCMultithreadingDlg(CWnd* pParent/* = NULL*/)
   : CDialogEx(IDD_MFCMULTITHREADING_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME);
}
void CMFCMultithreadingDlg::DoDataExchange(CDataExchange* pDX) {
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_STATIC_TEXT, m_ctrlStatus);
}

BEGIN_MESSAGE_MAP(CMFCMultithreadingDlg, CDialogEx)
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   ON_BN_CLICKED(IDC_BUTTON_START,
      &CMFCMultithreadingDlg::OnBnClickedButtonStart)
   ON_WM_TIMER()
   ON_BN_CLICKED(IDC_BUTTON_STOP,
      &CMFCMultithreadingDlg::OnBnClickedButtonStop)
END_MESSAGE_MAP()

//CMFCMultithreadingDlg message handlers

BOOL CMFCMultithreadingDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);       //Set big icon
   SetIcon(m_hIcon, FALSE);      //Set small icon

  //TODO: Add extra initialization here

   return TRUE;//return TRUE unless you set the focus to a control
}

//If you add a minimize button to your dialog, you will need the code below
//to draw the icon. For MFC applications using the document/view model,
//this is automatically done for you by the framework.

void CMFCMultithreadingDlg::OnPaint() {
   if (IsIconic()) {
      CPaintDC dc(this);//device context for painting
      SendMessage(WM_ICONERASEBKGND,
         reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

     //Center icon in client rectangle
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
      GetClientRect(&rect);
      int x = (rect.Width() - cxIcon + 1)/2;
      int y = (rect.Height() - cyIcon + 1)/2;

     //Draw the icon
      dc.DrawIcon(x, y, m_hIcon);
   }else {
      CDialogEx::OnPaint();
   }
}
//The system calls this function to obtain the cursor to display while the user drags
//the minimized window.
HCURSOR CMFCMultithreadingDlg::OnQueryDragIcon() {
   return static_cast<HCURSOR>(m_hIcon);
}

UINT/*CThreadDlg::*/MyThreadProc(LPVOID Param)//Sample function for using in
AfxBeginThread {
   while (!stopNow && (currValue < maxValue)) {
      currValue++;
      Sleep(50);//would do some work here
   }
   return TRUE;
}
void CMFCMultithreadingDlg::OnBnClickedButtonStart() {
  //TODO: Add your control notification handler code here
   currValue = 0;
   maxValue = 5000;
   stopNow = 0;
   m_ctrlStatus.SetWindowText(L"Starting...");
   SetTimer(1234, 333, 0);//3 times per second

   AfxBeginThread(MyThreadProc, 0);//<<== START THE THREAD
}

void CMFCMultithreadingDlg::OnTimer(UINT_PTR nIDEvent) {
  //TODO: Add your message handler code here and/or call default
   CString sStatusMsg;
   sStatusMsg.Format(L"Running: %d", currValue);
   m_ctrlStatus.SetWindowText(sStatusMsg);

   CDialogEx::OnTimer(nIDEvent);
}

void CMFCMultithreadingDlg::OnBnClickedButtonStop() {
  //TODO: Add your control notification handler code here
   stopNow = TRUE;
   KillTimer(1234);
   m_ctrlStatus.SetWindowText(L"Stopped");
}
  • ステップ10 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

マルチスレッド

  • ステップ11 *-[スレッドの開始]ボタンをクリックします。

スレッドの開始

  • ステップ12 *-[スレッドの停止]ボタンをクリックします。 スレッドを停止します。

スレッドの停止

MFC-インターネットプログラミング

Microsoftは、クライアントアプリケーションとサーバーアプリケーションの両方をプログラミングするための多くのAPIを提供しています。 多くの新しいアプリケーションがインターネット用に作成されており、テクノロジ、ブラウザ機能、およびセキュリティオプションが変更されると、新しい種類のアプリケーションが作成されます。 カスタムアプリケーションは、インターネットで情報を取得してデータを提供できます。

MFCは、Windows Socketsでネットワーク通信プログラムを作成するためのクラス CSocket を提供します。

以下は、CSocketクラスのメソッドのリストです。

Sr.No. Name & Description
1

Attach

SOCKETハンドルをCSocketオブジェクトにアタッチします。

2

CancelBlockingCall

現在進行中のブロッキングコールをキャンセルします。

3

Create

ソケットを作成します。

4

FromHandle

SOCKETハンドルを指定すると、CSocketオブジェクトへのポインターを返します。

5

IsBlocking

ブロッキングコールが進行中かどうかを判別します。

MFS SDIアプリケーションを作成して、簡単な例を見てみましょう。

MFCServer

  • ステップ1 *-名前フィールドにMFCServerを入力し、[OK]をクリックします。

MFCServer

  • ステップ2 *-[高度な機能]タブで、Windowsソケットオプションを確認します。
  • ステップ3 *-プロジェクトが作成されたら、新しいMFCクラスCServerSocketを追加します。

MFCServer

  • ステップ4 *-ベースクラスとしてCSocketを選択し、[完了]をクリックします。
  • ステップ5 *-MFCクラスCReceivingSocketを追加します。

MFCServer

  • ステップ6 *-CRecevingSocketはクライアントから着信メッセージを受信します。

CMFCServerAppでは、ヘッダーファイルには次のファイルが含まれています-

#include "ServerSocket.h"
#include "MFCServerView.h"
  • ステップ7 *-CMFCServerAppクラスに次の2つのクラス変数を追加します。
CServerSocket m_serverSocket;
CMFCServerView m_pServerView;
*ステップ8 *-CMFCServerApp
InitInstance()メソッドで、ソケットを作成してポートを指定し、次に示すようにListenメソッドを呼び出します。
m_serverSocket.Create(6666);
m_serverSocket.Listen();
  • ステップ9 *-CMFCServerViewヘッダーファイルに次のヘッダーファイルを含めます。
#include "MFCServerDoc.h"
  • ステップ10 *-SocketクラスのOnAccept関数をオーバーライドします。

MFCServer

  • ステップ11 *-クラスビューでCServerSocketを選択し、[プロパティ]ウィンドウで強調表示されたアイコンを選択します。 次に、OnAcceptを追加します。 OnAccept関数の実装は次のとおりです。
void CServerSocket::OnAccept(int nErrorCode) {

  //TODO: Add your specialized code here and/or call the base class
   AfxMessageBox(L"Connection accepted");
   CSocket::OnAccept(nErrorCode);
}
  • ステップ12 *-OnReceive()関数を追加します。
void CServerSocket::OnReceive(int nErrorCode) {

  //TODO: Add your specialized code here and/or call the base class
   AfxMessageBox(L"Data Received");
   CSocket::OnReceive(nErrorCode);
}
  • ステップ13 *-CReceivingSocketクラスにOnReceive()関数を追加します。

ソリューションエクスプローラーでCMFCServerViewクラスを右クリックし、[追加]→[関数の追加]を選択します。

MFCServer

  • ステップ14 *-上記の情報を入力し、完了をクリックします。
  • ステップ15 *-CMFCServerViewヘッダーファイルに次のCStringArray変数を追加します。
CStringArray m_msgArray;
  • ステップ16 *-AddMsg()関数の実装です。
void CMFCServerView::AddMsg(CString message) {

   m_msgArray.Add(message);
   Invalidate();
}
  • ステップ17 *-次のコードに示すようにコンストラクタを更新します。
CMFCServerView::CMFCServerView() {

   ((CMFCServerApp*)AfxGetApp()) -> m_pServerView = this;
}
  • ステップ18 *-メッセージを表示するOnDraw()関数の実装です。
void CMFCServerView::OnDraw(CDC* pDC) {

   int y = 100;
   for (int i = 0; m_msgArray.GetSize(); i++) {

      pDC->TextOut(100, y, m_msgArray.GetAt(i));
      y += 50;
   }
   CMFCServerDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ19 *-サーバー側はこれで完了です。 クライアントからメッセージを受信します。

クライアント側アプリケーションを作成する

  • ステップ1 *-クライアント側アプリケーション用の新しいMFCダイアログベースのアプリケーションを作成しましょう。

クライアント側

クライアント側

  • ステップ2 *-[高度な機能]タブで、上記のようにWindowsソケットオプションをチェックします。
  • ステップ3 *-プロジェクトが作成されたら、次のスナップショットに示すようにダイアログボックスを設計します。

クライアント側

  • ステップ4 *-[接続]ボタンと[送信]ボタンのイベントハンドラーを追加します。
  • ステップ5 *-3つの編集コントロールすべてに値変数を追加します。 ポート編集制御の場合、変数タイプUINTを選択します。

クライアント側

  • ステップ6 *-メッセージを接続および送信するためのMFCクラスを追加します。

クライアント側

  • ステップ7 *-CClientSocketクラスのヘッダーファイルをヘッダーファイルCMFCClientDemoAppクラスに含め、クラス変数を追加します。 同様に、CMFCClientDemoDlgヘッダーファイルにもクラス変数を追加します。
CClientSocket m_clientSocket;
  • ステップ8 *-接続ボタンイベントハンドラーの実装です。
void CMFCClientDemoDlg::OnBnClickedButtonConnect() {

  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   m_clientSocket.Create();
   if (m_clientSocket.Connect(m_ipAddress, m_port)) {
      AfxMessageBox(L"Connection Successfull");
   }else {
      AfxMessageBox(L"Connection Failed");
   }
   DWORD error = GetLastError();
}
  • ステップ9 *-送信ボタンイベントハンドラーの実装です。
void CMFCClientDemoDlg::OnBnClickedButtonSend() {

  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_clientSocket.Send(m_message.GetBuffer(m_message.GetLength()), m_message.GetLength())) {

   }else {
      AfxMessageBox(L"Failed to send message");
   }
}
  • ステップ10 *-最初にサーバーアプリケーションを実行し、次にクライアントアプリケーションを実行します。 ローカルホストのIPとポートを入力し、[接続]をクリックします。

クライアント側

  • ステップ11 *-次のスナップショットに示すように、サーバー側にメッセージが表示されます。

クライアント側

MFC-GDI

Windowsは、デバイスコンテキストで使用するさまざまな描画ツールを提供します。 線を描くペン、内部を塗りつぶすブラシ、テキストを描くフォントを提供します。 MFCは、Windowsの描画ツールに相当するグラフィックオブジェクトクラスを提供します。

デバイスコンテキストは、ディスプレイやプリンターなどのデバイスの描画属性に関する情報を含むWindowsデータ構造です。 すべての描画呼び出しは、デバイスコンテキストオブジェクトを介して行われます。このオブジェクトは、線、図形、およびテキストを描画するためのWindows APIをカプセル化します。

デバイスコンテキストにより、Windowsでデバイスに依存しない描画が可能になります。 デバイスコンテキストを使用して、画面、プリンター、またはメタファイルに描画できます。

*CDC* は、MFCで描画する最も基本的なクラスです。 CDCオブジェクトは、基本的な描画手順を実行するメンバー関数と、ウィンドウのクライアント領域に関連付けられた表示コンテキストを操作するためのメンバーを提供します。

以下にCDCクラスのメソッドのリストを示します。

Sr. No. Name & Description
1

AbortDoc

現在の印刷ジョブを終了し、 StartDoc メンバー関数の最後の呼び出し以降にアプリケーションがデバイスに書き込んだものをすべて消去します。

2

AbortPath

デバイスコンテキスト内のすべてのパスを閉じて破棄します。

3

AddMetaFileComment

コメントをバッファから指定された拡張形式のメタファイルにコピーします。

4

AlphaBlend

透明または半透明のピクセルを持つビットマップを表示します。

5

AngleArc

線分と円弧を描画し、現在の位置を円弧の終点に移動します。

6

Arc

楕円弧を描きます。

7

ArcTo

楕円弧を描きます。 この関数はArcに似ていますが、現在の位置が更新される点が異なります。

8

Attach

このCDCオブジェクトにWindowsデバイスコンテキストをアタッチします。

9

BeginPath

デバイスコンテキストでパスブラケットを開きます。

10

BitBlt

指定されたデバイスコンテキストからビットマップをコピーします。

11

Chord

コード(楕円と線分が交差する閉じた図形)を描画します。

12

CloseFigure

パス内の開いている図形を閉じます。

13

CreateCompatibleDC

別のデバイスコンテキストと互換性のあるメモリデバイスコンテキストを作成します。 メモリ内の画像を準備するために使用できます。

14

CreateDC

特定のデバイスのデバイスコンテキストを作成します。

15

CreateIC

特定のデバイスの情報コンテキストを作成します。 これにより、デバイスコンテキストを作成せずに、デバイスに関する情報をすばやく取得できます。

16

DeleteDC

このCDCオブジェクトに関連付けられているWindowsデバイスコンテキストを削除します。

17

DeleteTempMap

FromHandleによって作成された一時CDCオブジェクトを削除するために、 CWinApp アイドル時間ハンドラーによって呼び出されます。 また、デバイスコンテキストをデタッチします。

18

Detach

このCDCオブジェクトからWindowsデバイスコンテキストをデタッチします。

19

DPtoHIMETRIC

デバイス単位を HIMETRIC 単位に変換します。

20

DPtoLP

デバイスユニットを論理ユニットに変換します。

21

Draw3dRect

3次元の長方形を描画します。

22

DrawDragRect

ドラッグされた長方形を消去して再描画します。

23

DrawEdge

長方形のエッジを描画します。

24

DrawEscape

グラフィックデバイスインターフェイス(GDI)を介して直接利用できないビデオディスプレイの描画機能にアクセスします。

25

DrawFocusRect

フォーカスを示すために使用されるスタイルで長方形を描画します。

26

DrawFrameControl

フレームコントロールを描画します。

27

DrawIcon

アイコンを描画します。

28

DrawState

画像を表示し、視覚効果を適用して状態を示します。

29

DrawText

指定された長方形にフォーマットされたテキストを描画します。

30

DrawTextEx

追加のフォーマットを使用して、指定された長方形にフォーマットされたテキストを描画します。

31

Ellipse

楕円を描画します。

32

EndDoc

StartDocメンバー関数によって開始された印刷ジョブを終了します。

33

EndPage

ページが終了することをデバイスドライバーに通知します。

34

EndPath

パスブラケットを閉じ、デバイスコンテキストへのブラケットで定義されたパスを選択します。

35

EnumObjects

デバイスコンテキストで使用可能なペンとブラシを列挙します。

36

Escape

GDIを介して特定のデバイスから直接利用できない機能にアプリケーションがアクセスできるようにします。 Windowsエスケープ関数へのアクセスも許可します。 アプリケーションによって行われたエスケープ呼び出しは変換され、デバイスドライバーに送信されます。

37

ExcludeClipRect

既存のクリッピング領域から指定された長方形を引いたもので構成される新しいクリッピング領域を作成します。

38

ExcludeUpdateRgn

ウィンドウ内の更新された領域をクリッピング領域から除外することにより、ウィンドウの無効な領域内に描画されないようにします。

39

ExtFloodFill

現在のブラシで領域を塗りつぶします。 FloodFill メンバー関数よりも柔軟性があります。

40

ExtTextOut

現在選択されているフォントを使用して、長方形の領域内に文字列を書き込みます。

41

FillPath

現在のパスで開いている図形を閉じ、現在のブラシとポリゴン塗りつぶしモードを使用してパスの内部を塗りつぶします。

42

FillRect

特定のブラシを使用して、指定された長方形を塗りつぶします。

43

FillRgn

指定したブラシで特定の領域を塗りつぶします。

44

FillSolidRect

長方形を単色で塗りつぶします。

45

FlattenPath

選択したパス内の曲線を現在のデバイスコンテキストに変換し、各曲線を一連の線に変換します。

46

FloodFill

現在のブラシで領域を塗りつぶします。

47

FrameRect

四角形の周囲に境界線を描画します。

48

FrameRgn

ブラシを使用して特定の領域の周りに境界線を描画します。

49

FromHandle

デバイスコンテキストへのハンドルを指定すると、CDCオブジェクトへのポインターを返します。 CDCオブジェクトがハンドルにアタッチされていない場合、一時CDCオブジェクトが作成されてアタッチされます。

50

GetArcDirection

デバイスコンテキストの現在の弧の方向を返します。

51

GetAspectRatioFilter

現在のアスペクト比フィルターの設定を取得します。

52

GetBkColor

現在の背景色を取得します。

53

GetBkMode

バックグラウンドモードを取得します。

54

GetBoundsRect

指定されたデバイスコンテキストの現在の累積された境界四角形を返します。

55

GetBrushOrg

現在のブラシの原点を取得します。

56

GetCharABCWidths

現在のフォントから指定された範囲内の連続した文字の幅を論理単位で取得します。

57

GetCharABCWidthsI

現在のTrueTypeフォントから指定された範囲内の連続するグリフインデックスの幅を論理単位で取得します。

58

GetCharacterPlacement

文字列に関するさまざまなタイプの情報を取得します。

59

GetCharWidth

現在のフォントから指定された範囲内の連続する文字の小数幅を取得します。

60

GetCharWidthI

現在のフォントから指定範囲内の連続するグリフインデックスの幅を論理座標で取得します。

61

GetClipBox

現在のクリッピング境界の周囲の最も狭い境界矩形の寸法を取得します。

62

GetColorAdjustment

デバイスコンテキストの色調整値を取得します。

63

GetCurrentBitmap

現在選択されている CBitmap オブジェクトへのポインターを返します。

64

GetCurrentBrush

現在選択されている CBrush オブジェクトへのポインターを返します。

65

GetCurrentFont

現在選択されている CFont オブジェクトへのポインターを返します。

66

GetCurrentPalette

現在選択されている CPalette オブジェクトへのポインターを返します。

48

GetCurrentPen

現在選択されている CPen オブジェクトへのポインターを返します。

67

GetCurrentPosition

ペンの現在の位置を(論理座標で)取得します。

68

GetDCBrushColor

現在のブラシの色を取得します。

69

GetDCPenColor

現在のペンの色を取得します。

70

GetDeviceCaps

特定のディスプレイデバイスの機能に関するデバイス固有の指定された種類の情報を取得します。

71

GetFontData

スケーラブルフォントファイルからフォントメトリック情報を取得します。 取得する情報は、フォントファイルへのオフセットと返す情報の長さを指定することによって識別されます。

72

GetFontLanguageInfo

指定された表示コンテキストで現在選択されているフォントに関する情報を返します。

73

GetGlyphOutline

現在のフォントのアウトライン文字のアウトライン曲線またはビットマップを取得します。

74

GetGraphicsMode

指定されたデバイスコンテキストの現在のグラフィックモードを取得します。

75

GetHalftoneBrush

ハーフトーンブラシを取得します。

76

GetKerningPairs

指定されたデバイスコンテキストで現在選択されているフォントの文字カーニングペアを取得します。

77

GetLayout

デバイスコンテキスト(DC)のレイアウトを取得します。 レイアウトは、左から右(デフォルト)または右から左(ミラー)のいずれかです。

78

GetMapMode

現在のマッピングモードを取得します。

79

GetMiterLimit

デバイスコンテキストのマイター制限を返します。

80

GetNearestColor

指定したデバイスが表すことができる指定した論理色に最も近い論理色を取得します。

81

GetOutlineTextMetrics

TrueTypeフォントのフォントメトリック情報を取得します。

82

GetOutputCharWidth

出力デバイスコンテキストを使用して、現在のフォントから連続した文字グループの個々の文字の幅を取得します。

83

GetOutputTabbedTextExtent

出力デバイスコンテキストの文字列の幅と高さを計算します。

84

GetOutputTextExtent

現在のフォントを使用して寸法を決定し、出力デバイスコンテキストのテキスト行の幅と高さを計算します。

85

GetOutputTextMetrics

出力デバイスコンテキストから現在のフォントのメトリックを取得します。

86

GetPath

デバイスコンテキストに選択されたパスで見つかった線の終点と曲線の制御点を定義する座標を取得します。

87

GetPixel

指定されたポイントのピクセルのRGBカラー値を取得します。

88

GetPolyFillMode

現在のポリゴン塗りつぶしモードを取得します。

89

GetROP2

現在の描画モードを取得します。

90

GetSafeHdc

出力デバイスコンテキストである m_hDC を返します。

91

GetStretchBltMode

現在のビットマップストレッチモードを取得します。

92

GetTabbedTextExtent

属性デバイスコンテキストの文字列の幅と高さを計算します。

93

GetTextAlign

テキスト配置フラグを取得します。

94

GetTextCharacterExtra

文字間スペースの量の現在の設定を取得します。

95

GetTextColor

現在のテキストの色を取得します。

96

GetTextExtent

現在のフォントを使用して寸法を決定する属性デバイスコンテキスト上のテキスト行の幅と高さを計算します。

97

GetTextExtentExPointI

指定されたスペースに収まる指定された文字列の文字数を取得し、それらの各文字のテキスト範囲で配列を埋めます。

98

GetTextExtentPointI

グリフインデックスの指定された配列の幅と高さを取得します。

99

GetTextFace

現在のフォントの書体名をヌル終了文字列としてバッファにコピーします。

100

GetTextMetrics

属性デバイスコンテキストから現在のフォントのメトリックを取得します。

101

GetViewportExt

ビューポートのx範囲とy範囲を取得します。

102

GetViewportOrg

ビューポートの原点のx座標とy座標を取得します。

103

GetWindow

ディスプレイデバイスコンテキストに関連付けられたウィンドウを返します。

104

GetWindowExt

関連付けられたウィンドウのx範囲とy範囲を取得します。

105

GetWindowOrg

関連付けられたウィンドウの原点のx座標とy座標を取得します。

106

GetWorldTransform

現在のワールド空間からページ空間への変換を取得します。

107

GradientFill

長方形と三角形の構造をグラデーションの色で塗りつぶします。

108

GrayString

指定された場所に淡色表示(グレー表示)されたテキストを描画します。

109

HIMETRICtoDP

HIMETRICユニットをデバイスユニットに変換します。

110

HIMETRICtoLP

HIMETRIC単位を論理単位に変換します。

111

IntersectClipRect

現在の領域と長方形の交点を形成することにより、新しいクリッピング領域を作成します。

112

InvertRect

長方形の内容を反転します。

113

InvertRgn

領域の色を反転します。

114

IsPrinting

デバイスコンテキストが印刷に使用されているかどうかを判断します。

115

LineTo

現在位置からポイントまで(ただし、ポイントは含まない)に線を描画します。

116

LPtoDP

論理ユニットをデバイスユニットに変換します。

117

LPtoHIMETRIC

論理ユニットをHIMETRICユニットに変換します。

118

MaskBlt

指定されたマスクおよびラスター操作を使用して、ソースビットマップとターゲットビットマップのカラーデータを組み合わせます。

119

ModifyWorldTransform

指定されたモードを使用して、デバイスコンテキストのワールド変換を変更します。

120

MoveTo

現在の位置を移動します。

121

OffsetClipRgn

指定されたデバイスのクリッピング領域を移動します。

122

OffsetViewportOrg

現在のビューポートの原点の座標を基準にしてビューポートの原点を変更します。

123

OffsetWindowOrg

現在のウィンドウの原点の座標を基準にしてウィンドウの原点を変更します。

124

PaintRgn

選択したブラシで領域を塗りつぶします。

125

PatBlt

ビットパターンを作成します。

126

Pie

パイ型のくさびを描画します。

127

PlayMetaFile

指定されたデバイスで指定されたメタファイルの内容を再生します。 PlayMetaFileの拡張バージョンは、指定された拡張形式のメタファイルに保存されている画像を表示します。 メタファイルは何度でも再生できます。

128

PlgBlt

ソースデバイスコンテキストの指定された四角形から、指定されたデバイスコンテキストの指定された平行四辺形への色データのビットのビットブロック転送を実行します。

129

PolyBezier

1つ以上のBzierスプラインを描画します。 現在の位置は使用も更新もされません。

130

PolyBezierTo

1つ以上のBzierスプラインを描画し、現在の位置を最後のBzierスプラインの終点に移動します。

131

PolyDraw

一連の線分とベジェスプラインを描画します。 この関数は現在の位置を更新します。

132

Polygon

線で接続された2つ以上のポイント(頂点)で構成されるポリゴンを描画します。

133

Polyline

指定されたポイントを結ぶ線分セットを描画します。

134

PolylineTo

1つ以上の直線を描画し、現在の位置を最後の線の終点に移動します。

135

PolyPolygon

現在のポリゴン塗りつぶしモードを使用して塗りつぶされる2つ以上のポリゴンを作成します。 ポリゴンはばらばらであるか、重なっている場合があります。

136

PolyPolyline

接続された線セグメントの複数のシリーズを描画します。 現在の位置は、この関数では使用も更新もされません。

137

PtVisible

指定されたポイントがクリッピング領域内にあるかどうかを指定します。

138

RealizePalette

現在の論理パレットのパレットエントリをシステムパレットにマップします。

139

Rectangle

現在のペンを使用して四角形を描画し、現在のブラシを使用して四角形を塗りつぶします。

140

RectVisible

指定された長方形の一部がクリッピング領域内にあるかどうかを決定します。

141

ReleaseAttribDC

属性デバイスコンテキスト m_hAttribDC をリリースします。

142

ReleaseOutputDC

出力デバイスコンテキストである m_hDC をリリースします。

143

ResetDC**

m_hAttribDCデバイスコンテキストを更新します。

144

RestoreDC

  • SaveDC* で保存された以前の状態にデバイスコンテキストを復元します。
145

RoundRect

現在のペンを使用して角を丸め、現在のブラシを使用して塗りつぶした長方形を描画します。

146

SaveDC

デバイスコンテキストの現在の状態を保存します。

147

ScaleViewportExt

現在の値を基準にしてビューポート範囲を変更します。

148

ScaleWindowExt

現在の値に関連してウィンドウの範囲を変更します。

149

ScrollDC

ビットの長方形を水平および垂直にスクロールします。

150

SelectClipPath

現在のパスをデバイスコンテキストのクリッピング領域として選択し、指定されたモードを使用して新しい領域を既存のクリッピング領域と組み合わせます。

151

SelectClipRgn

指定されたモードを使用して、指定された領域を現在のクリッピング領域と結合します。

152

SelectObject

ペンなどのGDI描画オブジェクトを選択します。

153

SelectPalette

論理パレットを選択します。

154

SelectStockObject

Windowsが提供する定義済みのストックペン、ブラシ、またはフォントのいずれかを選択します。

155

SetAbortProc

印刷ジョブを中止する必要がある場合にWindowsが呼び出すプログラマー提供のコールバック関数を設定します。

156

SetArcDirection

円弧および長方形の機能に使用される描画方向を設定します。

157

SetAttribDC

属性デバイスコンテキストであるm_hAttribDCを設定します。

158

SetBkColor

現在の背景色を設定します。

159

SetBkMode

バックグラウンドモードを設定します。

160

SetBoundsRect

指定されたデバイスコンテキストの境界矩形情報の蓄積を制御します。

161

SetBrushOrg

デバイスコンテキストに選択された次のブラシの原点を指定します。

162

SetColorAdjustment

指定した値を使用して、デバイスコンテキストの色調整値を設定します。

163

SetDCBrushColor

現在のブラシの色を設定します。

164

SetDCPenColor

現在のペンの色を設定します。

165

SetGraphicsMode

指定したデバイスコンテキストの現在のグラフィックモードを設定します。

166

SetLayout

デバイスコンテキスト(DC)のレイアウトを変更します。

167

SetMapMode

現在のマッピングモードを設定します。

168

SetMapperFlags

フォントマッパーが論理フォントを物理フォントにマップするときに使用するアルゴリズムを変更します。

169

SetMiterLimit

デバイスコンテキストのマイター結合の長さの制限を設定します。

170

SetOutputDC

出力デバイスコンテキストであるm_hDCを設定します。

171

SetPixel

指定されたポイントのピクセルを、指定された色の最も近い近似値に設定します。

172

SetPixelV

指定した座標のピクセルを、指定した色の最も近い近似値に設定します。 SetPixelVSetPixel よりも高速です。これは、実際にペイントされたポイントのカラー値を返す必要がないためです。

173

SetPolyFillMode

ポリゴン塗りつぶしモードを設定します。

175

SetROP2

現在の描画モードを設定します。

176

SetStretchBltMode

ビットマップストレッチモードを設定します。

177

SetTextAlign

テキスト配置フラグを設定します。

178

SetTextCharacterExtra

文字間スペースの量を設定します。

179

SetTextColor

テキストの色を設定します。

180

SetTextJustification

文字列の区切り文字にスペースを追加します。

181

SetViewportExt

ビューポートのx範囲とy範囲を設定します。

182

SetViewportOrg

ビューポートの原点を設定します。

183

SetWindowExt

関連付けられたウィンドウのx範囲とy範囲を設定します。

184

SetWindowOrg

デバイスコンテキストのウィンドウの原点を設定します。

185

SetWorldTransform

現在のワールド空間からページ空間への変換を設定します。

186

StartDoc

新しい印刷ジョブが開始されていることをデバイスドライバーに通知します。

187

StartPage

新しいページが開始されていることをデバイスドライバーに通知します。

188

StretchBlt

ビットマップをソース長方形およびデバイスからターゲット長方形に移動し、必要に応じてビットマップをストレッチまたは圧縮して、ターゲット長方形のサイズに合わせます。

189

StrokeAndFillPath

パス内の開いている図形をすべて閉じ、現在のペンを使用してパスの輪郭を描き、現在のブラシを使用してその内部を塗りつぶします。

190

StrokePath

現在のペンを使用して、指定されたパスをレンダリングします。

191

TabbedTextOut

指定された場所に文字列を書き込み、タブストップ位置の配列で指定された値にタブを展開します。

192

TextOut

現在選択されているフォントを使用して、指定された場所に文字列を書き込みます。

193

TransparentBlt

指定されたソースデバイスコンテキストから宛先デバイスコンテキストに色データのビットブロックを転送し、転送で指定された色を透明にします。

194

UpdateColors

クライアント領域の現在の色をピクセル単位でシステムパレットに一致させることにより、デバイスコンテキストのクライアント領域を更新します。

195

WidenPath

デバイスコンテキストで現在選択されているペンを使用してパスがストロークされた場合に、ペイントされる領域として現在のパスを再定義します。

ステップ1 *- *MFCGDIDemo という名前の新しいMFCベースの単一ドキュメントプロジェクトを作成して、簡単な例を見てみましょう。

ライン

ステップ2 *-プロジェクトが作成されたら、ソリューションエクスプローラーに移動し、ソースファイルフォルダーの下の *MFCGDIDemoView.cpp ファイルをダブルクリックします。

ステップ3 *- CMFCGDIDemoView
OnDraw()*メソッドで以下に示すように線を引きます。
void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->MoveTo(95, 125);
   pDC->LineTo(230, 125);
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ4 *-このアプリケーションを実行します。 次の出力が表示されます。

*ステップ5 *-CDC
MoveTo()メソッドを使用して、行の開始位置を設定します。

LineTo()を使用する場合、プログラムはMoveTo()ポイントからLineTo()エンドまで開始します。

LineTo()の後、MoveTo()を呼び出さず、他のポイント値でLineTo()を再度呼び出すと、プログラムは前のLineTo()から新しいLineTo()ポイントまで線を引きます。

  • ステップ6 *-さまざまな線を描画するには、次のコードに示すようにこのプロパティを使用できます。
void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->MoveTo(95, 125);
   pDC->LineTo(230, 125);
   pDC->LineTo(230, 225);
   pDC->LineTo(95, 325);
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ7 *-このアプリケーションを実行します。 次の出力が表示されます。

ライン

ポリライン

*ポリライン*は一連の接続されたラインです。 行は、POINTまたはCPoint値の配列に格納されます。 ポリラインを描画するには、CDC
Polyline()メソッドを使用します。 ポリラインを描画するには、少なくとも2つのポイントが必要です。 3つ以上のポイントを定義すると、最初のポイントの後の各ラインは、すべてのポイントが含まれるまで、前のポイントから次のポイントまで描画されます。
  • ステップ1 *-簡単な例を見てみましょう。
void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   CPoint Pt[7];
   Pt[0] = CPoint(20, 150);
   Pt[1] = CPoint(180, 150);
   Pt[2] = CPoint(180, 20);
   pDC−Polyline(Pt, 3);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ2 *-このアプリケーションを実行すると、次の出力が表示されます。

ポリライン

長方形

*長方形*は、4つの直角を構成する4つの辺で構成される幾何学的図形です。 線と同様に、長方形を描くには、開始位置と終了位置を定義する必要があります。 長方形を描くには、CDC
Rectangle()メソッドを使用できます。
  • ステップ1 *-簡単な例を見てみましょう。
void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->Rectangle(15, 15, 250, 160);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ2 *-このアプリケーションを実行すると、次の出力が表示されます。

四角形

四角

  • 正方形*は、4つの直角を構成する4つの辺で構成される幾何学的図形ですが、各辺の長さは等しくなければなりません。

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->Rectangle(15, 15, 250, 250);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}

このアプリケーションを実行すると、次の出力が表示されます。

正方形

Pies

*パイ*は、楕円の中心からそれぞれ片側に伸びる2本の線で区切られた楕円の一部です。 パイを描画するには、以下に示すようにCDC
Pie()メソッドを使用できます-

BOOL Pie(int x1、int y1、int x2、int y2、int x3、int y3、int x4、int y4);

  • (x1、y1)ポイントは、円を表す楕円が収まる長方形の左上隅を決定します。 (x2、y2)ポイントは、長方形の右下隅です。

パイ

  • (x3、y3)ポイントは、デフォルトの反時計回り方向のパイの開始コーナーを指定します。
  • (x4、y4)ポイントは、パイの終点を特定します。

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->Pie(40, 20, 226, 144, 155, 32, 202, 115);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ2 *-このアプリケーションを実行すると、次の出力が表示されます。

パイ

Arcs

円弧は楕円の一部またはセグメントです。つまり、円弧は完全な楕円ではありません。 円弧を描くには、CDC
Arc()メソッドを使用できます。

BOOL Arc(int x1、int y1、int x2、int y2、int x3、int y3、int x4、int y4);

アーク

CDCクラスにはSetArcDirection()メソッドが装備されています。

ここに構文があります-

int SetArcDirection(int nArcDirection)
Sr.No. Value & Orientation
1

AD_CLOCKWISE

図は時計回りに描かれます

2

AD_COUNTERCLOCKWISE

図は反時計回りに描かれます

  • ステップ1 *-簡単な例を見てみましょう。
void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->SetArcDirection(AD_COUNTERCLOCKWISE);
   pDC->Arc(20, 20, 226, 144, 202, 115, 105, 32);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}
  • ステップ2 *-このアプリケーションを実行すると、次の出力が表示されます。

アーク

和音

これまでに描いた円弧は、始点と終点を持つ線で構成されているため、開いた図形と見なされます(円や長方形とは異なります)。 *コード*は、両端が直線で接続されている円弧です。

コード

コードを描画するには、CDC
Chord()メソッドを使用できます。

BOOL Chord(int x1、int y1、int x2、int y2、int x3、int y3、int x4、int y4);

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->SetArcDirection(AD_CLOCKWISE);
   pDC->Chord(20, 20, 226, 144, 202, 115, 105, 32);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}

上記のアプリケーションを実行すると、次の出力が表示されます。

コード

この例の弧の方向は時計回りに設定されています。

  • 色*は、オブジェクトの審美的な外観を向上させる最も基本的なオブジェクトの1つです。 色は、視覚的側面の一部を変更するためにオブジェクトに追加される非空間オブジェクトです。 MFCライブラリは、Win32 APIと組み合わせて、色のさまざまな側面を活用するために使用できるさまざまなアクションを提供します。

RGBマクロは関数のように動作し、コンマで区切られた3つの数値を渡すことができます。 次のコードに示すように、各値は0〜255の間でなければなりません。

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   COLORREF color = RGB(239, 15, 225);
}

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   COLORREF color = RGB(239, 15, 225);
   pDC->SetTextColor(color);
   pDC->TextOut(100, 80, L"MFC GDI Tutorial", 16);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}

このアプリケーションを実行すると、次の出力が表示されます。

フォント

*CFont* は、Windowsグラフィックデバイスインターフェイス(GDI)フォントをカプセル化し、フォントを操作するためのメンバー関数を提供します。 CFontオブジェクトを使用するには、CFontオブジェクトを作成し、それにWindowsフォントを添付してから、オブジェクトのメンバー関数を使用してフォントを操作します。

____これはCFontクラスのメソッドのリストです。

Sr.No. Name & Description
1

CreateFont

指定された特性でCFontを初期化します。

2

CreateFontIndirect

  • LOGFONT* 構造で指定された特性を使用してCFontオブジェクトを初期化します。
3

CreatePointFont

10分の1ポイントで測定された指定された高さ、および書体でCFontを初期化します。

4

CreatePointFontIndirect

  • CreateFontIndirect* と同じですが、フォントの高さは論理単位ではなく10分の1ポイントで測定されます。
5

FromHandle

Windows HFONT を指定すると、CFontオブジェクトへのポインターを返します。

6

GetLogFont

LOGFONTに、CFontオブジェクトに関連付けられた論理フォントに関する情報を入力します。

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC *pDC) {
   CFont font;
   font.CreatePointFont(920, L"Garamond");
   CFont* pFont = pDC->SelectObject(&font);
   COLORREF color = RGB(239, 15, 225);
   pDC->SetTextColor(color);
   pDC->TextOut(100, 80, L"MFC GDI Tutorial", 16);
   pDC->SelectObject(pFont);
   font.DeleteObject();

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
   return;

  //TODO: add draw code for native data here
}

上記のアプリケーションを実行すると、次の出力が表示されます。

フォント

Pens

ペン*は、デバイスコンテキストに線と曲線を描くために使用するツールです。 グラフィックプログラミングでは、ペンを使用して、長方形や多角形などの幾何学的な閉じた形状の境界線を描画します。 Microsoft Windowsは、 *cosmeticgeometric の2種類のペンを考慮します。

ペンは、1ピクセル以下の固定幅の単純な線のみを描画するために使用できる場合、化粧品と呼ばれます。 ペンは、異なる幅とさまざまな端を想定できる幾何学的です。 MFCは、Windowsグラフィックデバイスインターフェイス(GDI)ペンをカプセル化するクラス CPen を提供します。

____これはCPenクラスのメソッドのリストです。

Sr.No. Name & Description
1

CreatePen

指定されたスタイル、幅、およびブラシ属性で論理的な化粧または幾何学的なペンを作成し、それをCPenオブジェクトにアタッチします。

2

CreatePenIndirect

LOGPEN構造体で指定されたスタイル、幅、色でペンを作成し、CPenオブジェクトに添付します。

3

FromHandle

Windows HPEN を指定すると、CPenオブジェクトへのポインターを返します。

4

GetExtLogPen

EXTLOGPENの基礎となる構造を取得します。

5

GetLogPen

LOGPENの基本構造を取得します。

____ここでペンの異なるスタイル値

Sr.No. *Name & Description *
1
  • PS_SOLID*

連続した実線。

2

PS_DASH

破線の中断のある連続線。

3

PS_DOT

1ピクセルおきにドットが途切れる線。

4

PS_DASHDOT

交互の破線と点の組み合わせ。

5

PS_DASHDOTDOT

ダッシュと二重点線の中断の組み合わせ。

6

PS_NULL

目に見える線はありません。

7

PS_INSIDEFRAME

閉じた形状の境界線のすぐ内側に描かれた線。

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   CPen pen;
   pen.CreatePen(PS_DASHDOTDOT, 1, RGB(160, 75, 90));
   pDC->SelectObject(&pen);
   pDC->Rectangle(25, 35, 250, 125);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}

上記のアプリケーションを実行すると、次の出力が表示されます。

ペン

ブラシ

ブラシ*は、閉じた形状または線の内部を塗りつぶすために使用される描画ツールです。 ブラシは、ペンキのバケツを拾ってどこかに注ぐような動作をします。 MFCは、Windowsグラフィックデバイスインターフェイス(GDI)ブラシをカプセル化するクラス *CBrush を提供します。

____これは、CBrushクラスのメソッドのリストです。

Sr.NO. Name & Description
1

CreateBrushIndirect

LOGBRUSH構造体で指定されたスタイル、色、およびパターンでブラシを初期化します。

2

CreateDIBPatternBrush

デバイスに依存しないビットマップ(DIB)で指定されたパターンでブラシを初期化します。

3

CreateHatchBrush

指定されたハッチングパターンと色でブラシを初期化します。

4

CreatePatternBrush

ビットマップで指定されたパターンでブラシを初期化します。

5

CreateSolidBrush

指定した単色でブラシを初期化します。

6

CreateSysColorBrush

デフォルトのシステムカラーであるブラシを作成します。

7

FromHandle

Windows HBRUSHオブジェクトへのハンドルを指定すると、CBrushオブジェクトへのポインターを返します。

8

GetLogBrush

LOGBRUSH構造体を取得します。

簡単な例を見てみましょう。

void CMFCGDIDemoView::OnDraw(CDC *pDC) {
   CBrush brush(RGB(100, 150, 200));
   CBrush* pBrush = pDC->SelectObject(&brush);
   pDC->Rectangle(25, 35, 250, 125);
   pDC->SelectObject(pBrush);

   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

  //TODO: add draw code for native data here
}

このアプリケーションを実行すると、次の出力が表示されます。

ブラシ

MFC-ライブラリ

  • ライブラリ*は、これらの関数、クラス、またはリソースがどのように作成されたか、またはどのように機能するかを知る必要なく、既に実装されたエンティティを必要とするプログラムで利用できる関数、クラス、またはその他のリソースのグループです。 ライブラリにより、プログラマーは関数、クラス、リソースなどを簡単に使用できます。 別の個人または会社によって作成され、この外部ソースが信頼性が高く効率的であると信頼しています。 ライブラリに関連するいくつかのユニークな機能は-
  • ライブラリは作成され、通常の通常のプログラムのように機能し、関数または他のリソースを使用して、他のプログラムと通信します。
  • ライブラリには、その機能を実装するために、他のプログラムが機能を完了するために必要な機能が含まれています。
  • 同時に、ライブラリは他のプログラムが必要としない機能を使用する場合があります。
  • ライブラリを使用するプログラムは、ライブラリのクライアントとも呼ばれます。

ライブラリに作成または含める関数には2つのタイプがあります-

  • 内部関数は、ライブラリ自体によってのみ使用されるものであり、ライブラリのクライアントはこれらの関数にアクセスする必要はありません。
  • 外部関数は、ライブラリのクライアントがアクセスできる関数です。

プログラムで扱うライブラリには、大きく2つのカテゴリがあります-

  • 静的ライブラリ
  • 動的ライブラリ

静的ライブラリ

  • 静的ライブラリ*は、外部プログラムがその機能を補完するために使用できる関数、クラス、またはリソースを含むファイルです。 ライブラリを使用するには、プログラマはライブラリへのリンクを作成する必要があります。 プロジェクトは、コンソールアプリケーション、Win32またはMFCアプリケーションにすることができます。 ライブラリファイルの拡張子はlibです。
  • ステップ1 *-新しいWin32プロジェクトを作成して、静的ライブラリの簡単な例を見てみましょう。

静的ライブラリ

  • ステップ2 *-[アプリケーションウィザード]ダイアログボックスで、[静的ライブラリ]オプションを選択します。

静的ライブラリ

  • ステップ3 *-[完了]をクリックして続行します。

静的ライブラリ

  • ステップ4 *-ソリューションエクスプローラーでプロジェクトを右クリックし、[追加]→[新しいアイテム]メニューオプションからヘッダーファイルを追加します。

静的ライブラリ

  • ステップ5 *-[名前]フィールドにCalculator.hと入力し、[追加]をクリックします。

ヘッダーファイルに次のコードを追加します-

#pragma once
#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_
double Min(const double *Numbers, const int Count);
double Max(const double *Numbers, const int Count);
double Sum(const double *Numbers, const int Count);
double Average(const double *Numbers, const int Count);
long GreatestCommonDivisor(long Nbr1, long Nbr2);
#endif//_CALCULATOR_H_

ステップ6 *-プロジェクトにソース( .cpp)ファイルを追加します。

静的ライブラリ

  • ステップ7 *-[名前]フィールドにCalculator.cppと入力し、[追加]をクリックします。
  • ステップ8 *- *.cppファイルに次のコードを追加します-
#include "StdAfx.h"
#include "Calculator.h"
double Min(const double* Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total) {
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
       S += Nbr[i];
   avg = S/Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}
  • ステップ9 *-[ビルド]→[MFCLibのビルド]をクリックして、メインメニューからこのライブラリをビルドします。

静的ライブラリ

  • ステップ10 *-ライブラリが正常に構築されると、上記のメッセージが表示されます。
  • ステップ11 *-ライブラリからこれらの関数を使用するには、[ファイル]→[新規]→[プロジェクト]に基づく別のMFCダイアログアプリケーションを追加します。

静的ライブラリ

ステップ12 *-次のスナップショットに示すように、MFCLib \ Debugフォルダーに移動し、ヘッダーファイルと .libファイルをMFCLibTestプロジェクトにコピーします。

静的ライブラリ

  • ステップ13 *-ライブラリを現在のプロジェクトに追加するには、メインメニューで[プロジェクト]→[既存項目の追加]をクリックし、MFCLib.libを選択します。
  • ステップ14 *-次のスナップショットに示すようにダイアログボックスを設計します。

静的ライブラリ

  • ステップ15 *-値タイプがdoubleの両方の編集コントロールに値変数を追加します。

静的ライブラリ

  • ステップ16 *-ダイアログボックスの最後にある静的テキストコントロールの値変数を追加します。

静的ライブラリ

  • ステップ17 *-[計算]ボタンのイベントハンドラーを追加します。

ライブラリから機能を追加するには、ヘッダーファイルをCMFCLibTestDlg.cppファイルに含める必要があります。

#include "stdafx.h"
#include "MFCLibTest.h"
#include "MFCLibTestDlg.h"
#include "afxdialogex.h"
#include "Calculator.h"
  • ステップ18 *-ボタンイベントハンドラの実装です。
void CMFCLibTestDlg::OnBnClickedButtonCal() {
  //TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);

   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);

   UpdateData(FALSE);
}
  • ステップ19 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

静的ライブラリ

  • ステップ20 *-編集フィールドに2つの値を入力し、[計算]をクリックします。 ライブラリから計算した後、結果が表示されます。

静的ライブラリ

ダイナミックライブラリ

Win32 DLLは、Microsoft Windowsコンピューターで実行されるプログラムで使用できるライブラリです。 通常のライブラリとして、ファイルにグループ化された関数や他のリソースで構成されます。

DLLの略語は、ダイナミックリンクライブラリの略です。 つまり、静的ライブラリとは対照的に、DLLを使用すると、他のアプリケーションをこのタイプのライブラリにいつどのようにリンクするかをプログラマが決定できます。

たとえば、DLLを使用すると、さまざまなアプリケーションで必要に応じてライブラリを使用できます。 実際、異なるプログラミング環境で作成されたアプリケーションは、特定のDLLに保存されている関数またはリソースを使用できます。 このため、アプリケーションはライブラリに動的にリンクします。

  • ステップ1 *-新しいWin32プロジェクトを作成して、簡単な例を見てみましょう。

動的ライブラリ

  • ステップ2 *-[アプリケーションの種類]セクションで、[DLL]ラジオボタンをクリックします。

動的ライブラリ

  • ステップ3 *-[完了]をクリックして続行します。
  • ステップ4 *-MFCDynamicLib.cppファイルに次の関数を追加し、使用してその定義を公開します-
extern "C" _declspec(dllexport)
  • ステップ5 *-DLLの外部でアクセスされる各関数に_declspec(dllexport)修飾子を使用します。
//MFCDynamicLib.cpp : Defines the exported functions for the DLL application.//

#include "stdafx.h"

extern "C" _declspec(dllexport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total){
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   avg = S/Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}
  • ステップ6 *-DLLを作成するには、メインメニューで、メインメニューから[ビルド]> [MFCDynamicLibのビルド]をクリックします。

動的ライブラリ

  • ステップ7 *-DLLが正常に作成されると、出力ウィンドウにメッセージが表示されます。
  • ステップ8 *-Windowsエクスプローラーを開き、現在のプロジェクトのデバッグフォルダーを開きます。
  • ステップ9 *-dll拡張子を持つファイルとlib拡張子を持つ別のファイルが作成されていることに注意してください。

動的ライブラリ

  • ステップ10 *-dll拡張子でこのファイルをテストするには、ファイル→新規→プロジェクトから新しいMFCダイアログベースのアプリケーションを作成する必要があります。

動的ライブラリ

ステップ11 *-MFCDynamicLib \ Debugフォルダーに移動し、次のスナップショットに示すように、。dllおよび* .libファイルをMFCLibTestプロジェクトにコピーします。

動的ライブラリ

  • ステップ12 *-DLLを現在のプロジェクトに追加するには、メインメニューで[プロジェクト]→[既存のアイテムを追加]をクリックし、MFCDynamicLib.libファイルを選択します。
  • ステップ13 *-次のスナップショットに示すようにダイアログボックスを設計します。

動的ライブラリ

  • ステップ14 *-値タイプdoubleの両方の編集コントロールに値変数を追加します。

動的ライブラリ

  • ステップ15 *-ダイアログボックスの最後にある静的テキストコントロールの値変数を追加します。

動的ライブラリ

  • ステップ16 *-[計算]ボタンのイベントハンドラーを追加します。
  • ステップ17 *-DLLを使用しているプロジェクトでは、アクセスする各関数は_declspec(dllimport)修飾子を使用して宣言する必要があります。
  • ステップ18 *-MFCLibTestDlg.cppファイルに次の関数宣言を追加します。
extern "C" _declspec(dllimport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) long GreatestCommonDivisor(long Nbr1, long Nbr2);
  • ステップ19 *-ボタンイベントハンドラの実装です。
void CMFCLibTestDlg::OnBnClickedButtonCal() {

  //TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);

   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);

   UpdateData(FALSE);
}
  • ステップ20 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

動的ライブラリ

  • ステップ21 *-編集フィールドに2つの値を入力し、[計算]をクリックします。 DLLから計算した結果が表示されます。

動的ライブラリ