1,コントロールについて | |
2,エディット | 複数行の表示 読み出し専用状態 Cut&Paste |
コントロールとは、ダイアログボックスでよく使われるもので特有の機能があります。
コントロールの種類としては「プッシュボタン」「エディットボックス」
「ラジオボタン」「チェックボックス」「スクロールバー」などがあります。
Appwizardでデフォルトの状態で作成したアプリにはコントロールは配置できません。
配置できるのは、ダイアログボックスやAppwizardの6/6でCNamaeViewの
基本クラスをCViewからCFormViewに変更することによって
コントロールの配置ができるようになります。
ここでは基本クラスをCViewからCFormViewに変更する方法をとります。
そのようにして作成されたアプリは次のようになります。
ここから、プロジェクトワークスペースでダイアログの編集をすれば配置ができます。
エディットボックスは文章の入出力を行うものでWindows95付属の「メモ帳」の操作と同じです。
「TODO:
フォームのコントロールをここに配置」というのは、「スタティックテキスト」に
よるものです。これは、ただ決まった文字を表示するだけで他になにもしません。
これは削除することにします。
コントロールからエディターボックスを選択して配置してください。
コントロールをダブルクリックするとプロパティウィンドウが現れます。
IDは「IDC_EDIT1」にします。(おそらく自動でそうなっています。)
この時点でコンパイルをすると次のようになります。
ここで、マウスのダブルクリックに対応するメッセージハンドラを作成してください。
次のような関数が作成されていると思います。
クラス | メッセージ | メンバ関数 |
CNamaeView | 左ダブルクリック | OnLButtonDblClk |
void CNamaeView::OnLButtonDblClk(UINT nFlags, CPoint point) { CFormView::OnLButtonDblClk(nFlags, point); }
さらに、エディターのメンバ変数を「m_text」にします。
このプログラムを次のようにしてください。
void CNamaeView::OnLButtonDblClk(UINT nFlags, CPoint point) { m_text="This is Edit test Program."; UpdateData(FALSE); CFormView::OnLButtonDblClk(nFlags, point); }
最初にm_textに表示したい文字データを代入します。
そして、UpdateData(FALSE)を実行します。
UpdateDataはTRUEでコントロールに入力されたデータをメンバ関数に読み込み
FALSEでメンバ関数のデータをコントロールに反映させます。
実行するとマウスの左ダブルクリックで次のようになります。
複数行表示できるようにするにはエディターのプロパティで
「複数行」と「改行を許可」をcheckします。
あとは、メンバ変数に代入する文字で、改行部分を「¥r¥n」にします。
¥rはキャラクターコードで13、¥nは10です。
クラス | メッセージ | メンバ関数 |
CNamaeView | 左ダブルクリック | OnLButtonDblClk |
void CNamaeView::OnLButtonDblClk(UINT nFlags, CPoint point) { m_text="This is Edit test Program.\r\nSecond Mozi."; UpdateData(FALSE); CFormView::OnLButtonDblClk(nFlags, point); }
実行すると2行になりました。
文字を変更できないようにするにはSetReadOnly関数でTRUEにします。
クラス | メッセージ | メンバ関数 |
CNamaeView | 左ダブルクリック | OnLButtonDblClk |
void CNamaeView::OnLButtonDblClk(UINT nFlags, CPoint point) { CEdit* e=(CEdit*)GetDlgItem(IDC_EDIT1); e->SetReadOnly(TRUE); m_text="This is Edit test Program."; UpdateData(FALSE); CFormView::OnLButtonDblClk(nFlags, point); }
こうするとダブルクリックした後はエディターの背景が灰色になり
文字が入力できなくなります。
Windows95付属の「メモ帳」など、クリップボードを介してCut&Paste
をするソフトはほとんどです。
今回作ったソフトは右クリックによってCut&Pasteできるのですが
MenuからもCut&Pasteができるようにしてみます。
Menuには標準でCopy,Cut,Pasteがあるので、それに対するメッセージハンドラを作成します。
クラス | メッセージ | メンバ関数 |
CNamaeView | ID_EDIT_COPYが押された | OnEditCopy |
CNamaeView | ID_EDIT_PASTEが押された | OnEditPaste |
CNamaeView | ID_EDIT_CUTが押された | OnEditCut |
void CNamaeView::OnEditCopy() { CEdit* e=(CEdit*)GetFocus(); e->Copy(); } void CNamaeView::OnEditPaste() { CEdit* e=(CEdit*)GetFocus(); e->Paste(); } void CNamaeView::OnEditCut() { CEdit* e=(CEdit*)GetFocus(); e->Cut(); }
GetFocusという関数は現在アクティブになっているコントロールを調べます。 今までのように、
CEdit* e=(CEdit*)GetDlgItem(IDC_EDIT1)
のようにしてもいいのですがエディターが複数ある時は
特定のエディターだけしか操作ができません。そこで
CEdit* e=(CEdit*)GetFocus()
だと現在選択されているものに対して操作できます。
エディターのプロパティではいろいろな設定ができます。
これは3つに分かれていて「一般」「スタイル」「拡張スタイル」があります。
「一般」にはIDやコントロールを表示するかどうかなどの設定ができます。
これがoffになっているとエディターの枠からはみ出るような文字は入力できません。
onにするとカーソルの位置によって文字が移動でき、枠からはみ出るような文字も
入力できます。
onにすると常にスクロールバーが表示されます。
文字が枠内にあるときは淡色になっているのですが、はみ出ると
アクティブになります。
SetReadOnly関数と同様な効果があります。
エディター内に入力された文字をすべて、大文字(小文字)にします。
C++のPageに戻る