Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение контекста для bitmap, Пропадает из памяти? 
:(
    Опции темы
Adry
Дата 7.6.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Имеется проект 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++;
}

PM MAIL   Вверх
Earnest
Дата 11.6.2013, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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


--------------------
...
PM   Вверх
Adry
Дата 11.6.2013, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Спасибо Вам, Earnest!
Я Вас поняла.

А код действительно помоечный, да... Каюсь.
Единственное, что меня оправдывает, это то, что с этим кодом никто, кроме меня, работать не будет
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.