第3章 テキストの表示 その2


さて、今回はテキストの表示の別な方法とCStringクラスについて 解説します。
これだけ見ると、前回の方法で同じものが作れます。 しかし、いろいろな方法で文字の表示を実現しています。 早速サンプルを見てみましょう。

// text01.cpp #include <afxwin.h> class CMyWindow : public CFrameWnd { public: CMyWindow(); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() CMyWindow::CMyWindow() { Create(NULL, "猫でもわかるストリング"); }

ここまでは、前回と同じです。しかし、今回は Create()関数の引数の3番目も省略しています。 (省略するとWS_OVERLAPPEDWINDOWスタイルになる)

void CMyWindow::OnPaint() { CPaintDC dc(this); CString str1 = "粂井"; CString str2 = "康孝"; CString str3; str3 = str1 + str2; dc.TextOut(20, 20, "猫でもわかるプログラミング", 26); dc.TextOut(20, 40, str1 + str2); dc.TextOut(20, 60, str3); ::TextOut(GetDC()->m_hDC, 20, 80, "APIを使いました", 15); ::TextOut(dc.m_ps.hdc, 20, 100, "別な方法です", 12); }

さて、ここでは新しくCStringクラスが出ています。 これは、文字列の取り扱いが非常に簡単になります。 このクラスのオブジェクトはBASICの文字列の扱いのような ことができます。

dc.TextOut(20, 40, str1 + str2);

C言語てはとてもこのような扱いはできませんでした。 これは、便利です。また、 TextOut()関数は

CDC::TextOut virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); BOOL TextOut( int x, int y, const CString& str );

となっています。文字列としてCStringクラスを使うと最後のnCount引数か 不要となります。

次にメンバ関数ではなくSDKのAPI関数を使いたいときはどうすればよいのでしょうか。 これは、スコープ解決演算子(::)を使います。

::TextOut();

とすればこれは、APIの関数と言うことになります。 では、この時必要なhdcはどうすればよいのでしょうか。

CWnd::GetDC CDC* GetDC( );

となっています。戻り値はCDCクラスへのポインタです。 CDCクラスを調べるとデータメンバにm_hDCというのがあります。 従ってGetDC()->m_hDCでデバイスコンテキストハンドルが 取得できます。

さらに、別な方法としてCPaintDCクラスのデータメンバを 調べるとm_psと言うのがあります。これは、PAINTSTRUCT構造体を 保持しています。この中にhdcメンバがありますから、これを使っても良いですね。

class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp MyApp;

ここは、前回と全く同じです。

さて、いままではわかりやすくするためソースを すべて*.cppというファイルにまとめて書きましたが、 普通はこのような書き方はしません。クラス宣言の部分を ヘッダーファイル(*.h)に書いて分離します。


[MFC Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 06/Jan/1998 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。