Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2013, 15:08   #1
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию Вывести на экран сформированный битмап

Добрый день!
как решить проблему:
есть сформированный в памяти bitmap, каким образом отобразить его на экране?
есть код, который сохраняет в файл мою картинку:
Код:
#include "stdafx.h"
#include "tchar.h"
#include <string>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <cstdlib>
#include <wchar.h>
#include <tchar.h>
#include <Windows.h>

using namespace std;

int main(){

	std::ofstream os("cross4.bmp", std::ios::binary);

unsigned char signature[2] = { 'B', 'M' };
unsigned int fileSize = 14 + 40 + 324*256*4;
unsigned int reserved = 0;
unsigned int offset = 14 + 40;

unsigned int headerSize = 40;
unsigned int dimensions[2] = { 324, 256 };
unsigned short colorPlanes = 1;
unsigned short bpp = 32;
unsigned int compression = 0;
unsigned int imgSize = 256*256;
unsigned int resolution[2] = { 2795, 2795 };
unsigned int pltColors = 0;
unsigned int impColors = 0;

os.write(reinterpret_cast<char*>(signature), sizeof(signature));
os.write(reinterpret_cast<char*>(&fileSize), sizeof(fileSize));
os.write(reinterpret_cast<char*>(&reserved), sizeof(reserved));
os.write(reinterpret_cast<char*>(&offset),   sizeof(offset));

os.write(reinterpret_cast<char*>(&headerSize),  sizeof(headerSize));
os.write(reinterpret_cast<char*>(dimensions),   sizeof(dimensions));
os.write(reinterpret_cast<char*>(&colorPlanes), sizeof(colorPlanes));
os.write(reinterpret_cast<char*>(&bpp),         sizeof(bpp));
os.write(reinterpret_cast<char*>(&compression), sizeof(compression));
os.write(reinterpret_cast<char*>(&imgSize),     sizeof(imgSize));
os.write(reinterpret_cast<char*>(resolution),   sizeof(resolution));
os.write(reinterpret_cast<char*>(&pltColors),   sizeof(pltColors));
os.write(reinterpret_cast<char*>(&impColors),   sizeof(impColors));

unsigned char x;
char Frame[600*600];

for (int mass=0; mass<324*256; mass++ ){
Frame[mass]=160;
}

for (int height=0; height < 256; height++){
 for (int index=height*324; index < (height+1)*324; index++ ){
  Frame[index]=(char)height;
  }
 }

for (int i=0; i < 324; i++)
{
  for (int j=0; j < 256; j++)
  {
    x = 0;

    os.write(reinterpret_cast<char*>(&Frame[i*256+j]),sizeof(Frame[i*256+j]));
    os.write(reinterpret_cast<char*>(&Frame[i*256+j]),sizeof(Frame[i*256+j]));
    os.write(reinterpret_cast<char*>(&Frame[i*256+j]),sizeof(Frame[i*256+j]));
    os.write(reinterpret_cast<char*>(&x),sizeof(x));
	
  }
}

os.close();
	 
	return 0;
	
}
Возможно ли аналогичным способом вывести изображение на экран?
hunter03 вне форума Ответить с цитированием
Старый 07.08.2013, 15:56   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Аналогичным - нет.
Читайте про HWND, HDC и HBITMAP и связанные с ними функции.
waleri вне форума Ответить с цитированием
Старый 07.08.2013, 16:18   #3
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

да, уже почти получилось реализовать)
hunter03 вне форума Ответить с цитированием
Старый 07.08.2013, 17:11   #4
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Получается вывести на экран изображения...но когда пытаюсь закрасить пиксели из массива - получается переполнение...не пойму почему...
Код:

#include "stdafx.h"
#include "tchar.h"
#include <string>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <cstdlib>
#include <wchar.h>
#include <tchar.h>
#include <Windows.h>
#include <math.h>
LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
 
/*
int main()
{
	return 0;
}
*/


int _tmain(int argc, _TCHAR* argv[])
{
	MSG msg;
   int  use = CW_USEDEFAULT; 
   HWND  wnd = CreateWindowA("BUTTON", "image-draw-1", WS_OVERLAPPEDWINDOW, use, use, use, use, 
                                           GetDesktopWindow(), NULL, (HINSTANCE)GetModuleHandle(NULL), NULL);
   if(! wnd)
         ExitProcess(1u);
 
   SetClassLong(wnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_ARROW)); // курсор
   SetClassLong(wnd, GCL_HBRBACKGROUND, (LONG)GetStockObject(DKGRAY_BRUSH)); // цвет формы
   SetWindowLong(wnd, GWL_WNDPROC, (LONG)WndProc);  // обработчик сообщений
 
   ShowWindow(wnd, SW_SHOWDEFAULT);
   UpdateWindow(wnd);
   InvalidateRect(wnd, NULL, TRUE);
 
   ZeroMemory(&msg, sizeof(MSG));
   while(GetMessageA(&msg, NULL, 0U, 0U)) {
        DispatchMessageA(&msg);
        TranslateMessage(&msg);
   }
   DestroyWindow(wnd);
   return 0;
}
 
LRESULT CALLBACK  WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
   PAINTSTRUCT ps;
   HGDIOBJ old;
   static POINT pt;
   static HPEN  pen;
 
   switch(msg) {
     case WM_SHOWWINDOW:
          pen  = CreatePen(PS_SOLID, 1,  RGB(0, 0, 255));
          pt.x =  pt.y = 0L;
         break;
     case WM_PAINT:   // обработчик рисования на форме
       
		 BeginPaint(hwnd, &ps);
 //
 

		 /////////////////////////////////////

 char Frame[800*800];// в этом массиве происходит переполнение... даже если не делаю никаких действий, а просто обьявляю...

for (int mass=0; mass<324*256; mass++ ){
Frame[mass]=160;
}

for (int height=0; height < 256; height++){
 for (int index=height*324; index < (height+1)*324; index++ ){
  Frame[index]=height;
  }
 }

for (int i=0; i < 324; i++)
{
  for (int j=0; j < 256; j++)
  {
		SetPixel(ps.hdc, i, j, RGB(Frame[i*256+j], Frame[i*256+j], Frame[i*256+j]));
 	   
  }
}
delete[] Frame;

/////////////////////////////////////////////
		
		//SetPixel(ps.hdc, 10, 10, RGB(0, 0, 0));
        
 //
        old = SelectObject(ps.hdc, pen);
        
         SelectObject(ps.hdc, old);
         EndPaint(hwnd, &ps);
         break;
     case WM_DESTROY:
          DeleteObject(pen);
          PostQuitMessage(0);
         break;
     default: return DefWindowProcA(hwnd, msg, wParam, lParam);
     }
     return 0;
}
Кому не лень - посмотрите пожалуйста код...
очень странно, что даже когда просто обьявляю массив - во время работы проги происходит ошибка...
Код:
char Frame[800*800];// в этом массиве происходит переполнение... даже если не делаю никаких действий, а просто обьявляю...
hunter03 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести на экран FroZko Общие вопросы .NET 2 09.10.2014 22:56
Вывести на экран сообщение qwe1qwe2qwe3 Помощь студентам 1 09.04.2013 07:41
Вывести на экран gudok2 Паскаль, Turbo Pascal, PascalABC.NET 6 27.03.2013 13:13
Вывести слово на экран в Си dimok5 Помощь студентам 1 02.11.2011 00:14
Вывести на экран сообщение JeyKip Win Api 1 02.04.2010 21:10