代码之家  ›  专栏  ›  技术社区  ›  Mohab Mesherf

在CImage对象上使用设备上下文绘制线条

  •  0
  • Mohab Mesherf  · 技术社区  · 10 年前

    我正在构建一个MFC c++应用程序,在其中我让用户读取图像,在上面画线,然后保存它。

    所以我有一个名为“Image”的“CImage”对象,用户可以在其中加载图像。

    我有一个设备上下文对象,我可以在上面画线 设备上下文对象 在运行时使用“OnLButtonDown”和“OnLBbuttonUp”事件处理程序。

    然后,我让用户使用“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);
    }
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   rrirower    10 年前

    从您所展示的内容来看,您似乎使用了错误的DC。您似乎正在为对话框使用DC(即CCLientDC) 实际的CImage。你应该从

    CImage::GetDC () .

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

        2
  •  0
  •   Kryomaani    10 年前

    你在找什么 CImage:BitBlt ? 它用于将位图从源设备上下文复制到当前设备上下文。