また、ペンは実践だけではなく点線、ダッシュなどのペンスタイルを 選択することができます。
入門書などによくでいるサンプルみたいですね。
ペンを太くすると始点、終点が丸まります。指定した 座標にペンの中心が来ます。
また、このサンプルではわかりませんが、(0,0)-(100,100)の直線とか 四角形は(100, 100)の点を描画しません。
実線以外のペンスタイルは太さが1以下(実際は1)の時しか有効でありません。
では、実際のソース・プログラムを見てみましょう。特に難しいところは
ありません。
これは、特にどうということもありません。// grph03.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMyWindow : public CFrameWnd { public: CMyWindow(); protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT, CPoint); DECLARE_MESSAGE_MAP() };
いつもとたいして変わりませんが、ウィンドウを作るときに 大きさと座標を指定しています。// grph03.cpp #include <afxwin.h> #include "grph03.h" CMyApp myApp; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() CMyWindow::CMyWindow() { Create(NULL, "猫でもわかるグラフィックス", WS_OVERLAPPEDWINDOW, CRect(100, 100, 100 + 240, 100 + 240)); }
これも、ペンスタイルをPS_***にしているだけで前回までの 知識で充分理解できますね。void CMyWindow::OnPaint() { CPaintDC dc(this); CPen pen[8], *pOldPen; //赤の実線 pen[0].CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); pOldPen = (CPen*)dc.SelectObject(&pen[0]); dc.MoveTo(30, 20); dc.LineTo(200, 20); //水色の太さ20の実線 pen[1].CreatePen(PS_SOLID, 20, RGB(0, 255, 255)); dc.SelectObject(&pen[1]); dc.MoveTo(30, 40); dc.LineTo(200, 40); //水色の太さ40の実線 pen[2].CreatePen(PS_SOLID, 40, RGB(255, 0, 255)); dc.SelectObject(&pen[2]); dc.MoveTo(30, 80); dc.LineTo(200, 80); //太さ1の黒の実線 pen[3].CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); dc.SelectObject(&pen[3]); dc.MoveTo(30, 40); dc.LineTo(200, 40); dc.MoveTo(30, 80); dc.LineTo(200, 80); //PS_DOT 太さは1のみです pen[4].CreatePen(PS_DOT, 1, RGB(0, 0, 0)); dc.SelectObject(&pen[4]); dc.MoveTo(30, 120); dc.LineTo(200, 120); //PS_DASH pen[5].CreatePen(PS_DASH,1, RGB(0, 0, 0)); dc.SelectObject(&pen[5]); dc.MoveTo(30, 140); dc.LineTo(200, 140); //PS_DASHDOT pen[6].CreatePen(PS_DASHDOT, 1, RGB(0, 0, 0)); dc.SelectObject(&pen[6]); dc.MoveTo(30, 160); dc.LineTo(200, 160); //PS_DASHDOTDOT pen[7].CreatePen(PS_DASHDOTDOT, 1, RGB(0, 0, 0)); dc.SelectObject(&pen[7]); dc.MoveTo(30, 180); dc.LineTo(200, 180); //デフォルトペンに戻す dc.SelectObject(pOldPen); }
Update 05/Apr/1998 By Y.Kumei