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);
联系客服