首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

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

2012-12-24 
VC画图:(1)在原有图像上画的图形保存不下来 (2)改变画笔的粗细时有“资源不可用”的错误提示在原有图像处理

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]);


int count = m_pointArray.GetSize();
for (int i=0; i < m_pointArray.GetSize(); i++)
{
dcImage.LineTo(m_pointArray[i]);
}

DeleteObject(pen);
//ReleaseDC(dcImage);

}

但是有两个问题:
(1)当我把m_pImageBufferDst里的信息写成bmp图像后,绘制的信息没有保存下来,还是我的原始图像。
(2)CPen pen(PS_SOLID, 1, &logBrush); 把其中的参数1改成10后,就会弹出“资源不可用”的提示。
 
[解决办法]
1、用GetDIBits获取图像数据。
2、第1参数用PS_GEOMETRIC。
[解决办法]
HBITMAP CreateBitmap(
  int nWidth,         // bitmap width, in pixels
  int nHeight,        // bitmap height, in pixels
  UINT cPlanes,       // number of color planes
  UINT cBitsPerPel,   // number of bits to identify color
  CONST VOID *lpvBits // color data array
);
最后参数是const指针,表示指针指向的数据不会被改写。

热点排行