Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Сохранение контекста для bitmap


Автор: Adry 7.6.2013, 10:01
Имеется проект MFC Multiple documents.

Рисую графики, делаю скриншот, сохраняю в контекст. Если отрисовка первая, сохраняю в файл *jpeg. Если отрисовка не первая (например, окно программы было перекрыто другим окном, затем снова активизировалось), то по идее в окно должен загружаться сохраненный в памяти контекст, но этого не происходит. 

Смотрела код в примерах здесь же, на форуме - все похоже один в один. Если верить прочитанным темам, то реализация такого кода в функции LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) и сообщение  WM_PAINT работает. У меня - нет. Вместо графика после того, как окно было скрыто другим, потом заново активизировано, отображается только белое полотно.


Код

// GraphicaView.cpp : implementation of the CGraphicaView class
//

#include "stdafx.h"
#include "Graphica.h"
#include "Dialog2.h"

#include "GraphicaDoc.h"
#include "GraphicaView.h"

#include <windows.h>
#include <stdio.h>
#include <gdiplus.h>
#pragma comment(lib, "GdiPlus.lib")
using namespace Gdiplus;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Bitmap
HBITMAP hBitmap;
HDC hDCMem;
HDC hDC;
BITMAP bmpScreen;
HWND m_hwnd;
RECT rcClient;
int iWidth;
int iHeight;


void CGraphicaView::OnDraw(CDC* pDC)
{
    CGraphicaDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)        
        return;
    
    if (RedrNum==0)
    {
    
        testGraph = new CGraph(0);

        int MaxyScale;
        testGraph->SetXAxisAlignment(0);
        CGraphSeries* series1 = new CGraphSeries();
         

        testGraph->SetGraphTitle(sSpectTitle);
        MaxyScale=iYTop;
        testGraph->SetTickRange(MaxyScale);
        float TickS=ceil(((float)MaxyScale/10.0));
        testGraph->SetTickSpace(1);

                    
        for (int i=0;i<=BarNums;i++)
        {
            series1->SetData(i,Spectr[i]);
        }
                
        testGraph->AddSeries(series1);

        graphComplete=TRUE;
            
        if(graphComplete) testGraph->DrawGraph(pDC);    
        pView->UpdateWindow();
                        
        GetClientRect(&rcClient);
        iWidth=rcClient.right-rcClient.left;
        iHeight=rcClient.bottom-rcClient.top;
            
        hDC= ::GetDC(pView->m_hWnd);                
        hDCMem = ::CreateCompatibleDC (hDC);
        hBitmap = ::CreateCompatibleBitmap (hDC, iWidth, iHeight);
        
        HGDIOBJ hBmpOld = (HBITMAP)SelectObject (hDCMem, hBitmap);
        BitBlt (hDCMem,  0, 0, iWidth, iHeight, hDC, 0, 0, SRCCOPY);
        SaveingGraph();

    }
    else 
    {
        BOOL Copy=BitBlt (hDCMem,  0, 0, iWidth, iHeight, hDC, 0, 0, SRCCOPY);
        if (Copy==TRUE) AfxMessageBox("True");
        else AfxMessageBox("False");
    }

    RedrNum++;
}

Автор: Earnest 11.6.2013, 06:31
hDC нужно получать каждый раз. Точнее, не нужно, его же тебе передают как параметр OnDraw. И рисовать нужно именно в этот контекст.

Код очень грязный: глобальные переменные сами по себе плохи, а тут еще не поймешь, какая переменная глобальная, какая автоматическая, а какая класса.
Это должно быть сразу видно из кода.
Ну почему все считают, что сначала нужно написать помоешный код, а потом его чистить, когда заработает?

Автор: Adry 11.6.2013, 10:55
Спасибо Вам, Earnest!
Я Вас поняла.

А код действительно помоечный, да... Каюсь.
Единственное, что меня оправдывает, это то, что с этим кодом никто, кроме меня, работать не будет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)