ここまでは、前回と同じです。しかし、今回は Create()関数の引数の3番目も省略しています。 (省略するとWS_OVERLAPPEDWINDOWスタイルになる)// 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, "猫でもわかるストリング"); }
さて、ここでは新しくCStringクラスが出ています。 これは、文字列の取り扱いが非常に簡単になります。 このクラスのオブジェクトはBASICの文字列の扱いのような ことができます。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); }
dc.TextOut(20, 40, str1 + str2);
C言語てはとてもこのような扱いはできませんでした。 これは、便利です。また、 TextOut()関数は
となっています。文字列としてCStringクラスを使うと最後のnCount引数か 不要となります。CDC::TextOut virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); BOOL TextOut( int x, int y, const CString& str );
次にメンバ関数ではなくSDKのAPI関数を使いたいときはどうすればよいのでしょうか。 これは、スコープ解決演算子(::)を使います。
::TextOut();
とすればこれは、APIの関数と言うことになります。 では、この時必要なhdcはどうすればよいのでしょうか。
となっています。戻り値はCDCクラスへのポインタです。 CDCクラスを調べるとデータメンバにm_hDCというのがあります。 従ってGetDC()->m_hDCでデバイスコンテキストハンドルが 取得できます。CWnd::GetDC CDC* GetDC( );
さらに、別な方法として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)に書いて分離します。
Update 06/Jan/1998 By Y.Kumei