nBkMode值
|
名称
|
作用
|
OPAQUE
|
不透明的(缺省值)
|
空隙用背景色填充
|
TRANSPARENT
|
透明的
|
空隙处保持原背景图不变
|
int SetROP2( int nDrawMode );
符号常量
|
作用
|
运算结果
|
R2_BLACK
|
黑色
|
pixel = black
|
R2_WHITE
|
白色
|
pixel = white
|
R2_NOP
|
不变
|
pixel = scCol
|
R2_NOT
|
反色
|
pixel = ~scCol
|
R2_COPYPEN
|
覆盖
|
pixel = pbCol
|
R2_NOTCOPYPEN
|
反色覆盖
|
pixel = ~pbCol
|
R2_MERGEPENNOT
|
反色或
|
pixel = ~scCol | pbCol
|
R2_MERGENOTPEN
|
或反色
|
pixel = scCol | ~pbCol
|
R2_MASKNOTPEN
|
与反色
|
pixel = scCol & ~pbCol
|
R2_MERGEPEN
|
或
|
pixel = scCol | pbCol
|
R2_NOTMERGEPEN
|
或非
|
pixel = ~(scCol | pbCol)
|
R2_MASKPEN
|
与
|
pixel = scCol & pbCol
|
R2_NOTMASKPEN
|
与非
|
pixel = ~(scCol & pbCol)
|
R2_XORPEN
|
异或
|
pixel = scCol ^ pbCol
|
R2_NOTXORPEN
|
异或非
|
pixel = ~(scCol ^ pbCol)
|
pGrayPen = new CPen(PS_DOT, 0, RGB(128, 128, 128));
多边形填充方式:可使用CDC类的成员函数GetPolyFillMode和SetPolyFillMode来确定多边形的填充方式:
画弧方向:可使用CDC类的成员函数GetArcDirection和SetArcDirection来确定Arc、Chord、Pie等函数的画弧方向:
刷原点:可使用CDC类的成员函数GetBrushOrg和SetBrushOrg来确定可填充绘图函数的条纹或图案刷的起点:(缺省值为客户区左上角的坐标原点(0, 0))
BOOL m_bLButtonDown, m_bErase; // 判断是否按下左鼠标键
CPoint p0, pm; // 记录直线起点和动态终点的类变量
CPen * pGrayPen, * pLinePen; // 定义灰色和直线笔
m_bLButtonDown = FALSE; // 设左鼠标键按下为假
m_bErase = FALSE; // 设需要擦除为假
pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128));// 创建灰色笔
pLinePen = new CPen(PS_SOLID, 0, RGB(255, 0, 0));// 创建红色的直线笔
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {
m_bLButtonDown = TRUE; // 设左鼠标键按下为真
SetCapture(); // 设置鼠标捕获
// SetCursor(LoadCursor(NULL, IDC_CROSS)); // 设置鼠标为十字
p0 = point; // 保存矩形左上角
CView::OnLButtonDown(nFlags, point);
void CDrawView::OnMouseMove(UINT nFlags, CPoint point) {
SetCursor(LoadCursor(NULL, IDC_CROSS)); // 设置鼠标为十字
if (m_bLButtonDown) { // 左鼠标键按下为真
CDC* pDC = GetDC(); // 获取设备上下文
if (m_bErase) { // 需要擦除为真
pDC->MoveTo(p0); pDC->LineTo(pm); // 擦除原直线
else // 需要擦除为假
pDC->MoveTo(p0); pDC->LineTo(point); // 绘制新直线
pm = point; // 记录老终点
ReleaseDC(pDC); // 释放设备上下文
CView::OnMouseMove(nFlags, point);
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {
ReleaseCapture(); // 释放鼠标捕获
if (m_bLButtonDown) { // 左鼠标键按下为真
CDC* pDC = GetDC(); // 获取设备上下文
pDC->MoveTo(p0); pDC->LineTo(pm); // 擦除原直线
pDC->MoveTo(p0); pDC->LineTo(point); // 绘制最终的直线
m_bLButtonDown = FALSE; // 重设左鼠标键按下为假
m_bErase = FALSE; // 重需要擦除为假
ReleaseDC(pDC); // 释放设备上下文
CView::OnLButtonUp(nFlags, point);