・メンバ変数について
・クラスについて
・MFCの使用について
・AppWizardの使用について
・AppWizardの使用した場合のファイルの入出力
・CStringとcharの変換方法
・charからint型への変換方法
・charからdouble型への変換方法
・DocクラスからViewクラスへのデータの受け渡し
・SDIでの画面文字出力方法
・ツールバーに新しくメニューを追加する方法,そこでダイアログを呼び出す方法
・メンバ変数について
変数は大文字と小文字を識別しているので定義するときは大文字と小文字を混同しないように注意すること.
・クラスについて
引数を持っていないクラス等,初期化の必要のないクラスについては,
クラスと同じ名前のメンバ変数を作ってコンストラクタしなくても動作する.
また,main関数の中などで引数のないクラスを宣言するときは()は必要ない.
()をつけると別のメンバ変数だと解釈されてプログラムが正常動作しない.
・MFCの使用について
コンソール画面(DOS窓)を使用するときはプロジェクト作成時に
Win32 Console Applicationを選択してプログラミングすれば良い.
MFCを使用するときはプロジェクト作成時にWin32 Applicationを選択し
[プロジェクト]−[設定]で[プロジェクト]ダイアログを開き
「共有DLLでMFCを使用」を設定し,ヘッダファイルafxwin.h等を
インクルードしてプログラミングすれば良い.
プログラムの記述として
アプリケーションクラスとウィンドウクラスをはじめとしたクラスの記述とコンストラクタ
およびそれらのクラスに属するメンバ変数の記述,マウスやキーボード入力とプログラムを対応
させるメッセージマップの記述が必要となる.
ツールバーのメニュー等使用する場合はリソースファイル(*.rc)を新規作成し,
ソースファイル(*.cpp)上でメッセージファイルとメンバ変数の記述すれば
マウスやキーボード入力のときと同様にプログラムに対応させることができる.
リソースファイルの作成は[ファイル]-[新規作成]でリソーススクリプトを作成し
[挿入]でメニュー等を選択すれば良い.
リソーススクリプトを作成しないと,ビルド時にエラーでなくても実行時にエラー発生し
プログラムが正常動作しない.
ボタン等の付加は既にリソースがあれば,それにシンボルブラウザにて新規にIDを追加し
ウィンドウクラスでボタンをつくり,メンバ変数およびメッセージマップを記述すれば
機能する.
・AppWizardの使用について
プロジェクト作成時にMFC AppWizard(exe)を使用すれば作成可能.
クラスはウィンドウクラス,アプリケーションクラスの他に
ドキュメントクラス,ビュークラスが作成される.
基本的にはREM文でTODOと記述してある部分のみ記述すれば良い.
AppWizardを用いるとメッセージハンドラを用いて登録すれば,
メッセージマップは自動的に作成されるので自分で記述する必要はなくなる.
メンバ変数の追加と初期化および処理のみ記述すれば良いらしい.
・AppWizardの使用した場合のファイルの入出力
AppWizardを用いてプロジェクト作成するといくつかのファイルが作成されるが
Docクラスのcppファイルをみるとシリアライズ関数が記述されている.
そこに
ar << データ変数
と記述すればファイル出力となり
ar >> データ変数
と記述すればファイル入力となる.
しかし上記の方法だと自分でファイル出力したファイルについては読みこみ可能だが
他のアプリケーションで編集されたファイル等を読みこもうとすると
「予期しない形式です」といったエラーが発生してしまい正常に読みこめない.
そのようなときは
ar >> データ変数
の代わりに下記のように記述するととりあえず読みこめる.
char pb[10000];
ar.Read( pb, 10000 );
データ変数 = pb;
ただし,この方式だとはじめから10000以上の長さのデータは読みこめない.
ar.ReadString( データ変数 );
のようにすると1行分のデータが読み取れる.
同様に
CString s;
s.Format("あいうえお,%f,かきくけこ\n",(double型のデータ変数));
ar.WriteString( s );
のようにすれば1行分のデータがファイル出力できる.
CString buffer, openfile = "";
char crlf[] = "\n";
while(ar.ReadString(buffer) != NULL){
openfile = openfile + buffer + crlf;
}
データ変数 = openfile;
のようにすれば複数行のデータも取得できる.
GetLength,Find,Right,Leftなどのメンバ変数をつかうことにより
1行の中の適切な文字列を抽出することができる.
・CStringとcharの変換方法
CString DataNum = "例1";
char *DataNum2 = new char[ReadData.GetLength()+1];
strcpy( DataNum2, DataNum );
delete [] DataNum2;
のようにすればCStringからcharへ変換できる.
ただし,for文などでひとつのループ中で同じ変数名(*DataNum2)を
用いるとメモリエラー生じるので,その場合は変数名を変更すること.
逆は=を用いるだけで良い.
・charからint型への変換方法
sscanfを用いて下記のようにすればchar型からint型に変換できる.
sscanf(DataNum2,"%d",&DataNum3);
↑DataNum2はchar型,DataNum3はint型
・charからdouble型への変換方法
strtodを用いて下記のようにすればchar型からdouble型に変換できる.
char *aaa, *stopstring;
aaa = "1.234e+56";
m_ActPosAct = strtod( aaa, &stopstring );
・DocクラスからViewクラスへのデータの受け渡し
ViewクラスでDocクラスのデータ(変数)を用いたい場合は
CMy040810RakMeawDoc* pDoc = GetDocument();
↑クラス名
のようにすれば
pDoc->Name ←Docクラスで定義した変数Name
のようにしてDocクラスの変数を用いることができる.
ファイル入出力等に使う変数はDocクラスで定義しておき
別のクラスで必要なときは上のような方法で読み出せば良い.
・SDIでの画面文字出力方法
例えばViewクラスのOnDrawのTODOにて下記のように記述すれば良い.
CRect rect;
GetClientRect( rect );
pDC->SetTextAlign(TA_BASELINE | TA_CENTER );
CString s;
s.Format("%d",123);
pDC->TextOut( ( rect.right / 2),(rect.bottom / 2 ), s);
またpDC->TextOutの前に
pDC->SetTextColor(RGB(255,0,0)); //この場合は赤
と記述しておくと文字の色を指定できる.
・ツールバーに新しくメニューを追加する方法,そこでダイアログを呼び出す方法
リソースタブをクリックしてメニューのディレクトリのIDR_MAINFRAME
に新しいメニューを追加し,右クリックしてプロパティでIDとキャプションを追加する.
その後同様に右クリックしてCLASSWIZARDを起動させメッセージのCOMMANDをダブルクリックして
ハンドルを追加する.このとき新しいメンバ関数も追加される.
MainFrame.cppのメッセージハンドラの新しいメンバ関数に新しいメニューをクリックしたときの
内容を記述すれば良い.
また,ダイアログを作成し,ダイアログのクラスを作成しておいて
上記に記述した新しいメンバ関数において
CDialogMenu 変数;
↑ダイアログのクラス名
変数.DoModal();
とすればダイアログを呼び出すことができる.
ただし,新しく追加したダイアログのクラスに関与するヘッダファイルを
インクルードしておく必要がある.
ダイアログの初期化はダイアログのリソースを右クリックしてCLASSWIZARDを起動し
WM_INITDIALOGのメッセージハンドラを追加することによりダイアログを初期化する
クラスを作成できる.
| |