在 CImage 对象上使用设备上下文绘制线条
Draw lines using Device Context over a CImage object
我正在构建一个 MFC C++ 应用程序,我让用户在其中读取图像、在其上画线然后保存它。
所以我有一个名为 "Image" 的 "CImage" 对象,用户可以在其中加载图像。
我有一个设备上下文对象,我可以在上面画线
使用"OnLButtonDown"和"OnLButtonUp"事件处理程序运行时的设备上下文对象。
然后我让用户使用 "CImage.save" 保存图像 .. 图像已保存,但设备上下文绘制的线条不存在,这是预期的 ..
但我确实希望它们出现在保存的图像中..
问题是如何让设备上下文对象影响我的 CImage 对象?
这是鼠标按钮按下的事件处理程序
void CProFilterDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
curser =point;
if (draw && Boundry.PtInRect(point) )
{
CDialogEx::OnLButtonDown(nFlags, point);
}
}
以及鼠标按钮松开时的这个
void CProFilterDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (draw && Boundry.PtInRect(curser) && Boundry.PtInRect(point))
{
CClientDC dc(this);
dc.MoveTo(curser);
dc.LineTo(point);
CDialogEx::OnLButtonUp(nFlags, point);
}
}
这是我加载 Cimage 对象的地方
void CProFilterDlg::OnBnClickedBtnBrowse()
{
CFileDialog Browse(true);
if(Browse.DoModal() == IDOK)
{
ImagePath = Browse.GetPathName();
}
image.Load(ImagePath);
}
这是我保存 CImage 的地方
void CProFilterDlg::OnBnClickedSave()
{
CFileDialog Save(true);
if(Save.DoModal() == IDOK)
{
ImagePath = Save.GetPathName();
}
image.Save(ImagePath,Gdiplus::ImageFormatBMP);
}
您在寻找 CImage:BitBlt 吗?它用于将位图从源设备上下文复制到当前设备上下文。
从您所展示的内容来看,您似乎使用了错误的 DC。您似乎将 DC 用于对话框(即 CCLientDC)并且 而不是 实际的 CImage。您应该从
构建 DC
该 DC 将具有当前选定的位图。
我正在构建一个 MFC C++ 应用程序,我让用户在其中读取图像、在其上画线然后保存它。
所以我有一个名为 "Image" 的 "CImage" 对象,用户可以在其中加载图像。
我有一个设备上下文对象,我可以在上面画线 使用"OnLButtonDown"和"OnLButtonUp"事件处理程序运行时的设备上下文对象。
然后我让用户使用 "CImage.save" 保存图像 .. 图像已保存,但设备上下文绘制的线条不存在,这是预期的 .. 但我确实希望它们出现在保存的图像中..
问题是如何让设备上下文对象影响我的 CImage 对象?
这是鼠标按钮按下的事件处理程序
void CProFilterDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
curser =point;
if (draw && Boundry.PtInRect(point) )
{
CDialogEx::OnLButtonDown(nFlags, point);
}
}
以及鼠标按钮松开时的这个
void CProFilterDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (draw && Boundry.PtInRect(curser) && Boundry.PtInRect(point))
{
CClientDC dc(this);
dc.MoveTo(curser);
dc.LineTo(point);
CDialogEx::OnLButtonUp(nFlags, point);
}
}
这是我加载 Cimage 对象的地方
void CProFilterDlg::OnBnClickedBtnBrowse()
{
CFileDialog Browse(true);
if(Browse.DoModal() == IDOK)
{
ImagePath = Browse.GetPathName();
}
image.Load(ImagePath);
}
这是我保存 CImage 的地方
void CProFilterDlg::OnBnClickedSave()
{
CFileDialog Save(true);
if(Save.DoModal() == IDOK)
{
ImagePath = Save.GetPathName();
}
image.Save(ImagePath,Gdiplus::ImageFormatBMP);
}
您在寻找 CImage:BitBlt 吗?它用于将位图从源设备上下文复制到当前设备上下文。
从您所展示的内容来看,您似乎使用了错误的 DC。您似乎将 DC 用于对话框(即 CCLientDC)并且 而不是 实际的 CImage。您应该从
构建 DC该 DC 将具有当前选定的位图。