Форум программистов, компьютерный форум CyberForum.ru

Скриншот, работа с bmp - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сложение матриц(классы) http://www.cyberforum.ru/cpp-beginners/thread449985.html
Всем привет. Есть задание сделать сложение матриц, но при этом определив класс вещ-ых матриц. вот что получилось. ТОлько вопрос. как это сложение сделать? Описав класс, в мэйне создам я две матрицы, ну а дальше как? Сам метод более-менее описан, но там траблы все равно есть. #include "clasMatr.h" int main() { /*cout<<"Please enter rows "; //как сделать чтобы можно было не готовые...
C++ Непонятные ошибки компиляции!!!! Доброго времени суток!! Писал программу, которая замечательно работала. Пошёл в универ защищать лабу, преподаватель попросил сделать пару дополнений к ней (программе), чтобы проверить меня, я всё сделал, лабу сдал. Теперь мне надо на основе моего класса создать класс наследник, использовать виртуальные функции и т.д. и дополнения которые просил написать препод уже не нужны. Я их все стёр,... http://www.cyberforum.ru/cpp-beginners/thread449980.html
Программа расчета по двум формулам. Результаты вычислений по 2 формулам должны совпадать C++
Помогите исправить не пойму в чем дело. #include <iostream> #include <clocale> #include <cmath> using namespace std; int main() { setlocale( LC_ALL, "Russian" );
C++ преобразование из void* в int[n]
Всем привет) Пишу программу, которая в отдельном потоке сортирует массив. такая проблема, на функцию hThread=(HANDLE)_beginthreadex(NULL, 0, bubble,(void *)arr, 0, &id); в качестве четвертого аргумента нужно подать аргумент типа void* для функции сортировки bubble здесь вроде всё нормально: аргумент типа int arr преобразуем в void*. а как затем обратно преобразовать его в массив int в самой...
C++ Сохранение бинарного файла http://www.cyberforum.ru/cpp-beginners/thread449960.html
как сохранить бинарный файл в Microsofr Visual Studio 2010?? подскажите пожалуйста)
C++ Перегрузка операторов. Класс Матрица Доброго времени суток! Вот задание моей лабы: Описать класс, что реализует указаный ниже тип данных. Класс должен содержать множество конструкторов для создания объектов определённого типа (конструктор по умолчанию и с параметрами, конструктор копии) и поданные в таблице операции над объектами класса (плюс обязательно операцию присвоения) с использованием механизма перегрузки операций. ... подробнее

Показать сообщение отдельно
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
21.02.2012, 02:27     Скриншот, работа с bmp
Возникла необходимость создания скриншота неактивого окна. В результате долгих поисков, по гуглу я наткнулся на следующий рабочий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//Вход с функции ScreenCapture()
inline int GetFilePointer(HANDLE FileHandle){
    return SetFilePointer(FileHandle, 0, 0, FILE_CURRENT);
}
 
bool SaveBMPFile(wchar_t *filename, HBITMAP bitmap, HDC bitmapDC, int width, int height){
    bool Success=0;
    HDC SurfDC=NULL;
    HBITMAP OffscrBmp=NULL;
    HDC OffscrDC=NULL;
    LPBITMAPINFO lpbi=NULL;
    LPVOID lpvBits=NULL;
    HANDLE BmpFile=INVALID_HANDLE_VALUE;
    BITMAPFILEHEADER bmfh;
    if ((OffscrBmp = CreateCompatibleBitmap(bitmapDC, width, height)) == NULL)
        return 0;
    if ((OffscrDC = CreateCompatibleDC(bitmapDC)) == NULL)
        return 0;
    HBITMAP OldBmp = (HBITMAP)SelectObject(OffscrDC, OffscrBmp);
    BitBlt(OffscrDC, 0, 0, width, height, bitmapDC, 0, 0, SRCCOPY);
    if ((lpbi = (LPBITMAPINFO)(new char[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)])) == NULL) 
        return 0;
    ZeroMemory(&lpbi->bmiHeader, sizeof(BITMAPINFOHEADER));
    lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    SelectObject(OffscrDC, OldBmp);
    if (!GetDIBits(OffscrDC, OffscrBmp, 0, height, NULL, lpbi, DIB_RGB_COLORS))
        return 0;
    if ((lpvBits = new char[lpbi->bmiHeader.biSizeImage]) == NULL)
        return 0;
    if (!GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi, DIB_RGB_COLORS))
        return 0;
    if ((BmpFile = CreateFile(filename,
                        GENERIC_WRITE,
                        0, NULL,
                        CREATE_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL)) == INVALID_HANDLE_VALUE)
        return 0;
    DWORD Written;
    bmfh.bfType = 19778;
    bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
    if (!WriteFile(BmpFile, &bmfh, sizeof(bmfh), &Written, NULL))
        return 0;
    if (Written < sizeof(bmfh)) 
        return 0; 
    if (!WriteFile(BmpFile, &lpbi->bmiHeader, sizeof(BITMAPINFOHEADER), &Written, NULL)) 
        return 0;
    if (Written < sizeof(BITMAPINFOHEADER)) 
        return 0;
    int PalEntries;
    if (lpbi->bmiHeader.biCompression == BI_BITFIELDS) 
        PalEntries = 3;
    else PalEntries = (lpbi->bmiHeader.biBitCount <= 8) ?
                      (int)(1 << lpbi->bmiHeader.biBitCount) : 0;
    if(lpbi->bmiHeader.biClrUsed) 
    PalEntries = lpbi->bmiHeader.biClrUsed;
    if(PalEntries){
    if (!WriteFile(BmpFile, &lpbi->bmiColors, PalEntries * sizeof(RGBQUAD), &Written, NULL)) 
        return 0;
        if (Written < PalEntries * sizeof(RGBQUAD)) 
            return 0;
    }
    bmfh.bfOffBits = GetFilePointer(BmpFile);
    if (!WriteFile(BmpFile, lpvBits, lpbi->bmiHeader.biSizeImage, &Written, NULL)) 
        return 0;
    if (Written < lpbi->bmiHeader.biSizeImage) 
        return 0;
    bmfh.bfSize = GetFilePointer(BmpFile);
    SetFilePointer(BmpFile, 0, 0, FILE_BEGIN);
    if (!WriteFile(BmpFile, &bmfh, sizeof(bmfh), &Written, NULL))
        return 0;
    if (Written < sizeof(bmfh)) 
        return 0;
    CloseHandle(BmpFile);
    return 1;
}
 
bool ScreenCapture(int x, int y, int width, int height, wchar_t *filename){
    HDC hdc=GetWindowDC(hChild);
    HDC hDc = CreateCompatibleDC(hdc);    
    HBITMAP hBmp = CreateCompatibleBitmap(hdc, width, height);   
    SelectObject(hDc, hBmp);   
    BitBlt(hDc, 0, 0, width, height, hdc, x, y, SRCCOPY);  
    bool ret = SaveBMPFile(filename, hBmp, hDc, width, height); 
    DeleteObject(hBmp);  
    ReleaseDC(hChild, hdc);
    return ret;
}
Результат: http://www.cyberforum.ru/attachment....1&d=1329776576 Всё великолепно работает)

Решил я написать свой код, по аналогии с этим, убирая ненужные излишки, ну и пользуясь более рациональными на мой взгляд функциями... Потратил часов 10 в общей сложности чтобы разобраться как работать с битмапами. Получилось вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void func(HWND hwnd, int x, int y, int cx, int cy, char* fname) {
    HDC hdc=GetDC(hwnd);
    HDC hcdc=CreateCompatibleDC(hdc);
    HBITMAP hbmp=CreateCompatibleBitmap(hdc, cx, cy);
    SelectObject(hcdc, hbmp);
    BitBlt(hcdc, 0, 0, cx, cy, hdc, x, y,  SRCCOPY);
 
    LPBITMAPINFO lpbi=(LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
 
    ZeroMemory(lpbi, sizeof(BITMAPINFO));
    lpbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    GetDIBits(hcdc, hbmp, 0, cy, NULL, lpbi, DIB_RGB_COLORS);
    
    LPVOID buf=malloc(lpbi->bmiHeader.biSizeImage);
    ZeroMemory(buf, lpbi->bmiHeader.biSizeImage);
    GetDIBits(hcdc, hbmp, 0, cy, buf, lpbi, DIB_RGB_COLORS);
 
    int PalEntries;
    if (lpbi->bmiHeader.biCompression == BI_BITFIELDS) 
        PalEntries = 3;
    else PalEntries = (lpbi->bmiHeader.biBitCount <= 8) ? (int)(1 << lpbi->bmiHeader.biBitCount) : 0;
    if(lpbi->bmiHeader.biClrUsed) 
        PalEntries = lpbi->bmiHeader.biClrUsed;
    PalEntries*=sizeof(RGBQUAD);
 
    LPBITMAPFILEHEADER lpbmpfh=new BITMAPFILEHEADER;
    lpbmpfh->bfType=0x4d42;
    lpbmpfh->bfReserved1=lpbmpfh->bfReserved2=0;
    lpbmpfh->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+PalEntries;
    lpbmpfh->bfSize=lpbmpfh->bfOffBits+lpbi->bmiHeader.biSizeImage;
 
    FILE* f=fopen(fname, "w");
 
    fwrite(lpbmpfh, sizeof(BITMAPFILEHEADER), 1, f);
    fwrite(lpbi, sizeof(BITMAPINFOHEADER), 1, f);
    fwrite((BITMAPINFOHEADER*)lpbi+1, PalEntries, 1, f);
    fwrite(buf, lpbi->bmiHeader.biSizeImage, 1, f);
 
    fclose(f);
    delete lpbmpfh;
    delete buf;
    delete lpbi;
    DeleteObject(hbmp);
    ReleaseDC(hwnd, hdc);
    DeleteDC(hcdc);
}
А вот и результат: http://www.cyberforum.ru/attachment....1&d=1329776567 Уже 100 раз перечитал свой код, сравнивал разными способами, дебажил и всё такое... Заголовки bmpщников абсолютно идентичные получаются, но последние пару сотен тысяч байт файла "искажаются". Между программами только 1 разница: первая прога - оконная, вторая - консольная, но помойму это не повод для таких ошибок.

Помогите пожалуйста, в чём может быть проблемма?
Миниатюры
Скриншот, работа с bmp   Скриншот, работа с bmp  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru