【问题标题】:Can I create a device context that is just a portion of another device context?我可以创建一个设备上下文,它只是另一个设备上下文的一部分吗?
【发布时间】:2011-05-31 21:05:36
【问题描述】:

我对一个图形控件进行了子类化,该控件将设备上下文句柄 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
}

【问题讨论】:

    标签: windows winapi gdi


    【解决方案1】:

    我认为您可能对什么是设备上下文感到困惑。设备上下文是内存中可以绘制的位置,可以是屏幕缓冲区、位图或其他东西。由于我想您只想在屏幕上绘图,因此您只需要一个 DC。为了完成你想要的,我建议将一个矩形传递给告诉它在哪里绘制的函数。或者,在性能较差的情况下,您可以为较小的区域创建一个新的位图,并为该函数提供位图的 DC 进行绘制。现在我想起来了,这可能就是你最初的意思:P 祝你好运!

    【讨论】:

      【解决方案2】:

      虽然不是万无一失,但您可以通过使用 SetViewportOrgExSelectObject 的组合以及将区域剪裁到相关子区域来将 DC 伪装成 DC 的子部分。

      这种方法的问题在于,如果绘图代码已经使用了这些 API,则需要重写以意识到它需要将其掩码和偏移与现有的偏移和剪切区域结合起来。

      【讨论】:

        猜你喜欢
        • 2015-07-09
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2013-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-17
        相关资源
        最近更新 更多