怎样在不同位置重画其中一条线使原来位置上的线消失,并保持背景? 各位高手: 模态对话框中的CListCtrl控件中设置了背景位图,并画了很多条直线,怎样在不同位置重画其中一条线使原来位置上的线消失,并保持背景? 最好给出例子代码. 高分求教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 创建画笔的时候用xor,擦的时候再画一遍就行了 BOOL CMyView::ReDrawRect(CRect Oldrect){ CDC *pdc = GetDC(); CPen pen, *oldPen = NULL; pen.CreatePen(PS_SOLID, 2, RGB(255, 255, 255)); oldPen = pdc->SelectObject(&pen); INT OldMode = pdc->SetROP2(R2_XORPEN); pdc->MoveTo(Oldrect.TopLeft()); pdc->LineTo(Oldrect.right, Oldrect.top); pdc->MoveTo(Oldrect.right, Oldrect.top); pdc->LineTo(Oldrect.BottomRight()); pdc->MoveTo(Oldrect.BottomRight()); pdc->LineTo(Oldrect.left, Oldrect.bottom); pdc->MoveTo(Oldrect.left, Oldrect.bottom); pdc->LineTo(Oldrect.TopLeft()); pdc->SetROP2(OldMode); pdc->SelectObject(oldPen); ReleaseDC(pdc); return TRUE;}同样的位置画两遍就好了 CPen pen(PS_SOLID, 0, RGB(0,255,0));CPen* pOldPen=pDC->SelectObject(&pen);CBrush* pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);int nOldDrawMode=pDC->SetROP2(R2_XORPEN);...//绘制代码pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);pDC->SetROP2(nOldDrawMode); 按各位指导的方法直接在显示CDC上画2次实现了使直线消失,但是直接在显示CDC上画线界面切换后就使需要的线段也消失了;所以我在内存CDC上画线后拷贝到显示CDC.结果使直线消失出现了问题.在自定义函数OnDrawLine()中内存CDC上创建画笔的时候用xor,结果什么线都画不出,在系统函数OnDraw(CDC* pDC)中显示CDC上加上一句int nOldDrawMode=pDC->SetROP2(R2_XORPEN),函数OnDrawLine()中屏蔽掉相关语句, 结果重画第2次不能使直线消失,请高手们指导.代码如下:m_pMemDC和m_pBitmap 是全局变量:int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) {..... m_nMaxX = GetSystemMetrics(SM_CXSCREEN); m_nMaxY = GetSystemMetrics(SM_CYSCREEN); CDC* pDC = GetDC(); m_pMemDC->CreateCompatibleDC(pDC); m_pBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);....}void CLineTstView::OnDraw(CDC* pDC){.... CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap); pDC->BitBlt(0,0,m_nMaxX, m_nMaxY,m_pMemDC,0,0,SRCCOPY); m_pMemDC->SelectObject(pOldBitmap);}void CMyView::OnDrawLine() { CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap); CPen pen; pen.CreatePen(PS_SOLID,m_nLineWidth,m_cLineColor); CPen* pOldPen = m_pMemDC->SelectObject(&pen); CBrush* pOldBrush = (CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH); int nOldDrawMode=m_pMemDC->SetROP2(R2_XORPEN); m_pMemDC->MoveTo(m_ptStart); m_pMemDC->LineTo(point); Invalidate(FALSE); m_pMemDC->SelectObject(pOldBitmap); m_pMemDC->SelectObject(pOldPen); m_pMemDC->SelectObject(pOldBrush); m_pMemDC->SetROP2(nOldDrawMode);} 你应该将内存的 绘图上下文传递给函数,而不能直接用OnDraw(CDC *pDC); zhaogaojian(米柑年成): 能否具体点,将内存的绘图上下文传递给什么函数? 给几句代码. 求高人指教,opengl程序 关于LPD3DXSPRITE显示 如何做一个能够选择网卡的嗅探器 关于DirectX出现的问题 小问题 请问CString与string之间怎么转化??谁帮我改改代码?? 内存泄露了。不知道为什么 Why can I not see a question? wtl中BEGIN_MSG_MAP_EX(theClass)的theClass起什么作用啊 如何在VC中运行批处理文件??? 各位大侠帮忙啊!!! 请问各位,怎mo为sql表加自动编号 单文档界面试图分割的问题:在CMainFrame中如何得到分割出来的视图(CMyView)的指针?以下是我的方法,不成功!
{
CDC *pdc = GetDC();
CPen pen, *oldPen = NULL;
pen.CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
oldPen = pdc->SelectObject(&pen);
INT OldMode = pdc->SetROP2(R2_XORPEN);
pdc->MoveTo(Oldrect.TopLeft());
pdc->LineTo(Oldrect.right, Oldrect.top);
pdc->MoveTo(Oldrect.right, Oldrect.top);
pdc->LineTo(Oldrect.BottomRight());
pdc->MoveTo(Oldrect.BottomRight());
pdc->LineTo(Oldrect.left, Oldrect.bottom);
pdc->MoveTo(Oldrect.left, Oldrect.bottom);
pdc->LineTo(Oldrect.TopLeft());
pdc->SetROP2(OldMode);
pdc->SelectObject(oldPen);
ReleaseDC(pdc);
return TRUE;
}
同样的位置画两遍就好了
CPen* pOldPen=pDC->SelectObject(&pen);
CBrush* pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
int nOldDrawMode=pDC->SetROP2(R2_XORPEN);
...//绘制代码
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
pDC->SetROP2(nOldDrawMode);
所以我在内存CDC上画线后拷贝到显示CDC.结果使直线消失出现了问题.
在自定义函数OnDrawLine()中内存CDC上创建画笔的时候用xor,结果什么线都画不出,
在系统函数OnDraw(CDC* pDC)中显示CDC上加上一句int nOldDrawMode=pDC->SetROP2(R2_XORPEN),函数OnDrawLine()中屏蔽掉相关语句, 结果重画第2次不能使直线消失,
请高手们指导.
代码如下:m_pMemDC和m_pBitmap 是全局变量:int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) {
.....
m_nMaxX = GetSystemMetrics(SM_CXSCREEN);
m_nMaxY = GetSystemMetrics(SM_CYSCREEN);
CDC* pDC = GetDC();
m_pMemDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
....
}
void CLineTstView::OnDraw(CDC* pDC)
{
....
CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap); pDC->BitBlt(0,0,m_nMaxX,
m_nMaxY,m_pMemDC,0,0,SRCCOPY);
m_pMemDC->SelectObject(pOldBitmap);
}void CMyView::OnDrawLine()
{
CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap);
CPen pen;
pen.CreatePen(PS_SOLID,m_nLineWidth,m_cLineColor);
CPen* pOldPen = m_pMemDC->SelectObject(&pen);
CBrush* pOldBrush = (CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH); int nOldDrawMode=m_pMemDC->SetROP2(R2_XORPEN); m_pMemDC->MoveTo(m_ptStart);
m_pMemDC->LineTo(point); Invalidate(FALSE); m_pMemDC->SelectObject(pOldBitmap);
m_pMemDC->SelectObject(pOldPen);
m_pMemDC->SelectObject(pOldBrush);
m_pMemDC->SetROP2(nOldDrawMode);
}
能否具体点,将内存的绘图上下文传递给什么函数? 给几句代码.