当前位置: 代码迷 >> VC >> VC画图:(1)在原有图像下画的图形保存不上来 (2)改变画笔的粗细时有“资源不可用”的异常提示
  详细解决方案

VC画图:(1)在原有图像下画的图形保存不上来 (2)改变画笔的粗细时有“资源不可用”的异常提示

热度:1972   发布时间:2013-02-25 00:00:00.0
VC画图:(1)在原有图像上画的图形保存不下来 (2)改变画笔的粗细时有“资源不可用”的错误提示
在原有图像处理的功能上,想再实现在一幅图像上随意绘制图形,并能把绘制的结果保存在图像上。

现在的基本思路是:
    (1)打开一幅图像后,点击菜单项“绘图”后,即可在该图像上用鼠标随意绘线,把鼠标画线的坐标点存到  CArray<CPoint,CPoing>数组中。
    (2)点击菜单“图像叠加”后,在该响应函数内,生成兼容DC,并把含有源图像信息的内存位图选入DC,根据之前的保存结果,用同样的画笔再重绘一次。那这个源图像上的颜色信息应该就会发生改变了吧。

程序如下:
void CImagePView::OnLButtonDown(UINT nFlags, CPoint point)
{

if (m_bStartDraw)                                //标志着可以开始绘图
{
m_PtOld = m_PtCurrent = point;
if(m_PtOld.y >= m_nHeightDst | m_PtOld.x >= m_nWidthDst)
{
return;
}
m_btnDown  = TRUE;                      //鼠标左键被按下
}
}


void CImagePView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bStartDraw && m_btnDown)
{

CDC* m_pDc = GetDC();

m_PtCurrent = point;
if(m_PtCurrent.y >= m_nHeightDst | m_PtCurrent.x >= m_nWidthDst)
return;

//创建铅笔对象
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0, 0, 0);
CPen pen(PS_SOLID, 1, &logBrush);
CPen* oldPen = m_pDc->SelectObject(&pen);                                // 选中新的笔对象 

m_pDc->MoveTo(m_PtOld);
m_pDc->LineTo(m_PtCurrent);
m_pDc->SelectObject(oldPen);

m_pointArray.Add(m_PtOld);                                        // 添加到图形容器中

DeleteObject(pen);
ReleaseDC(m_pDc);
m_PtOld = m_PtCurrent;
}

}

void CImagePView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bStartDraw && m_btnDown)
{
m_btnDown = FALSE;
m_PtCurrent = point;
if(m_PtCurrent.y >= m_nHeightDst | m_PtCurrent.x >= m_nWidthDst)
return;
}
}

void CImagePView::OnImageAdd()
{
// TODO: 在此添加命令处理程序代码
m_bStartDraw = FALSE;

HBITMAP hBitmap = CreateBitmap(m_nWidthDst, m_nHeightDst, 1, 32, m_pImageBufferDst);
m_bitmap.Detach();
m_bitmap.Attach(hBitmap);


CClientDC dc(this);
CDC dcImage;
if (!dcImage.CreateCompatibleDC(&dc))
{
return;
}
CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);


//创建铅笔对象
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0, 0, 0);
CPen pen(PS_SOLID, 1, &logBrush);
CPen* oldPen = dcImage.SelectObject(&pen);                                  // 选中新的笔对象

dcImage.MoveTo(m_pointArray[0]);
  相关解决方案