Форум программистов, компьютерный форум 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, 18:10  [ТС]     Скриншот, работа с bmp
Цитата Сообщение от murderer Посмотреть сообщение
Вот здесь должна быть не единичка
C++
1
fwrite((BITMAPINFOHEADER*)lpbi+1, PalEntries, 1, f);
скорее всего
C++
1
fwrite((BITMAPINFOHEADER*)lpbi+sizeof(BITMAPINFOHEADER), PalEntries, 1, f);
Нет-нет) тут точно единица должна быть...
C++
1
fwrite((BITMAPINFOHEADER*)lpbi+sizeof(BITMAPINFOHEADER), PalEntries, 1, f);
Учитывая, что структура BITMAPINFOHEADER занимает 40 байт, то в файл бы было записано 1600 байт... Раз уж на то пошло, то можно бы было использовать
C++
1
(char*)lpbi+sizeof(BITMAPINFOHEADER)
Но это тоже самое что и
C++
1
fwrite((BITMAPINFOHEADER*)lpbi+1, PalEntries, 1, f);
Сегодня на паре друг подкинул идею "о бредовой роботе функции fwrite", мол она пишет только текстовые файлы. Он был отчасти не прав, но подтолкнул меня к решению проблемы:
C++
1
2
    
FILE* f=fopen(fname, "wb");
Помню когда то у меня возникал вопрос, какова разница между "w" и "wb". Вот я её и нащупал)

murderer, спасибо за попытки помочь найти ошибку)

Если кому то понадобиться программа для создания скриншотов, вот код:

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
#include "stdafx.h"
#include <windows.h>
 
void MakeScreen(HWND hwnd, int x, int y, int cx, int cy, wchar_t* fname) {
    HDC hdc=GetDC(hwnd);
    HBITMAP hbmp=CreateCompatibleBitmap(hdc, cx, cy);
    HDC hcdc=CreateCompatibleDC(hdc);
    SelectObject(hcdc, hbmp);
    BitBlt(hcdc, 0, 0, cx, cy, hdc, x, y,  SRCCOPY);
 
    LPBITMAPINFO lpbi=(LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
 
    ZeroMemory(&lpbi->bmiHeader, sizeof(BITMAPINFOHEADER));
    lpbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    GetDIBits(hcdc, hbmp, 0, cy, NULL, lpbi, DIB_RGB_COLORS);
    
    LPVOID buf=malloc(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=_wfopen(fname, L"wb");
 
    fwrite(lpbmpfh, sizeof(BITMAPFILEHEADER), 1, f);
    fwrite(lpbi, sizeof(BITMAPINFOHEADER), 1, f);
    if (PalEntries) 
        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);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    //HWND окна для скрина, координаты левого верхнего угла, ширина, высота области для скрина, имя файла
    MakeScreen(NULL, 0, 0, 1366, 768, L"C:\\Screen.bmp");
    return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru