Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение содержимого окна в файл 
:(
    Опции темы
Relrin
Дата 10.9.2012, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Столкнулся с проблемой. Нужно сохранить содержимое области, на которой рисую, в файл BMP. Файл создает, но содержимое не отображает (хотя его "вес" заметен).
Быть может подскажете, где я допустил ошибку? Ибо написано вроде как верно...

Смотрите со строки с "case 10011:" (строка 298), там именно идет сохранение содержимого в файл...

Добавлено через 11 минут и 56 секунд
Если быть более точным, вот этот фрагмент:

до этого есть объявления:
Код

case WM_CREATE:
        {
          // создаем кисть и перо для рисования
          hbrush = CreateSolidBrush(RGB(0,0,0));
          hpen  = CreatePen(PS_SOLID, 1, RGB(0,0,0));

          hdc=GetDC(hWnd);
          MemDC=CreateCompatibleDC(hdc);
          hbmp = CreateCompatibleBitmap(MemDC,891,682);
          SelectObject(MemDC,hbmp);
          BitBlt(MemDC,133,0,891,682,hdc,0,0,WHITENESS);
          ReleaseDC(hWnd,hdc);

          return 0;
        }



Код

    //Размеры битмэпа
                        int bitmap_dx = 891;
                        int bitmap_dy = 682;

                        BITMAPINFOHEADER bmpInfoHeader;
                        BITMAPFILEHEADER bmpFileHeader;
                        BITMAP* pBitmap;

                        bmpFileHeader.bfType = 0x4d42;
                        bmpFileHeader.bfSize = 0;
                        bmpFileHeader.bfReserved1 = 0;
                        bmpFileHeader.bfReserved2 = 0;
                        bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

                        bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
                        bmpInfoHeader.biWidth = bitmap_dx;
                        bmpInfoHeader.biHeight = bitmap_dy;
                        bmpInfoHeader.biPlanes = 1;
                        bmpInfoHeader.biBitCount = 24;
                        bmpInfoHeader.biCompression = BI_RGB;
                        bmpInfoHeader.biSizeImage = bitmap_dx*bitmap_dy*(24/8);
                        bmpInfoHeader.biXPelsPerMeter = 0;
                        bmpInfoHeader.biYPelsPerMeter = 0;
                        bmpInfoHeader.biClrUsed = 0;
                        bmpInfoHeader.biClrImportant = 0;

                        BITMAPINFO info;
                        info.bmiHeader = bmpInfoHeader;

                        BYTE* memory;
                        HDC winDC = GetWindowDC(hWnd);
                        HDC bmpDC = CreateCompatibleDC(winDC);
                        //Создаем битмэп
                        HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0);
                        SelectObject(bmpDC, bitmap);
                        //Выбираем в контекст битмэп
                        BitBlt(bmpDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY);
                        ReleaseDC(hWnd, winDC);

                        // Корректировка заголовка диалога
                        WCHAR str[15];
                        MultiByteToWideChar(0,0,"Saving As...",15,str,15);
                        LPCWSTR corrected_title = str;

                        // корректировка строки
                        char FileName[MAX_PATH];
                        wchar_t strFileName[MAX_PATH];
                        *strFileName=*str='\0';

                        OPENFILENAME ofn;
                        memset(&ofn, 0, sizeof(OPENFILENAME));
                        ofn.lStructSize = sizeof(OPENFILENAME);
                        ofn.hwndOwner = hWnd;
                        ofn.lpstrFilter = szFilter;
                        ofn.lpstrFile = strFileName;
                        ofn.lpstrTitle = corrected_title;
                        ofn.nMaxFile = MAX_PATH;
                        ofn.lpstrInitialDir = NULL;
                        ofn.lpstrDefExt = '\0';
                        ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;

                        char path[MAX_PATH];
                        wcstombs(path, ofn.lpstrFile, MAX_PATH);
                        strcpy(FileName, path);
                        GetSaveFileName(&ofn); 

                        HANDLE hFile = CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
                        if (hFile == INVALID_HANDLE_VALUE) return 0;
                        DWORD dwWritten = 0;
                        WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
                        WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
                        WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL);
                        CloseHandle(hFile);


Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  code.rar 6,71 Kb
PM MAIL   Вверх
deniska
Дата 20.9.2012, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не разбирался в Вашем коде, вот мой, буквально вчера сделал сохранение скриншота окна в бмп файл:
Код

        if( pMainWnd != NULL )
        {
            CDC* pDC = pMainWnd->GetDC();
            
            CDC tempDC;
            tempDC.CreateCompatibleDC( pDC );
            CBitmap tempBM;
            CRect wndRect;
            pMainWnd->GetWindowRect( wndRect );
            tempBM.CreateCompatibleBitmap(  pDC, 
                                            wndRect.Width(),
                                            wndRect.Height() );


            HGDIOBJ oldTempBitmap = tempDC.SelectObject( tempBM );
            BITMAP tempBMinfo;
            tempBM.GetBitmap( &tempBMinfo );

            tempDC.BitBlt( 0, 0, wndRect.Width(), wndRect.Height(), pDC, 0, 0, SRCCOPY );
            pMainWnd->ReleaseDC( pDC );


            tempDC.SelectObject( oldTempBitmap );
            BYTE* Pixels = new BYTE[tempBMinfo.bmWidth*tempBMinfo.bmHeight*tempBMinfo.bmBitsPixel/8];

            tempBM.GetBitmapBits( tempBMinfo.bmWidth*tempBMinfo.bmHeight*tempBMinfo.bmBitsPixel/8, Pixels );

            CString sFileName;
            SYSTEMTIME time;
            GetLocalTime( &time );
            sFileName.Format( _T("C://%d.%02d.%02d_%02d.%02d.%02d.bmp"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond );
            HANDLE hFile = CreateFile( sFileName, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );


            BITMAPFILEHEADER bmfh;
            BITMAPINFOHEADER info;
            memset ( &bmfh, 0, sizeof (BITMAPFILEHEADER ) );
            memset ( &info, 0, sizeof (BITMAPINFOHEADER ) );
         
            bmfh.bfType = 0x4d42;       // 0x4d42 = 'BM'
            bmfh.bfReserved1 = 0;
            bmfh.bfReserved2 = 0;
            bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + tempBMinfo.bmWidth*tempBMinfo.bmHeight*tempBMinfo.bmBitsPixel/8;
            bmfh.bfOffBits = 0x36;

            info.biSize = sizeof(BITMAPINFOHEADER);
            info.biWidth = tempBMinfo.bmWidth;
            info.biHeight = (-1)*tempBMinfo.bmHeight;
            info.biPlanes = 1;    
            info.biBitCount = tempBMinfo.bmBitsPixel;
            info.biCompression = BI_RGB;    
            info.biSizeImage = 0;
            info.biXPelsPerMeter = 0x0ec4;  
            info.biYPelsPerMeter = 0x0ec4;     
            info.biClrUsed = 0;    
            info.biClrImportant = 0; 

            unsigned long bwritten;
            if( WriteFile( hFile, &bmfh, sizeof ( BITMAPFILEHEADER ), &bwritten, NULL ) == FALSE )
            {    
                CloseHandle( hFile );
            }

            if( WriteFile( hFile, &info, sizeof ( BITMAPINFOHEADER ), &bwritten, NULL ) == FALSE )
            {    
                CloseHandle( hFile );
            }

            if( WriteFile( hFile, Pixels, tempBMinfo.bmWidth*tempBMinfo.bmHeight*tempBMinfo.bmBitsPixel/8, &bwritten, NULL ) == FALSE )
            {    
                CloseHandle( hFile );
            }
            CloseHandle( hFile );

            delete [] Pixels;
        }


ЗЫ извиняюсь за код MFC, переведите сами на чистый API

таки пришлось пробежаться по коду: а под memory кто память выделять будет? и GetDIBits возможно нужен после рисования в DI секцию, ну это так, навскидку

Это сообщение отредактировал(а) deniska - 20.9.2012, 09:02
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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