在 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

CImage::GetDC ().

该 DC 将具有当前选定的位图。