在内存DC中分别用API绘图和直接内存拷贝绘图时遮挡关系 70

在内存DC中,同时用API绘图和内存拷贝绘图时的遮挡问题如何解决?问题:按照我的思路是,内存拷贝绘图在API绘图之后,因该会把API绘制的图形遮挡,但事实相反,API绘制... 在内存DC中,同时用API绘图和内存拷贝绘图时的遮挡问题如何解决?
问题:按照我的思路是,内存拷贝绘图在API绘图之后,因该会把API绘制的图形遮挡,但事实相反,API绘制的图形永远都在内存拷贝绘制的图形之上,这是为什么,请各位大侠帮帮小弟!
截图如下:

绘图代码如下:
//开始绘图
GDI.BeginDraw();
GDI.EraseBackground();//擦除背景
//API绘制打印信息
for( int i = 0; i < PrinterSystem.GetPrinterCount(); i++ )
{
::memset( szBuffer, 0, NUMLINES( szBuffer ) );
::TextOut( GDI.GetRenderDC(), 10, cyChar * i, szBuffer,
wsprintf ( szBuffer, TEXT("%d : %s"), i, PrinterSystem.GetPrinterName(i).c_str() ) );
}
//API绘制一矩形框
Rectangle( GDI.GetRenderDC(), 0, 0, 100, 100 );
//通过内存拷贝绘制一位图
GDI.DrawImage( ButtonPosX, ButtonPosY,
ButtonW, ButtonH,
pButtonData );
GDI.EndDraw();
//结束绘图

说明:
其中的GDI是CGDI类的一个对象,主要代码如下:
bool CGDI::Initialize( HWND hWnd, unsigned long w, unsigned long h )
{
if( NULL == hWnd )return false;
if( 0 == w || 0 == h )return false;
m_hWnd = hWnd;
m_ulWidth = w;
m_ulHeight = h;
m_hDC = ::GetDC ( m_hWnd );
if( NULL == m_hDC )return false;
m_hRenderDC = ::CreateCompatibleDC( m_hDC );
if( NULL == m_hRenderDC )return false;
New( &m_pRenderBuffer, m_ulWidth*m_ulHeight*4 );
if( NULL == m_pRenderBuffer )return false;
::memset( m_pRenderBuffer, 0, m_ulWidth*m_ulHeight*4 );
return true;
}
bool CGDI::BeginDraw()
{
m_hRenderBMP = ::CreateBitmap( m_ulWidth, m_ulHeight, 1, 32, m_pRenderBuffer );
::SelectObject( m_hRenderDC, m_hRenderBMP );
return true;
}
bool CGDI::EraseBackground()
{
::memset( m_pRenderBuffer, 0, m_ulWidth*m_ulHeight*4 );
return true;
}
bool CGDI::EndDraw()
{
::BitBlt ( m_hDC, 0, 0, m_ulWidth, m_ulHeight, m_hRenderDC, 0, 0, SRCCOPY );
::DeleteObject( m_hRenderBMP );
return true;
}
问题补充:
我的思路是,用API函数在内存DC上绘图,像素因该是输出在创建被选进内存DC中的位图句柄的缓冲区中。之后我用
bool CGDI::DrawImage( long x, long y,
unsigned long ulWidth, unsigned long ulHeight,
unsigned char* pData )
绘制一位图,此函数直接拷贝像素到此缓冲区中。
然后在
bool CGDI::EndDraw()
调用里BitBlt到前台DC中。
按道理,DrawImage绘制的像素会覆盖掉API绘制的像素,但事实相返,无论我颠倒DrawImage和 API的绘制顺序,结果始终是API绘制的像素覆盖掉DrawImage绘制的像素。
百思不得其解,难道用API函数在内存DC上绘图,像素不是输出在创建被选进内存DC中的位图句柄的缓冲区中。那它又输出在哪里?
请各位大侠帮忙看看!
展开
 我来答
victor8675309
2009-04-28 · TA获得超过3228个赞
知道小有建树答主
回答量:467
采纳率:0%
帮助的人:373万
展开全部
没有仔细看明白,不过你可以尝试使用beginpath()和endpath()函数对绘图进行锁定。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式