レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API エディット コントロールの概要

 Microsoft(R) Windows(TM) では、 アプリケーションとユーザーの対話をサポートするためのダイアログ ボックスとコントロールを用意しています。「エディット コントロール」とは、 長方形のコントロール ウィンドウで、 通常、 ダイアログ ボックスでユーザーがキーボードを使ってテキストを入力したり編集できるようにするために使われます。ユーザーがエディット コントロール内でマウスをクリックしたりTabキーを押すと、 エディット コントロールが選択され、 入力フォーカスが設定されます。エディット コントロールは、 選択されると、 テキストがあれば表示し、 挿入ポイントを示す点滅するキャレットを表示します。ユーザーは、 キーボードやマウスを使って、 テキストの入力、 挿入ポイントの移動、 移動したり削除するテキストの選択などを行うことができます。エディット コントロールは、 WM_COMMANDメッセージを使って親ウィンドウに通知メッセージを送ります。エディット コントロールからのメッセージについて詳しくは、 エディット コントロールの通知メッセージを参照してください。親ウィンドウは、 SendDlgItemMessage関数を使って、 ダイアログ ボックス内のエディット コントロールにメッセージを送ります。

エディット コントロールには、 単一行 (デフォルト) と複数行があります。複数行エディット コントロール (MLEとも呼ばれます) には、 スクロール バーを付加できます。エディット コントロールは、 EDITウィンドウ クラスに属します。

エディット コントロールは、 オーバーラップ ウィンドウやポップアップ ウィンドウ、 子ウィンドウなどでも使えますが、 Windowsで動作が標準化されているダイアログ ボックス用に設計されています。エディット コントロールをダイアログ ボックス以外で使うときは、 余分な処理が必要になり、 アプリケーションが標準でない動作をする可能性があります。このような理由のため、 エディット コントロールはダイアログ ボックスで使うか、 ウィンドウのサブクラス化を使ってカスタマイズしたエディット コントロールを作成してください。ダイアログ ボックスについて詳しくは、 ダイアログ ボックスの概要を参照してください。ウィンドウ サブクラスについて詳しくは、 ウィンドウ プロシージャの概要を参照してください。

コンボ ボックスとは、 エディット コントロールとリスト ボックスの機能の大部分を組み合わせたコントロールです。コンボ ボックスでは、 エディット コントロールは現在の選択を表示し、 リスト ボックスはユーザーが選択可能なオプションを表示します。コンボ ボックスについて詳しくは、 コンボ ボックスの概要を参照してください。

コモン ダイアログ ボックス ライブラリ (COMDLG32.DLL) で用意されているダイアログボックスを利用することによって、 カスタマイズしたエディット コントロールが必要な作業を簡単に実行できます。コモン ダイアログ ボックスについて詳しくは、 コモン ダイアログ ボックス ライブラリの概要を参照してください。

次に示すトピックでは、 エディット コントロールについて説明しています。

エディット コントロールのスタイル

テキスト バッファ

テキスト操作

エディット コントロールの通知メッセージ

デフォルトのメッセージ処理

エディット コントロールの使用

エディット コントロールによる簡単なワード プロセッサ

単一行エディット コントロールの使用

エディット コントロール関数とメッセージ

 

 

エディット コントロールのスタイル

Windowsでは、 13個のエディット コントロール スタイルを用意しています。1つのエディット コントロールに複数のスタイルを同時に指定することができます。通常は、 スタンドアロンのツールを使ってダイアログ ボックスを開発するため、 エディット コントロール スタイルを明示的に指定する必要はありません。しかし、 CreateWindow関数やCreateWindowEx関数を使ってエディット コントロールを作成するアプリケーションは、 エディット コントロール スタイルを指定しなければなりません。

各エディット コントロールには、 エディット コントロールの外観と機能を定義するスタイル値の組み合わせを指定します。スタイル値は、 単一行または複数行、 コントロール内でのテキストの配置、 テキストの表示などを定義します。アプリケーションが使用するスタイルの個数と種類は、 エディット コントロールの種類と用途によって異なります。

エディット コントロールには、 2つの行スタイルがあります。デフォルトは単一行エディット コントロールで、 スタイルの指定は不要です。複数行エディット コントロールを作成するには、 ES_MULTILINEスタイルを使います。

Windowsにエディット コントロール内のテキストを配置させるスタイルは3つあります。ES_LEFTES_CENTERES_RIGHTの各スタイルによって、 それぞれ、 テキストは左寄せ、 中央揃え、 右寄せに配置されます。これらのスタイルは、 複数行エディット コントロールだけに適用されます。

また、 ユーザーが入力したテキストをWindowsがエディット コントロールに表示する方法を指定するスタイルもあります。ES_LOWERCASEスタイルは、 テキストを小文字に変換します。ES_UPPERCASEスタイルは、 テキストを大文字に変換します。(ファイル名などの) Windows文字列のテキストを特定の文字セットに変換したいときは、 ES_OEMCONVERTスタイルを指定することによって、 文字が適切に変換されます。文字セットについて詳しくは、 コンソールと文字モード サポートの概要を参照してください。

表示されるテキストの量がエディット コントロールのサイズを超えるときは、 エディット コントロール内のテキストをスクロールするための2つのスタイルを使うことができます。ES_AUTOHSCROLLスタイルは、 単一行や複数行のエディット コントロールで、 テキストを水平方向に自動的にスクロールします。また、 複数行エディット コントロールの場合は、 ES_AUTOVSCROLLスタイルを使って、 テキストを垂直方向に自動的にスクロールすることもできます。

そのほかにも、 エディット コントロールのさまざまな要素を定義するスタイルがあります。ES_NOHIDESELスタイルは、 エディット コントロールがキーボード フォーカスを失っても選択されているテキストを非表示にしないことを指定します。ES_READONLYスタイルは、 エディット コントロールを読み取り専用にします。ES_PASSWORDスタイルは、 エディット コントロール内のすべてのテキストをアスタリスク (*) として表示します (表示される文字を変更するには、 このトピックで説明するように、 EM_SETPASSWORDCHARメッセージを使います)。複数行エディット コントロールでは、 ES_WANTRETURNスタイルを指定することによって、 ユーザーがエディット コントロール内でEnterキーを押したときに改行を挿入するようにWindowsに要求できます。

デフォルトでは、 エディット コントロールには境界線はありません。境界線を付加するには、 WS_BORDERウィンドウ スタイルを使ってください。

 

 

テキスト バッファ

Windowsは、 エディット コントロールのテキストをバッファに格納し、 必要に応じてコントロールにコピーします。ここでは、 Windowsがバッファを割り当てて初期化する方法と、 バッファの属性を変更する方法について説明します。各トピックをクリックすると、 そのトピックの内容を表示できます。

テキスト バッファの割り当て

テキスト バッファの初期化

テキスト バッファの読み取り専用化

 

 

テキスト バッファの割り当て

Windowsは、 エディット コントロールを作成するとき、 自動的にテキスト バッファを作成して初期サイズを設定します。また、 必要に応じて、 バッファのサイズを上限まで増やします。単一行エディット コントロールの場合は、 この上限は約32Kバイトです。この上限は変更可能なため、 ソフト リミットと呼ばれます。

通常、 Windowsは、 ダイアログ ボックス内のコントロールのバッファをアプリケーションのデータ セグメント以外のメモリに作成します。このデフォルトの割り当てを行わずに、 バッファがアプリケーションのローカル ヒープに割り当てられるようにするには、 エディット コントロールを作成するときにDS_LOCALEDITスタイルを使います。DS_LOCALEDITスタイルを使うときは、 バッファの割り当てはすべてアプリケーションが行わなければなりません。最初の割り当てを行うには、 LocalAlloc関数を呼び出して、 返されたバッファ ハンドルをEM_SETHANDLEメッセージでエディット コントロールに渡します。(EN_ERRSPACEメッセージなどに対して) 2回目以降の割り当てを行うときは、 次のように、 (必要ならば) 現在のバッファの内容を保管して、 新しいバッファを取得してください。

1. 複数行エディット コントロールにEM_GETHANDLEメッセージを送って、 コントロールのテキスト用に現在割り当てられているメモリのハンドルを取得します。

2. LocalFree関数を呼び出してバッファを解放します。

3. LocalAlloc関数を呼び出して新しいバッファ (およびバッファ ハンドル) を取得します。

4. コントロールにEM_SETHANDLEメッセージを送って、 バッファ ハンドルをWindowsに渡します。

 

EM_SETHANDLEメッセージとEM_GETHANDLEメッセージは、 複数行エディット コントロールだけに適用されます。

デフォルトの割り当て動作を使用する (DS_LOCALEDITスタイルを使用する) アプリケーションは、 エディット コントロールにEM_SETHANDLEメッセージやEM_GETHANDLEメッセージを送ってはいけません。

EM_SETHANDLEメッセージには、 いくつかの副作用があります。このメッセージを送ると、 アンドゥ フラグがクリアされ (EM_CANUNDOメッセージが0を返すようになります)、 修正フラグがクリアされます (EM_GETMODIFYメッセージが0を返すようになります)。また、 エディット コントロール ウィンドウが再描画されます。

 

テキスト バッファの初期化

エディット コントロールのテキスト バッファを初期化または再初期化するには、 SetDlgItemText関数を呼び出します。また、 テキスト バッファの内容を取得するには、 GetDlgItemText関数を呼び出します。

 

テキスト バッファの読み取り専用化

Windowsは、 各エディット コントロールについて、 コントロールのテキストが読み書き可能 (デフォルト) か読み取り専用かを示す読み取り専用フラグを管理しています。テキストの読み取り専用フラグを設定するには、 EM_SETREADONLYメッセージをコントロールに送ります。エディット コントロールが読み取り専用かどうかを判断するには、 GWL_STYLEスタイルを指定してGetWindowLong関数を呼び出します。EM_SETREADONLYメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方に適用されます。

 

書式化長方形の変更

エディット コントロールのテキストが表示されるかどうかは、 コントロールのウィンドウ長方形と書式化長方形によって決まります。ウィンドウ長方形とは、 エディット コントロールを含むウィンドウのクライアント領域です。書式化長方形とは、 Windowsがウィンドウ長方形に表示するテキストを初期化するときに使われる長方形です。エディット コントロールが最初に表示されるときは、 この2つの長方形は同じです。アプリケーションは、 書式化長方形をウィンドウ長方形よりも大きくしたり (エディット コントロールの表示が制限されます)、 書式化長方形をウィンドウ長方形よりも小さくできます (テキストの回りに空白領域ができます)。

エディット コントロールの書式化長方形の座標を設定するには、 EM_SETRECTメッセージを送ります。また、 EM_SETRECTメッセージは、 エディット コントロールのテキストを自動的に再描画します。コントロールのテキストを再描画せずに書式化長方形の座標を設定するには、 コントロールにEM_SETRECTNPメッセージを送ります。書式化長方形の座標を取得するには、 コントロールにEM_GETRECTメッセージを送ります。これらのメッセージは、 複数行エディット コントロールだけに適用されます。

 

 

テキスト操作

Windowsは、 ユーザーが行ったテキスト操作を自動的に処理し、 操作が完了するとアプリケーションに通知します。ここでは、 ユーザーによるテキスト操作と、 アプリケーションの応答について説明します。

各トピックをクリックすると、 そのトピックの内容を表示できます。

Unicode文字セットとANSI文字セット

フォント

エディット コントロールの選択

テキストの選択

テキストの置き換え

切り取り、 コピー、 貼り付け、 消去操作

テキストの修正

ユーザーのテキスト入力の制限

文字操作と行操作

テキストのスクロール

タブ ストップ

パスワード文字

整数の使用

テキスト操作を元に戻す

ワードラップ関数

 

文字セット

Windowsは、 2バイト文字セットであるUnicode(TM) と、 Unicodeの厳密なサブセットであるシングル バイト文字セットのANSIの2つの文字セットをサポートしています。ANSIでは、 n文字はnバイトに等しくなりますが、 Unicodeでは、 n文字は2nバイトになります。

Unicodeとその文字セットについて詳しくは、 文字列操作とUnicodeの概要を参照してください。

 

フォント

エディット コントロールで使われるフォントを変更するには、 WM_SETFONTメッセージを送ります。通常、 このメッセージは、 WM_INITDIALOGメッセージを処理するときに送ります。フォントを変更しても、 エディット コントロールのサイズは変更されません。WM_SETFONTメッセージを送るときは、 テキストのフォント メトリックスを取得して、 エディット コントロールのサイズを再計算してください。

フォントとフォント メトリックスについて詳しくは、 フォントとテキストの概要を参照してください。

 

エディット コントロールの選択

ユーザーは、 マウスのクリックや、 TabキーとSpaceキーでエディット コントロールを選択できます。また、 エディット コントロールがWS_GROUPスタイルを使って定義されているグループの一部のときは、 Tabキーでグループ内で選択されているコントロールに移動し、 方向キーを使ってグループ内のコントロールを移動できます (この方法は、 Windowsが用意している定義済みキーボード インターフェイスの一部です。このインターフェイスについて詳しくは、 ダイアログ ボックスの概要を参照してください)。ユーザーがエディット コントロールを選択すると、 Windowsは、 そのコントロールにキーボード フォーカスを設定し、 テキストを反転表示で強調表示します。

 

テキストの選択

ユーザーは、 エディット コントロールを選択してから、 マウスやキーボードを使ってコントロール内のテキストを選択できます。エディット コントロールの現在の選択の開始文字位置と終了文字位置を取得するには、 コントロールにEM_GETSELメッセージを送ります。返される終了位置は、 選択の最後の文字の位置よりも1つ大きい値です (つまり、 選択の最後の文字の次の文字の位置です)。

また、 エディット コントロールのテキストを選択するには、 選択範囲の開始位置と終了位置を指定したEM_SETSELメッセージをコントロールに送ります。たとえば、 EM_SETSELとEM_REPLACESELを使って、 エディット コントロールからテキストを削除できます。

この3つのメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方に適用されます。

 

テキストの置き換え

エディット コントロールで選択されているテキストを置き換えるには、 新しいテキストを指すポインタを指定したEM_REPLACESELメッセージをコントロールに送ります。現在何も選択されていなければ、 EM_REPLACESELは、 挿入ポイントに新しいテキストを挿入します。新しいテキストの挿入によって利用可能なメモリ量を超えるときは、 アプリケーションはEN_ERRSPACEメッセージを受け取ります。このメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方に適用されます。

エディット コントロールのテキストの一部を置き換えるには、 EM_REPLACESELメッセージを使います。また、 テキストをすべて置き換えるには、 SetDlgItemText関数を使います。

 

切り取り、 コピー、 貼り付け、 消去操作

Windowsは、 エディット コントロールとクリップボードの間でテキストを移動するための4つのメッセージを用意しています。WM_COPYメッセージは、 エディット コントロールで現在テキストが選択されていれば、 選択範囲のテキストを削除せずにエディット コントロールからクリップボードにコピーします。WM_CUTメッセージは、 エディット コントロールで現在テキストが選択されていればそのテキストを削除し、 削除したテキストをクリップボードにコピーします。WM_CLEARメッセージは、 エディット コントロールで現在テキストが選択されていればそのテキストを削除しますが、 (ユーザーがShiftキーを押していなければ) テキストをクリップボードにコピーしません。WM_PASTEメッセージは、 クリップボードのテキストをエディット コントロールの挿入ポイントに挿入します。この4つのメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方に適用されます。

 

テキストの修正

ユーザーは、 エディット コントロールのテキストを選択、 削除、 移動できます。Windowsは、 各エディット コントロールに対して、 コントロールの内容が修正されたかどうかを示す内部フラグを管理しています。Windowsは、 コントロールを作成するときにこのフラグをクリアし、 コントロール内のテキストが修正されるとフラグをセットします。修正フラグを取得するには、 コントロールにEM_GETMODIFYメッセージを送ります。また、 修正フラグを設定するには、 コントロールにEM_SETMODIFYメッセージを送ります。これらのメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方に適用されます。

 

ユーザーのテキスト入力の制限

ユーザーがエディット コントロールに入力できるテキストの量の上限は、 デフォルトでは32Kバイトです。

 

文字操作と行操作

Microsoft(R) Win32アプリケーション プログラミング インターフェイス (API) では、 エディット コントロールの文字や行に関する情報を返すメッセージをいくつか用意しています。メッセージの多くは、 文字や行を参照するインデックス (通常は0から数えた値です) を返します。このため、 n文字を含む単一行エディット コントロールの場合、 行インデックスは0で、 文字インデックスは0からn - 1になります。m行とn文字を含む複数行エディット コントロールの場合、 行インデックスは0からm - 1まで、 文字インデックスは0からn - 1までになります。文字インデックスには行の折り返しは含まれていません。

エディット コントロールの文字数を判断するには、 エディット コントロールにWM_GETTEXTLENGTHメッセージを送ります。このメッセージは、 エディット コントロールのテキストの (最後のNULL文字を含まない) 文字単位の長さを返します。EM_LINELENGTHメッセージは、 文字インデックスで指定された文字が含まれる行の文字単位の長さを返します。文字インデックスに-1を指定すると、 選択されている文字を含まない長さを返します。これらのメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方で使えます。

EM_GETFIRSTVISIBLELINEメッセージは、 複数行エディット コントロールの場合、 いちばん上に表示されている行の0から数えたインデックスを返します。単一行エディット コントロールの場合は、 いちばん前に表示されている文字の0から数えたインデックスを返します。エディット コントロールからバッファに行をコピーするには、 エディット コントロールにEM_GETLINEメッセージを送ります。メッセージにはコピーする行のインデックスを指定し、 バッファにコピー可能な最大文字数をバッファの最初のワードに指定します。戻り値は、 コピーされたバイト数です。このメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方で使えます。

複数行エディット コントロールの行に関する情報を返すメッセージもあります。EM_GETLINECOUNTメッセージは、 エディット コントロールに含まれる行数を返します。特定の行の文字単位のインデックスを取得するには、 EM_LINEFROMCHARメッセージとEM_LINEINDEXメッセージを使います。EM_LINEFROMCHARメッセージは、 指定された文字インデックスの文字を含む行のインデックスを返します。このメッセージは、 EM_LINEINDEXメッセージの逆です。EM_LINEINDEXメッセージは、 指定された行の最初の文字のインデックスを返します。

 

テキストのスクロール

エディット コントロールでスクロールを実現するには、 エディット コントロールのスタイルで説明している自動スクロール スタイルを使うか、 明示的にスクロール バーをコントロールに付加します。水平スクロール バーを付加するには、 WS_HSCROLLスタイルを指定します。また、 垂直スクロール バーを付加するには、 WS_VSCROLLスタイルを使います。スクロール バーを持つエディット コントロールは、 自分自身のスクロール バー メッセージを処理します。エディット コントロールにスクロール バーを追加する方法について、 詳しくはスクロール バーの概要を参照してください。

Windowsでは、 スクロール バー付きのエディット コントロールに送るメッセージを2つ用意しています。EM_LINESCROLLメッセージは、 複数行エディット コントロールを垂直にスクロールします。コントロールにES_LEFTスタイルが指定されているときは、 水平にスクロールします。lParamパラメータには、 現在の行から垂直にスクロールする行数を指定し、 wParamパラメータには、 現在の文字から水平にスクロールする文字数を指定します。ES_CENTERスタイルやES_RIGHTスタイルのエディット コントロールは、 水平スクロール メッセージを受け取りません。このメッセージは、 複数行エディット コントロールだけに適用されます。

EM_SCROLLメッセージは、 WM_VSCROLLメッセージと同様に、 複数行エディット コントロールを垂直にスクロールします。wParamパラメータには、 スクロール動作を指定します。EM_SCROLLメッセージは、 複数行エディット コントロールだけに適用されます。

EM_SCROLLCARETメッセージは、 キャレットが表示されるようにエディット コントロールをスクロールします。以前のバージョンのWindowsでは、 これはEM_SETSELメッセージのfScrollにFALSEを指定することによって行っていました。Win32アプリケーションは、 EM_SCROLLCARETメッセージでこの処理を行ってください。

 

タブ ストップ

複数行エディット コントロールにタブ ストップを設定するには、 EM_SETTABSTOPSメッセージを使います (デフォルトのタブ ストップは8文字です)。アプリケーションがエディット コントロールにテキストを追加すると、 そのテキストのタブ文字は自動的に次のタブ ストップまでの空白文字に展開されます。EM_SETTABSTOPSメッセージを送っても、 Windowsはテキストを再描画しません。テキストを再描画するには、 InvalidateRect関数を呼び出してください。EM_SETTABSTOPSメッセージは、 複数行エディット コントロールだけに適用されます。

 

パスワード文字

エディット コントロールのユーザー入力を隠すには、 パスワード文字を使います。パスワード文字を設定すると、 ユーザーが入力した文字の代わりにパスワード文字が表示されます。パスワード文字を解除すると、 コントロールはユーザーが入力した文字を表示します。ES_PASSWORDスタイルを使ってエディット コントロールを作成した場合、 デフォルトのパスワード文字はアスタリスク (*) になります。パスワード文字を解除したり変更するには、 EM_SETPASSWORDCHARメッセージを使います。また、 現在のパスワード文字を取得するには、 EM_GETPASSWORDCHARメッセージを使います。これらのメッセージは、 単一行エディット コントロールだけに適用されます。

 

整数の使用

Windowsでは、 数値専用のエディット コントロールのために整数変換関数を2つ用意しています。SetDlgItemInt関数は、 指定された (符号付きまたは符号なしの) 整数の文字列表現を作成し、 その文字列をエディット コントロールに送ります。SetDlgItemIntは値を返しません。GetDlgItemInt関数は、 エディット コントロールの文字列から (符号付きまたは符号なしの) 整数値を作成します。GetDlgItemIntは、 整数 (またはエラー コード) を返します。

 

テキスト操作を元に戻す

各エディット コントロールは、 エディット コントロールに対する直前の操作 (テキストの削除など) を元に戻せるかどうかを示すアンドゥ フラグを管理しています。元に戻す操作が可能なときはアンドゥ フラグをセットし、 元に戻す操作が不可能なときはアンドゥ フラグをクリアします。アンドゥ フラグの設定を判断するには、 コントロールにEM_CANUNDOメッセージを送ります。

直前の操作を元に戻すには、 コントロールにEM_UNDOメッセージを送ります。ほかの編集操作が行われていなければ、 操作を元に戻すことができます。たとえば、 ユーザーは、 テキストを削除して、 (削除を元に戻すことで) テキストを再表示し、 (再表示を元に戻すことで) テキストをもう一度削除できます。EM_UNDOメッセージは、 単一行エディット コントロールと複数行エディット コントロールの両方に適用され、 単一行エディット コントロールでは常に使用可能です。

エディット コントロールのアンドゥ フラグをクリアするには、 コントロールにEM_EMPTYUNDOBUFFERメッセージを送ります。エディット コントロールがEM_SETHANDLEメッセージかWM_SETTEXTメッセージを受け取ると、 Windowsは、 アンドゥ フラグを自動的にクリアします。SetDlgItemText関数は、 WM_SETTEXTメッセージを送ります。

 

ワードラップ関数

複数行エディット コントロールでは、 ワードラップ関数を使って、 行を折り返すときの分割方法を制御できます。Windowsが用意しているデフォルトのワードラップ関数は、 単語間の空白で行を折り返します。自分自身のワードラップ関数を設定するには、 EditWordBreakProcワードラップ関数を指定して、 EM_SETWORDBREAKPROCメッセージをコントロールに送ります。現在のワードラップ関数のアドレスを取得するには、 コントロールにEM_GETWORDBREAKPROCメッセージを送ります。

折り返されたテキスト行の終端でソフト改行文字 (2つのCRと1つのLF) を追加または削除するように複数行エディット コントロールに指示できます。この機能をオンまたはオフにするには、 エディット コントロールにEM_FMTLINESメッセージを送ります。このメッセージは複数行エディット コントロールだけに適用され、 ハード改行文字 (ユーザーが入力したCRとLF) で終わる行には影響しません。

 

 

エディット コントロールの通知メッセージ

ユーザーは、 キーボードやマウスを使って編集操作を行います。ユーザーが編集操作を行うと、 Windowsは、 WM_COMMANDメッセージとしてその編集要求をエディット コントロールに送ります。メッセージのwParamパラメータの下位ワードにはエディット コントロールの識別子、 lParamパラメータにはエディット コントロールのハンドル、 wParamパラメータの上位ワードにはユーザーの操作に対応するエディット コントロール通知メッセージが設定されています。

注: Microsoft(R) Windows NT(TM) では、 通知コードはlParamパラメータではなくwParamパラメータに設定されます。Windows 3.xアプリケーションをWindows NTに移植するときは、 通知メッセージを処理するコードを修正してください。

アプリケーションは、 各通知メッセージを調べて、 適切に応答してください。各エディット コントロール通知メッセージとそれに対応する動作を次の表に示します。

 

通知メッセージ ユーザー動作

EN_CHANGE ユーザーがエディット コントロールのテキストを修正しました。Windowsは、 表示を更新してからこのメッセージを送ります (EN_UPDATEとは逆です)。

EN_ERRSPACE 要求を満たすのに必要なメモリをエディット コントロールが割り当てられません。

EN_HSCROLL ユーザーがエディット コントロールの水平スクロール バーをクリックしました。Windowsは、 このメッセージを送ってから画面を更新します。

EN_KILLFOCUS ユーザーがほかのコントロールを選択しました。

EN_MAXTEXT ユーザーがテキストを挿入しているときに、 エディット コントロールに指定されている文字数の制限を超えました。挿入は切り捨てられます。また、 このメッセージは、 ES_AUTOHSCROLLスタイルを持たないエディット コントロールにエディット コントロールの幅を超える文字数を挿入しようとしたときや、 ES_AUTOVSCROLLスタイルを持たないエディット コントロールにコントロールの高さを超える行数を挿入しようとしたときにも送られます。

EN_SETFOCUS ユーザーがこのエディット コントロールを選択しました。

EN_UPDATE ユーザーがエディット コントロールのテキストを変更し、 Windowsが新しいテキストを表示しようとしています。Windowsは、 テキストを書式化してからこのメッセージを送り、 その後でテキストを表示します。これによって、 アプリケーションはエディット コントロールのウィンドウをサイズ変更できます。

EN_VSCROLL ユーザーがエディット コントロールの垂直スクロール バーをクリックしました。Windowsは、 画面を更新する前にこのメッセージを送ります。

 

 

さらに、 システムは、 エディット コントロールを描画する前に、 エディット コントロールの親ウィンドウにWM_CTLCOLOREDITメッセージを送ります。このメッセージには、 エディット コントロールのディスプレイ コンテキスト (DC) のハンドルと、 子ウィンドウのハンドルが設定されています。親ウィンドウは、 このハンドルを使って、 エディット コントロールのテキストの色や背景色を変更できます。

 

 

デフォルトのメッセージ処理

定義済みエディット コントロール ウィンドウ クラスのウィンドウ プロシージャは、 エディット コントロール プロシージャが処理しないメッセージのデフォルト処理を行います。エディット コントロール プロシージャがメッセージに対してFALSEを返すと、 定義済みウィンドウ プロシージャは、 メッセージをチェックし、 次に示すデフォルト動作を実行します。

 

メッセージ デフォルト動作

EM_CANUNDO 編集操作が元に戻せるならばTRUEを返します。

EM_EMPTYUNDOBUFFER アンドゥ バッファを空にして、 EM_CANUNDOメッセージで取得されるアンドゥ フラグをFALSEに設定します。エディット コントロールがWM_SETTEXTメッセージやEM_SETHANDLEメッセージを受け取ると、 Windowsは、 アンドゥ フラグを自動的にクリアします。

EM_FMTLINES 複数行エディット コントロールの折り返されている行の終端にソフト改行文字 (2つのCRと1つのLF) を追加または削除します。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_GETFIRSTVISIBLELINE 単一行エディット コントロールの場合は、 最初に表示されている文字の0から数えたインデックスを返します。複数行エディット コントロールの場合は、 いちばん上に表示されている行の0から数えたインデックスを返します。

EM_GETHANDLE 複数行エディット コントロールのテキストを含むバッファを識別するハンドルを返します。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_GETLINE 単一行エディット コントロールの場合は、 コントロール内の文字をバッファにコピーし、 コピーした文字数を返します。複数行エディット コントロールの場合は、 コントロールからテキストを1行取得し、 コピーした文字数を返します。

EM_GETLINECOUNT エディット コントロールに含まれる行数を返します。

EM_GETMODIFY エディット コントロールの内容が修正されたかどうかを示すフラグを返します。

EM_GETPASSWORDCHAR ES_PASSWORDスタイルのエディット コントロールで使われるパスワード文字を返します。

EM_GETRECT エディット コントロールの書式化長方形の座標を返します。

EM_GETSEL エディット コントロールの現在の選択範囲の開始位置と終了位置を返します。

EM_GETTHUMB サポートされていません。

EM_GETWORDBREAKPROC エディット コントロールの現在のワードラップ関数のアドレスを返します。

EM_LINEFROMCHAR 複数行エディット コントロールで、 指定された文字インデックスの文字を含む行の0から数えたインデックスを返します。このメッセージは、 EM_LINEINDEXメッセージの逆です。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_LINEINDEX 複数行エディット コントロールの行の文字単位のインデックスを返します。このメッセージは、 EM_LINEFROMCHARメッセージの逆です。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_LINELENGTH 単一行エディット コントロールの場合は、 テキストの文字単位の長さを返します。複数行エディット コントロールの場合は、 指定された行の文字単位の長さを返します。

EM_LINESCROLL 複数行エディット コントロールがES_LEFTスタイルを持っていれば、 テキストを垂直または水平にスクロールします。lParamパラメータには、 現在の行から垂直にスクロールする行数を指定します。wParamパラメータには、 現在の文字から水平にスクロールする文字数を指定します。

EM_MSGMAX サポートされていません。

EM_REPLACESEL 現在の選択範囲をアプリケーションが提供したバッファのテキストで置き換え、 親ウィンドウにEN_UPDATEメッセージとEN_CHANGEメッセージを送り、 アンドゥ バッファを更新します。

EM_SCROLL 複数行エディット コントロールのテキストを垂直にスクロールします。このメッセージは、 エディット コントロールにWM_VSCROLLメッセージを送るのと同じです。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_SCROLLCARET エディット コントロールのキャレットが表示されるようにスクロールします。以前のバージョンのWindowsでは、 この処理は、 特定のパラメータを指定したEM_SETSELで行っていました。Win32アプリケーションでは、 EM_SCROLLCARETを使ってください。

EM_SETHANDLE 指定されたハンドルが識別するメモリをテキスト バッファとして設定して、 アンドゥ バッファを空にし、 スクロール位置を0にリセットします。また、 ウィンドウを再描画します。

EM_SETMODIFY エディット コントロールが修正されたかどうかを示す修正フラグをセットまたはクリアします。

EM_SETPASSWORDCHAR ES_PASSWORDスタイルのエディット コントロールで使われるパスワード文字を設定します。

EM_SETREADONLY エディット コントロールの読み取り専用スタイル (ES_READONLY) を設定または解除します。

EM_SETRECT 複数行エディット コントロールの書式化長方形を設定し、 ウィンドウを再描画します。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_SETRECTNP 複数行エディット コントロールの書式化長方形を設定しますが、 ウィンドウを再描画しません。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_SETSEL エディット コントロールの選択範囲を、 指定された開始位置と終了位置が示す範囲に設定します。

EM_SETTABSTOPS エディット コントロールのタブ ストップ位置を設定します。このメッセージは、 単一行エディット コントロールでは処理されません。

EM_SETWORDBREAKPROC デフォルトのワードラップ関数をアプリケーション定義のワードラップ関数で置き換えます。

EM_UNDO 挿入されたばかりのテキストを削除したり、 削除されたばかりの文字を挿入してそのテキストを選択します。必要ならば、 親ウィンドウにEN_UPDATE通知メッセージとEN_CHANGE通知メッセージを送ります。

WM_CHAR 文字をコントロールに書き込んで、 親ウィンドウにEN_UPDATE通知メッセージとEN_CHANGE通知メッセージを送ります。Ctrl+C (コピー) やCtrl+V (貼り付け) などの標準機能のアクセラレータ キーを処理します。さらに、 複数行エディット コントロールの場合は、 Tabキーが入力されるとダイアログ ボックス内のコントロール間を移動し、 Ctrl+Tabキーが押されるとタブを挿入します。無効な文字が入力されたときは、 MessageBeep関数を呼び出します。

WM_CLEAR エディット コントロールでテキストが選択されていれば、 そのテキストを削除します。何も選択されていなければ、 キャレットの右側の文字を削除します。ユーザーがShiftキーを押していれば、 選択範囲をクリップボードに切り取ります。何も選択されていないときにユーザーがShiftキーを押していれば、 キャレットの左側の文字を削除します。ユーザーがCtrlキーを押していれば、 選択範囲を削除します。何も選択されていないときにユーザーがCtrlキーを押していれば、 行の終端までを削除します。

WM_COPY ES_PASSWORDスタイルが設定されていなければ、 テキストをクリップボードにコピーします。ES_PASSWORDスタイルが設定されていれば、 0を返します。

WM_CREATE エディット コントロールを作成し、 正常に作成できたときはTRUE、 失敗したときは-1を親ウィンドウに返します。

WM_CUT 選択範囲をクリップボードに切り取ります。何も選択されていなければ、 キャレットの左側の文字を削除します。

WM_ENABLE 単一行エディット コントロールの場合は、 長方形を灰色で再描画します。使用可能状態を返します。

WM_ERASEBKGND 複数行エディット コントロール ウィンドウをエディット コントロールの現在の色で塗りつぶします。

WM_GETDLGCODE 次に示す値のいずれかを返します。DLGC_WANTCHARSDLGC_HASSETSEL DLGC_WANTARROWS。複数行エディット コントロールの場合は、 DLGC_WANTALLKEYSを返す場合もあります。また、 ユーザーがAlt+BackSpaceを押したときは、 DLGC_WANTMESSAGEを返します。

WM_GETFONT コントロールが使用しているフォントのハンドルを返します。システム フォントが使われているときは、 NULLを返します。

WM_GETTEXT 指定された文字数をバッファにコピーし、 コピーした文字数を返します。

WM_GETTEXTLENGTH エディット コントロールのテキストの文字数を返します。この文字数には、 終端のNULL文字は含まれません。

WM_HSCROLL 複数行エディット コントロールのテキストを水平にスクロールし、 スクロール バーのつまみの移動を処理します。

WM_KEYDOWN 仮想キー コードの標準処理を行います。

WM_KILLFOCUS エディット コントロール ウィンドウのキーボード フォーカスを解除してキャレットを破棄し、 選択の強調表示をオフにします。また、 エディット コントロールがフォーカスを失ったことを親ウィンドウに通知します。

WM_LBUTTONDBLCLK 現在の選択を解除し、 カーソル位置の単語を選択します。Shiftキーが押されていれば、 カーソル位置の単語まで選択を拡張します。

WM_LBUTTONDOWN 挿入ポイントを変更します。Shiftキーが押されていれば、 カーソルの位置まで選択範囲を拡張します。複数行エディット コントロールの場合は、 ユーザーがコントロール ウィンドウの外でマウス ボタンを押し続けたときに自動的にスクロールするためのタイマを設定します。

WM_LBUTTONUP マウス キャプチャを解放し、 挿入ポイントを設定します。さらに、 複数行エディット コントロールの場合は、 WM_LBUTTONDOWNメッセージで設定されたタイマを破棄します。

WM_MOUSEMOVE マウス ボタンが押されていれば、 選択範囲を変更します。さらに、 複数行エディット コントロールの場合は、 ユーザーがコントロール ウィンドウの外でマウス ボタンを押し続けたときに自動的にスクロールするためのタイマを設定します。

WM_NCCREATE ウィンドウのCREATESTRUCT構造体を指すポインタが渡されます。このメッセージは、 ウィンドウを最初に作成するときに、 WM_CREATEメッセージの前に送られます。

WM_NCDESTROY エディット コントロール ウィンドウのテキスト バッファやアンドゥ バッファ、 タブ ストップ バッファ、 強調表示ブラシなどのメモリをすべて解放します。

WM_PAINT 背景を消去して、 エディット コントロール ウィンドウの現在の色で塗りつぶし、 境界線があれば描画します。さらに、 テキスト挿入キャレットを表示します。

WM_PASTE エディット コントロール ウィンドウのキャレット位置にクリップボードからテキストを挿入します。

WM_SETFOCUS エディット コントロール ウィンドウにフォーカスを設定します (選択が非表示になっていれば表示し、 キャレットを作成します)。

WM_SETFONT フォントを設定します。オプションで、 エディット コントロールを再描画します。

WM_SETTEXT テキストをコントロールにコピーします。メモリが不足しているときは親ウィンドウに通知します。また、 アンドゥ バッファを空にして、 親ウィンドウにEN_UPDATE通知メッセージとEN_CHANGE通知メッセージを送ります。さらに、 複数行エディット コントロールの場合は、 必要ならば行を折り返して、 スクロール位置を設定します。

WM_SIZE エディット コントロール ウィンドウのサイズを、 少なくとも1文字が入るように変更します。

WM_SYSCHAR ユーザーがAlt+BackSpaceを押したときは、 TRUEを返します。そうでないときは、 何もしません。

WM_SYSKEYDOWN ユーザーがAlt+BackSpaceを押したときは、 最後の動作をやり直します。そうでないときは、 何もしません。

WM_TIMER ユーザーが複数行エディット コントロール ウィンドウの外でマウス ボタンを押していれば、 エディット コントロール ウィンドウのテキストをスクロールします。

WM_UNDO 挿入されたばかりのテキストを削除したり、 削除されたばかりの文字を挿入してそのテキストを選択します。必要ならば、 親ウィンドウにEN_UPDATE通知メッセージとEN_CHANGE通知メッセージを送ります。

WM_VSCROLL 複数行エディット コントロールのテキストを垂直にスクロールし、 スクロール バーのつまみの移動を処理します。

  • 定義済みエディット コントロール ウィンドウ プロシージャは、 上記以外のメッセージをDefWindowProc関数に渡してデフォルト処理を実行させます。

     

    エディット コントロールの使用

    通常、 エディット コントロールはダイアログ ボックスで使われますが、 標準ウィンドウのクライアント領域でも使えます。単一行エディット コントロールは、 ユーザーから単一の文字列を取得するのに役立ちます。また、 複数行エディット コントロールによって、 簡単なワード プロセッサのほとんどの機能を簡単に実現できます。

     

     

    エディット コントロールによる簡単なワード プロセッサ

    次に示すコード例は、 ウィンドウのクライアント領域全体に複数行エディット コントロールを設定することによって、 簡単なワード プロセッサを実現しています。システムは、 エディット コントロールのワードラップ操作を自動的に行い、 (ES_AUTOVSCROLLを指定してCreateWindow関数で作成した) 垂直スクロール バーの処理も行います。WM_COMMANDメッセージでは、 メニュー項目を処理します。ユーザーは、 メニュー コマンドを使って、 直前の操作を元に戻したり、 選択範囲のクリップボードへのコピーや切り取り、 クリップボードのテキストの貼り付け、 現在の選択範囲の削除を行うことができます。

     

    LONG APIENTRY MainWndProc(

    HWND hwnd, /* window handle */

    UINT message, /* type of message */

    UINT wParam, /* additional information */

    LONG lParam) /* additional information */

    {

    static HWND hwndEdit;

     

    CHAR lpszTrouble[] = "When in the Course of human Events "

    "it becomes necessary for one People "

    "to dissolve the Political Bands which "

    "have connected them with another, and "

    "to assume among the Powers of the "

    "Earth, the separate and equal Station "

    "to which the Laws of Nature and of "

    "Nature's God entitle them, a decent "

    "Respect to the Opinions of Mankind "

    "requires that they should declare the "

    "causes which impel them to the "

    "Separation. ";

     

    switch (message) {

    case WM_CREATE:

    hwndEdit = CreateWindow(

    "EDIT", /* predefined class */

    NULL, /* no window title */

    WS_CHILD | WS_VISIBLE | WS_VSCROLL |

    ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,

    0, 0, 0, 0, /* set size in WM_SIZE message */

    hwnd, /* parent window */

    (HMENU) ID_EDITCHILD, /* edit control ID */

    (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),

    NULL); /* pointer not needed */

     

    /* Add text to the window. */

     

    SendMessage(hwndEdit, WM_SETTEXT, 0,

    (LPARAM) lpszTrouble);

     

    return 0;

     

    case WM_COMMAND:

    switch (wParam) {

    case IDM_EDUNDO:

     

    /*

    * Send WM_UNDO only if there is something

    * to be undone.

    */

     

    if (SendMessage(hwndEdit, EM_CANUNDO, 0, 0))

    SendMessage(hwndEdit, WM_UNDO, 0, 0);

    else

    MessageBox(hwndEdit,

    "Nothing to undo.",

    "Undo notification", MB_OK);

    break;

     

    case IDM_EDCUT:

    SendMessage(hwndEdit, WM_CUT, 0, 0);

    break;

     

    case IDM_EDCOPY:

    SendMessage(hwndEdit, WM_COPY, 0, 0);

    break;

     

    case IDM_EDPASTE:

    SendMessage(hwndEdit, WM_PASTE, 0, 0);

    break;

     

    case IDM_EDDEL:

    SendMessage(hwndEdit, WM_CLEAR, 0, 0);

    break;

     

    case IDM_PASSWORD:

    DialogBox(hinst, /* current instance */

    "PassBox", /* resource to use */

    hwnd, /* parent handle */

    (DLGPROC) PassProc);

    break;

     

    case IDM_WRAP:

    SendMessage(hwndEdit,

    EM_SETWORDBREAKPROC,

    (WPARAM) 0,

    (LPARAM) (EDITWORDBREAKPROC) WordBreakProc);

    SendMessage(hwndEdit,

    EM_FMTLINES,

    (WPARAM) TRUE,

    (LPARAM) 0);

    SendMessage(hwndEdit,

    EM_SETSEL,

    0, -1); /* select all text */

    SendMessage(hwndEdit, WM_CUT, 0, 0);

    SendMessage(hwndEdit, WM_PASTE, 0, 0);

    break;

     

    case IDM_ABOUT:

    DialogBox(hinst, /* current instance */

    "AboutBox", /* resource to use */

    hwnd, /* parent handle */

    (DLGPROC) About);

    break;

     

    default:

    return DefWindowProc(hwnd, message, wParam, lParam);

    }

    break;

     

    case WM_SETFOCUS:

    SetFocus(hwndEdit);

    return 0;

     

    case WM_SIZE:

     

    /*

    * Make the edit control the size of the window's

    * client area.

    */

     

    MoveWindow(hwndEdit,

    0, 0, /* starting x- and y-coordinates */

    LOWORD(lParam), /* width of client area */

    HIWORD(lParam), /* height of client area */

    TRUE); /* repaint window */

    return 0;

     

    case WM_DESTROY:

    PostQuitMessage(0);

    return 0;

     

    default:

    return DefWindowProc(hwnd, message, wParam, lParam);

    }

    return NULL;

    }

     

     

     

     

    単一行エディット コントロールの使用

    ここでのコード例は、 ウィンドウ プロシージャを使ってユーザーにパスワードの入力を促すダイアログ ボックスを生成する方法を示しています。

    [Password]ダイアログ ボックスの単一行エディット コントロールには、 ES_PASSWORDスタイルが設定されています。デフォルトでは、 このスタイルのエディット コントロールは、 ユーザーが入力した文字の代わりにアスタリスクを表示します。しかし、 この例では、 EM_SETPASSWORDCHARメッセージを使って、 デフォルトの文字をアスタリスクからプラス記号 (+) に変更しています。

    ユーザーがエディット コントロールにテキストを入力すると、 このウィンドウ プロシージャは、 デフォルト プッシュ ボタンを[Cancel]から[OK]に変更します。ユーザーが[OK]ボタンを押すと、 ウィンドウ プロシージャは、 EM_LINELENGTHメッセージとEM_GETLINEメッセージを使ってテキストを取得します。

     

    LRESULT CALLBACK PassProc(hDlg, message, wParam, lParam)
    HWND hDlg; /* window handle of the dialog box */
    UINT message; /* type of message */
    UINT wParam; /* message-specific information */
    LONG lParam;
    {
    CHAR lpszPassword[16];
    WORD cchPassword;

    switch (message) {
    case WM_INITDIALOG:

    /* Set password character to a plus sign (+) */

    SendDlgItemMessage(hDlg,
    IDE_PASSWORDEDIT,
    EM_SETPASSWORDCHAR,
    (WPARAM) '+',
    (LPARAM) 0);

    /* Set the default push button to "Cancel." */

    SendMessage(hDlg,
    DM_SETDEFID,
    (WPARAM) IDCANCEL,
    (LPARAM) 0);

    return TRUE;

    case WM_COMMAND:

    /*
    * Set the default push button to "OK" when the user
    * enters text.
    */

    if(HIWORD (wParam) == EN_CHANGE &&
    LOWORD(wParam) == IDE_PASSWORDEDIT)
    SendMessage(hDlg,
    DM_SETDEFID,
    (WPARAM) IDOK,
    (LPARAM) 0);

    switch(wParam) {
    case IDOK:

    /* Get number of characters. */

    cchPassword = (WORD) SendDlgItemMessage(hDlg,
    IDE_PASSWORDEDIT,
    EM_LINELENGTH,
    (WPARAM) 0,
    (LPARAM) 0);

    if (cchPassword >= 16) {
    MessageBox(hDlg,
    "Too many characters.",
    "Error",
    MB_OK);
    EndDialog(hDlg, TRUE);
    return FALSE;
    }
    else if (cchPassword == 0) {
    MessageBox(hDlg,
    "No characters entered.",
    "Error",
    MB_OK);
    EndDialog(hDlg, TRUE);
    return FALSE;
    }

    /*
    * Put the number of characters into first word
    * of buffer.
    */

    *((LPWORD)lpszPassword) = cchPassword;

    /* Get the characters. */

    SendDlgItemMessage(hDlg,
    IDE_PASSWORDEDIT,
    EM_GETLINE,
    (WPARAM) 0, /* line 0 */
    (LPARAM) lpszPassword);

    /* Null-terminate the string. */

    lpszPassword[cchPassword] = 0;

    /* Call a local password-parsing function. */

    ParsePassword(lpszPassword);

    EndDialog(hDlg, TRUE);
    return TRUE;

    case IDCANCEL:
    EndDialog(hDlg, TRUE);
    return TRUE;
    }
    return 0;
    }
    return FALSE;
    UNREFERENCED_PARAMETER(lParam);
    }

    エディット コントロール関数とメッセージ

    エディット コントロールに関する関数とメッセージを次に示します。

     

    関数

    EditWordBreakProc

     

    メッセージ

    EM_CANUNDO

    EM_EMPTYUNDOBUFFER

    EM_FMTLINES

    EM_GETFIRSTVISIBLELINE

    EM_GETHANDLE

    EM_GETLINE

    EM_GETLINECOUNT

    EM_GETMODIFY

    EM_GETPASSWORDCHAR

    EM_GETRECT

    EM_GETSEL

    EM_GETWORDBREAKPROC

    EM_LINEFROMCHAR

    EM_LINEINDEX

    EM_LINELENGTH

    EM_LINESCROLL

    EM_REPLACESEL

    EM_SCROLL

    EM_SCROLLCARET

    EM_SETHANDLE

    EM_SETMODIFY

    EM_SETPASSWORDCHAR

    EM_SETREADONLY

    EM_SETRECT

    EM_SETRECTNP

    EM_SETSEL

    EM_SETTABSTOPS

    EM_SETWORDBREAKPROC

    EM_UNDO

    EN_CHANGE

    EN_ERRSPACE

    EN_HSCROLL

    EN_KILLFOCUS

    EN_MAXTEXT

    EN_SETFOCUS

    EN_UPDATE

    EN_VSCROLL

    WM_COMMAND

    WM_COPY

    WM_CTLCOLOREDIT

    WM_CUT

    WM_PASTE

    WM_UNDO

     

    ▲ページトップに戻る

    【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします
    inserted by FC2 system