我已经将一个图形控件子类化,该控件将设备上下文句柄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
}
答案 0 :(得分:3)
我认为您可能会对设备上下文的含义感到困惑。设备上下文是内存中可以绘制的位置,无论是屏幕缓冲区还是位图或其他内容。因为我想你只想画在屏幕上,你只需要一个DC。为了实现你想要的,我建议将一个矩形传递给告诉它绘制位置的函数。可选地,性能较差,您可以为较小的区域创建一个新的Bitmap,并为该函数提供Bitmap的DC来绘制。现在我想起来了,这可能就是你的意思:P祝你好运!
答案 1 :(得分:0)
虽然不是万无一失,但您可以使用SetViewportOrgEx和SelectObject的组合将DC作为DC的子部分伪造,并将区域剪切到相关的子区域。
这种方法存在的问题是,如果绘图代码已经使用了需要重写的API,请注意它需要将其掩蔽和偏移与现有的偏移和剪切区域相结合。