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






4.77/5 (10投票s)
2003年6月4日
1分钟阅读

83932

3190
用于缓冲和旋转绘图上下文的代码。
引言
我需要在程序中旋转一些绘图内容,但窗口的 DC 中没有旋转方法。所以我编写了一个画布类,它可以进行旋转并解决其他问题!
缓冲画布类将存储所有 DC 操作,并执行一次复制到屏幕。
优点
- 解决闪烁问题
- 能够旋转文本、绘图和图像
- 裁剪超出边界的内容
- 透明模式,用于将背景颜色替换为其他窗口内容
使用代码
该类名为 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 实现透明绘制。此外,逐位旋转通过三角函数恢复到最佳状态。
结论
这是我第一次尝试,希望对大家有用!