65.9K
CodeProject 正在变化。 阅读更多。
Home

带有旋转、裁剪、透明度的内存设备上下文缓冲画布

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (10投票s)

2003年6月4日

1分钟阅读

viewsIcon

83932

downloadIcon

3190

用于缓冲和旋转绘图上下文的代码。

Sample Image - demo1.jpg

引言

我需要在程序中旋转一些绘图内容,但窗口的 DC 中没有旋转方法。所以我编写了一个画布类,它可以进行旋转并解决其他问题!

缓冲画布类将存储所有 DC 操作,并执行一次复制到屏幕。

优点

  1. 解决闪烁问题
  2. 能够旋转文本、绘图和图像
  3. 裁剪超出边界的内容
  4. 透明模式,用于将背景颜色替换为其他窗口内容

使用代码

该类名为 CBuffCanvas,并且有很少的函数调用需要记住

构造函数

CBuffCanvas(CWnd *pWnd, CRect bounds, COLORREF bkColor, bool isTransparent);

需要指向窗口的指针、边界矩形、背景颜色以及是否透明

绘图上下文

CDC* GetDC();

返回缓冲画布的 DC。使用此 DC 执行所有绘图操作。

旋转

void Rotate(int degrees, CPoint origin); void Rotate(int degrees);

从原点(可选)逆时针旋转绘图。

复制到屏幕

void Draw(CDC* screen);

接受指向绘图上下文的指针,并将缓冲的上下文复制到屏幕上。

CBuffCanvas memCanvas(this, CRect(50,50,350,350), RGB(100,100,100), true);

// Get the DC from the buffer for drawing
CDC * pmemDC = memCanvas.GetDC();

// Do some drawing and text
CPen bluePen(PS_SOLID, 1, RGB(0,0,255));
pmemDC->SelectObject(bluePen);
pmemDC->MoveTo(120,120);
pmemDC->LineTo(120,250);
pmemDC->TextOut(130,150, "Buffer Canvas Demo");

// Rotate the canvas 30 degrees counter-clockwise
memCanvas.Rotate(30);

// Call the draw function to copy the buffered canvas to the screen
memCanvas.Draw(pDC);

请注意,在使用透明模式时,可能会存在性能问题。如果您不想闪烁,请不要尝试绘制大面积区域。另外,尝试在程序的其他部分而不是 OnPaint 函数中进行旋转。

关注点

我使用 BitBlt 实现透明绘制。此外,逐位旋转通过三角函数恢复到最佳状态。

结论

这是我第一次尝试,希望对大家有用!

© . All rights reserved.