【问题标题】:How to copy a draw area into a CImage如何将绘图区域复制到 CImage 中
【发布时间】:2015-08-03 19:04:00
【问题描述】:

我是 MFC 的新手。

我正在尝试将 CScrollView 对话框(已绘制内容)复制到图像中,然后将其保存为 bmp 或 jpg 或 tiff 的图像。

我知道如何将 CImage 保存到文件中,但是我无法将绘图区域复制到新的 CImage 对象中。我知道复制的程序。但我无法进入代码。

  1. 我需要获取绘制区域的 CDC。
  2. 创建一个新的 DC 并将其复制到新的 DC 或映像中。
  3. 保存图片。

请指点一下?

【问题讨论】:

    标签: visual-c++ mfc


    【解决方案1】:

    您可以根据窗口大小创建CImage,然后使用BitBlt 在该图像上绘图。使用CImage::GetDC()获取HDC,稍后别忘了调用CImage::ReleaseDC()

    CDC *pDC; //or use CClientDC, CPaintDC etc.
    //do all drawings on pDC first
    //pDC->TextOut(0,0,L"hello world")...
    
    CRect rc;
    GetClientRect(&rc);
    
    CImage image;
    image.Create(rc.Width(), rc.Height(), 32);
    
    HDC imageHDC = image.GetDC(); 
    ::BitBlt(imageHDC, 0, 0, rc.Width(), rc.Height(), pDC->GetSafeHdc(), 0, 0, SRCCOPY);
    image.Save(L"fileName.jpg", GUID_NULL);
    image.ReleaseDC();
    

    【讨论】:

    • 感谢您的即时回复。我很感激。我的对话框已经在 draw() 函数中绘制。我尝试将 CDC 对象存储在 draw 方法中并在此处使用它。但是,我得到一个空白图像。那么如何获取已绘制对象的上下文,多指点一下会有很大帮助吗?
    • 您可能没有在CDC 上进行任何绘图。您是否要对窗口进行屏幕截图?
    • 是的,我正在截取窗口的屏幕截图。无论如何,我通过创建 CDC *SourceHDC = this.GetDC();我得到了句柄。非常感谢。你让我很开心.. :-)
    • @BarmakShemirani,嘿,老问题,但我需要知道我是否可以像这样创建 CDC CDC *pDC = new CDC;
    • @shan,你必须开始一个新问题。您想将CDC m_memdc; 声明为成员函数(它不必是指针)。调用memdc.CreateCompatibileDC 并在memdc 上绘制所有内容,然后在调用OnPaint 时将memdc 绘制到dc
    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2011-09-02
    相关资源
    最近更新 更多