第9章 ペンのスタイル


今回は、ペンについてもう少し詳しく見てみます。 第7章で作ったウィンドウを眺めてみると クライアント領域を縁取りしている水色の線が少し細いように思いませんか? これは、線の半分がクライアント領域からはみ出しているからです。 太いペンで(0,0)から(100,0)まで直線を描画すると ペンの中心がこの座標を通るように描画されます。 従ってクライアント領域の左上、右下の座標を選んで 四角形を描画しても線の太さの半分はクライアント領域の外側に 出てしまいます。 また、最後の(100, 0)は描画されません。 (太いペンだと始点と終点が丸まるため実際には塗られますが・・)

また、ペンは実践だけではなく点線、ダッシュなどのペンスタイルを 選択することができます。


入門書などによくでいるサンプルみたいですね。

ペンを太くすると始点、終点が丸まります。指定した 座標にペンの中心が来ます。

また、このサンプルではわかりませんが、(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)); }

いつもとたいして変わりませんが、ウィンドウを作るときに 大きさと座標を指定しています。

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); }

これも、ペンスタイルをPS_***にしているだけで前回までの 知識で充分理解できますね。
[MFC Index] [総合Index] [Previous Chapter] [Next Chapter]

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