我可以创建只是另一个设备上下文的一部分的设备上下文吗?

时间:2010-12-29 03:34:50

标签: windows winapi device-context

我已经将一个图形控件子类化,该控件将设备上下文句柄HDC作为输入并将其用于绘图。我的新控件只是以较大图像为中心的原始控件。我希望能够调用原始控件的Draw()方法重用代码,但我不确定如何继续。

以下是这个想法:

void CCheckBox::DrawCtrl( HDC hdc, HDC hdcTmp, LPSIZE pCtlSize, BYTE alpha ) {
    // original method draws a checkbox
}

void CBorderedCheckBox::DrawCtrl( HDC hdc, HDC hdcTmp, LPSIZE pCtlSize, BYTE alpha ) {
    // Draw my image here
    // Create new hdc2 and hdcTemp2 which are just some portion of hdc and hdcTemp
    //   For example, hdc2 may just be a rectangle inside of hdc that is 20 pixels 
    //   indented on all sides.
    // Call CCheckBox::DrawCtrl() with hdc2 and hdcTemp2
}

2 个答案:

答案 0 :(得分:3)

我认为您可能会对设备上下文的含义感到困惑。设备上下文是内存中可以绘制的位置,无论是屏幕缓冲区还是位图或其他内容。因为我想你只想画在屏幕上,你只需要一个DC。为了实现你想要的,我建议将一个矩形传递给告诉它绘制位置的函数。可选地,性能较差,您可以为较小的区域创建一个新的Bitmap,并为该函数提供Bitmap的DC来绘制。现在我想起来了,这可能就是你的意思:P祝你好运!

答案 1 :(得分:0)

虽然不是万无一失,但您可以使用SetViewportOrgExSelectObject的组合将DC作为DC的子部分伪造,并将区域剪切到相关的子区域。

这种方法存在的问题是,如果绘图代码已经使用了需要重写的API,请注意它需要将其掩蔽和偏移与现有的偏移和剪切区域相结合。