C ++ MoveToExおよびLineTo関数の描画



C Movetoex Lineto Function Drawing



関数MoveToExおよびLineToは、次のように宣言されています。

WINGDIAPI BOOL WINAPI MoveToEx(__ in HDC hdc、__ in int x、__ in int y、__ out_opt LPPOINT lppt)



hdc 現在のデバイスのハンドルです。

バツ 横方向のX軸の位置です。通常、原点は画面の左上隅にあります。



Y 垂直方向のY軸の位置です。

lppt 移動前の座標位置です。

WINGDIAPI BOOL WINAPI LineTo(__ in HDC hdc、__ in int x、__ in int y)



hdc 現在のデバイスのハンドルです。

バツ 横方向のX軸の位置です。通常、原点は画面の左上隅にあります。

Y 垂直方向のY軸の位置です。

状況1:

新しいテストMFCプロジェクト

[クラスビュー]-> [CTestView]-> [クラスウィザード]-> [メンバー変数]-> [カスタム変数の追加]

CPoint m_Cpiont

[クラスビュー]-> [CTestView]-> [クラスウィザード]-> [メッセージ]-> [WM_LBUTTONDOWN]-> [OnLButtonDown]をダブルクリックします

void CTestView :: OnLButtonDown(UINT nFlags、CPointポイント)

// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
m_Cpiont =ポイント
/ * MessageBox(_T( 'これは2つの属性を持つメッセージボックスです!')、_ T( 'Title')、MB_ICONEXCLAMATION

[クラスビュー]-> [CTestView]-> [クラスウィザード]-> [メッセージ]-> [WM_LBUTTONUP]-> [OnLButtonUp]をダブルクリックします

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
HDC hdc
hdc = :: GetDC(m_hWnd)
//線の始点に移動します
MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
//線を引く
LineTo(hdc、point.x、point.y)
:: ReleaseDC(m_hWnd、hdc)
CView :: OnLButtonUp(nFlags、point)
}

状況2:

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)

/ * :: ReleaseDC(m_hWnd、hdc)* /

CClientDC dc(this)
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
CView :: OnLButtonUp(nFlags、point)
}

CClientDCオブジェクトが作成されると、GetDCC関数が自動的に呼び出され、デバイス記述テーブルのオブジェクトが取得されます。オブジェクトが破棄されると、ReleaseDC関数が自動的に呼び出され、デバイス記述子が自動的に解放されます。

状況3:

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)
/ * :: ReleaseDC(m_hWnd、hdc)* /

// CClientDC dc(this)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

CClientDC dc(GetParent())
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
CView :: OnLButtonUp(nFlags、point)
}

前の方法は、プログラムウィンドウのクライアント領域に線を引くことでしたが、ツールバーとメニューバーに線を引くことはできません。ビューウィンドウはフレームウィンドウ、つまりCMainFrameクラスに関連付けられたウィンドウであるため(プログラムを作成するときに、関数の特定の名前がわからない場合は、関数の関数に基づいてその名前を推測できます。 。)親ポインターを取得するには、Get + xxを使用できます。ここでは、親ポインターをGetParentにすることができます。

状況4:

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)
/ * :: ReleaseDC(m_hWnd、hdc)* /

// CClientDC dc(this)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CClientDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

CWindowDC dc(GetParent())
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
CView :: OnLButtonUp(nFlags、point)
}

状況5:

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)
/ * :: ReleaseDC(m_hWnd、hdc)* /

// CClientDC dc(this)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CClientDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

CWindowDC dc(GetDesktopWindow())
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
CView :: OnLButtonUp(nFlags、point)
}

みがきます

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)
/ * :: ReleaseDC(m_hWnd、hdc)* /

// CClientDC dc(this)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CClientDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetDesktopWindow())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

//絵筆を使って線を引く
// BOOL CreatePen(int nPenStyle、int nWidth、COLORREF crColor)
// nPenStyle:実線点線破線nWidth:サイズcrColor:RGB(0,0,0)〜RGB(255,255,255)
CPenペン(PS_DASH、1、RGB(255,0,0))
// PS_SOLID実線PS_DASH点線PS_DOT点線(後者の2つの幅は1未満である必要があります)
CClientDC dc(this)
CPen * pOldPen = dc.SelectObject(&Pen)
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
dc.SelectObject(pOldPen)


CView :: OnLButtonUp(nFlags、point)
}

ペイントブラシ:

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)
/ * :: ReleaseDC(m_hWnd、hdc)* /

// CClientDC dc(this)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CClientDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetDesktopWindow())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

絵筆を使って線を引く
BOOL CreatePen(int nPenStyle、int nWidth、COLORREF crColor)
NPenStyle:実線点線破線nWidth:サイズcrColor:RGB(0,0,0)〜RGB(255,255,255)
// CPen Pen(PS_DASH、1、RGB(255,0,0))
PS_SOLID実線PS_DASH点線PS_DOT点線(後者の2つの幅は1未満である必要があります)
// CClientDC dc(this)
// CPen * pOldPen = dc.SelectObject(&Pen)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)
//dc.SelectObject(pOldPen)

//ペイントブラシ
CBrushブラシ(RGB(222,0,0))
CClientDC dc(this)
// _ AFXWIN_INLINE void CDC :: FillRect(LPCRECT lpRect、CBrush * pBrush)
// lpRectは、RECT構造体またはCRECTオブジェクトへのポインタです。
//構造またはオブジェクトには、塗りつぶされる長方形の論理座標が含まれています
// PBrushは、長方形を塗りつぶすために使用されるブラシポインタを指します
dc.FillRect(CRect(m_Cpiont、point)、&brush)
/ *インラインCRect :: CRect(_In_ POINT topLeft、_In_ POINT bottomRight)* /
//この関数は、左右の境界線を含むすべての長方形を塗りつぶしますが、右と下の境界線は塗りつぶしません
CView :: OnLButtonUp(nFlags、point)
}

ビット描画ブラシ:

ビットマップを追加

[ソリューションエクスプローラー]-> [リソースファイル]-> [追加] [リソース]

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
// HDC hdc
// hdc = :: GetDC(m_hWnd)
線の始点に移動します
// MoveToEx(hdc、m_Cpiont.x、m_Cpiont.y、NULL)
線を引く
//LineTo(hdc,point.x,point.y)
/ * :: ReleaseDC(m_hWnd、hdc)* /

// CClientDC dc(this)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CClientDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetParent())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

// CWindowDC dc(GetDesktopWindow())
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)

絵筆を使って線を引く
BOOL CreatePen(int nPenStyle、int nWidth、COLORREF crColor)
NPenStyle:実線点線破線nWidth:サイズcrColor:RGB(0,0,0)〜RGB(255,255,255)
// CPen Pen(PS_DASH、1、RGB(255,0,0))
PS_SOLID実線PS_DASH点線PS_DOT点線(後者の2つの幅は1未満である必要があります)
// CClientDC dc(this)
// CPen * pOldPen = dc.SelectObject(&Pen)
//dc.MoveTo(m_Cpiont)
//dc.LineTo(point)
//dc.SelectObject(pOldPen)

//ペイントブラシ
// CBrushブラシ(RGB(222,0,0))
// CClientDC dc(this)
// _ AFXWIN_INLINE void CDC :: FillRect(LPCRECT lpRect、CBrush * pBrush)
// lpRectは、RECT構造体またはCRECTオブジェクトへのポインタです。
//構造またはオブジェクトには、塗りつぶされる長方形の論理座標が含まれています
// PBrushは、長方形を塗りつぶすために使用されるブラシポインタを指します
/*dc.FillRect(CRect(m_Cpiont,point),&brush)* /
/ *インラインCRect :: CRect(_In_ POINT topLeft、_In_ POINT bottomRight)* /
//この関数は、左右の境界線を含むすべての長方形を塗りつぶしますが、右と下の境界線は塗りつぶしません

//ビットマップオブジェクトを作成します
CBitmapビットマップ
ビットマップ.LoadBitmap(IDB_BITMAP1)。
CBrushブラシ(&ビットマップ)
CClientDC dc(this)
dc.FillRect(CRect(m_Cpiont、point)、&brush)

CView :: OnLButtonUp(nFlags、point)
}

まず、TestView.cppにヘッダーファイルを追加します

#include'resource.h '
ファイルがインクルードされていないため、コンパイラはヘッダーファイルでこの識別子を見つけることができません。生成したコントロールのID名が、変更後にresource.hで正常に更新されていない可能性があります。その後、.hファイルで変更されたコントロールを検索すると、次のように表示されます。

#define IDB_BITMAP1 310

透明ブラシ:

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します


//透明ブラシ
CClientDC dc(this)
//長方形を描く
dc.Rectangle(CRect(m_Cpiont、point))

CView :: OnLButtonUp(nFlags、point)
}

void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します

// FillRectとRectangleの違いは、前者は描画用のブラシを提供するため、このブラシを直接使用して長方形を塗りつぶすことです。
最初にデバイスリストで必要なブラシを選択する必要はありません。後者はブラシを提供しないため、最初にデバイス記述テーブルでブラシを選択する必要があります。

//透明ブラシ
CClientDC dc(this)
//空のブラシを作成します
// GetStockObjectこの関数を使用して、黒または白のブラシハンドルを取得します
CBrush * pbrush = CBrush :: FromHandle((HBRUSH)GetStockObject(NULL_BRUSH))
// WINGDIAPI HGDIOBJ WINAPI GetStockObject(_In_ int i)は、強制的にHBRUSHに変換されたHGDIOBJECTを返します
//クラスの静的メンバー関数を呼び出す方法であるFromHandle関数を呼び出す方法
//デバイスの説明テーブルで空のブラシを選択します
CBrush * pOldBrush = dc.SelectObject(pbrush)
//長方形を描く
dc.Rectangle(CRect(m_Cpiont、point))
//前のブラシを復元します
dc.SelectObject(pOldBrush)

CView :: OnLButtonUp(nFlags、point)
}

連続線を引く:

[クラスビュー]-> [CTestView]-> [クラスウィザード]-> [メンバー変数]-> [カスタム変数の追加]

[クラスビュー]-> [CTestView]-> [クラスウィザード]-> [メッセージ]-> [WM_MOUSEMOVE]-> [OnMouseMove]をダブルクリックします

void CTestView :: OnLButtonDown(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
m_Cpiont =ポイント
m_bDraw = true
CView :: OnLButtonDown(nFlags、point)
}


void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
m_bDraw = false
CView :: OnLButtonUp(nFlags、point)
}

void CTestView :: OnMouseMove(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
CClientDC dc(this)
CPenペン(PS_SOLID、1、RGB(255、0、0))
CPen * pOldPen = dc.SelectObject(&pen)
if(m_bDraw == true)
{{
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
//開始点を変更します
m_Cpiont =ポイント
}
dc.SelectObject(pOldPen)
CView :: OnMouseMove(nFlags、point)
}

扇形の線を引きます:

[クラスビュー]-> [CTestView]-> [クラスウィザード]-> [メンバー変数]-> [カスタム変数の追加]

void CTestView :: OnLButtonDown(UINT nFlags、CPointポイント)

// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
m_Cpiont =ポイント
M_CpOld =ポイント// m_CpOldを初期化します
m_bDraw = true
/ * MessageBox(_T( 'これは2つの属性を持つメッセージボックスです!')、_ T( 'Title')、MB_ICONEXCLAMATION


void CTestView :: OnLButtonUp(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
m_bDraw = false
CView :: OnLButtonUp(nFlags、point)
}


void CTestView :: OnMouseMove(UINT nFlags、CPointポイント)
{{
// TODO:メッセージハンドラコードを追加するか、ここでデフォルト値を呼び出します
CClientDC dc(this)
CPenペン(PS_SOLID、1、RGB(255、0、0))
CPen * pOldPen = dc.SelectObject(&pen)
if(m_bDraw == true)
{{
dc.MoveTo(m_Cpiont)
dc.LineTo(point)
dc.LineTo(m_CpOld)
開始点を変更します
// m_Cpiont =ポイント
m_CpOld =ポイント
}
dc.SelectObject(pOldPen)
CView :: OnMouseMove(nFlags、point)
}