Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Вывод картинок

Ответить
Настройки темы
Win32 API - Вывод картинок
Lev Lev вне форума

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Есть картинка (1 слой) сверху на нее нажалуется слой какимто цветом, потом вырезая второй слой мы открываем 1 слой. Как это сделать? Пробовал просто их вывести вроде все работает тока мигает очень сильно.

Отправлено: 20:03, 10-02-2010

 

Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Используйте двойную буферизацию, мерцание пропадет.

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 20:58, 10-02-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

Lev Lev вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Сперва виводил так:
/*BITMAP bm;
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, (HBITMAP) hBitmap);

GetObject(hBitmap, sizeof(bm), &bm);
BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);*/

А это должна быть двойная буферизаци но чета неработает

BITMAP bm;
HDC hdcMem;
HBITMAP hbmMem;
HANDLE hOld;

PAINTSTRUCT ps;

// Создаем off-screen DC для двойной буферизации
hdcMem = CreateCompatibleDC(hdc);
hbmMem = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight );
hOld = SelectObject(hdcMem, hbmMem);

// Здесь рисуем в hdcMem
BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

// Освобождаем память
SelectObject(hdcMem, hOld);
DeleteObject(hbmMem);
DeleteDC (hdcMem);
return 0;

Пишет Run-Time Check Failure #3 - The variable 'bm' is being used without being initialized.

Отправлено: 22:00, 10-02-2010 | #3


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


У вас походу просто bm не использовался, тоесть вы просто не присвоили bm никакого значения

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 22:49, 10-02-2010 | #4

Lev Lev вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Теперь выводит черный фон. Думаю я неправильно загружаю изображение. HBITMAP hBitmapWallper = (HBITMAP)
LoadImage(NULL, L"Wallper.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

Отправлено: 01:04, 11-02-2010 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


мне кажется дело в CreateCompatibleDC и CreateCompatibleBitmap. Можно код (оформленный тегом code, с комментариями)? я покажу, где ошибка

Отправлено: 08:08, 11-02-2010 | #6

Lev Lev вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


[code]
Код: Выделить весь код
// uo.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "uo.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst;								// текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];					// Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];			// имя класса главного окна
int x=0,y=0;


HBITMAP hBitmapWallper = (HBITMAP) 
LoadImage(NULL, L"Wallper.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HBITMAP hBitmap1 = (HBITMAP) 
LoadImage(NULL, L"1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HBITMAP hBitmapField = (HBITMAP) 
LoadImage(NULL, L"Field.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

// Отправить объявления функций, включенных в этот модуль кода:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
int DrawImage(HDC hdc, HBITMAP hBitmap, int x, int y);
int OnPaint(HWND hWnd);
static HBRUSH hBkBrush;  // узорная кисть
	HBITMAP hBmpBkgr;        // растр для узорной кисти
int DrawField(HDC hdc);
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: разместите код здесь.
	MSG msg;
	HACCEL hAccelTable;

	// Инициализация глобальных строк
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_UO, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Выполнить инициализацию приложения:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_UO));

	// Цикл основного сообщения:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UO));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_UO);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
hBmpBkgr = LoadBitmap((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
					MAKEINTRESOURCE(IDB_STONE));
		hBkBrush = CreatePatternBrush(hBmpBkgr);
		SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)hBkBrush);
   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND	- обработка меню приложения
//  WM_PAINT	-Закрасить главное окно
//  WM_DESTROY	 - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	HDC hdc;
RECT rectt={x,y,x+15,y+15};
	switch (message)
	{
		case WM_KEYDOWN:
		{
			switch(wParam)
			{
			case 40:
				{
				//	Move = kDown;   
					x=x+10;
		//GetWindowRect(hWnd, &rectt);
			InvalidateRect(hWnd, &rectt, FALSE);
		//UpdateWindow(hWnd);
					break;
				}
			case 38:
				{
					y=y+10;
					break;
				}
			case 39:
				{
							
					break;
				}
			case 37:
				{
				//	Move = kLeft; 
					
					break;
				}
			}
	
			SendMessage(hWnd, WM_PAINT, 1, 0);

			break;
		}

	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Разобрать выбор в меню:
		switch (wmId)
		{
		case IDM_about:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		{
		OnPaint(hWnd);
		
		break;
		}
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

int DrawImage(HDC hdc, HBITMAP hBitmap, int x, int y)
{
	/*BITMAP bm;
	HDC hdcMem = CreateCompatibleDC(hdc);
	HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, (HBITMAP) hBitmap);

	GetObject(hBitmap, sizeof(bm), &bm);
	BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY);
		SelectObject(hdcMem, hbmOld);
	DeleteDC(hdcMem);*/
	BITMAP bm;
	HDC          hdcMem;
	HBITMAP      hbmMem;
	HANDLE       hOld;

	//HDC          hdc;
	GetObject(hBitmap, sizeof(bm), &bm);
	// Создаем off-screen DC для двойной буферизации
	hdcMem = CreateCompatibleDC(hdc);
	hbmMem = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight );
	hOld   = SelectObject(hdcMem, hbmMem);

 	
  BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY);

    // Освобождаем память
    SelectObject(hdcMem, hOld);
    DeleteObject(hbmMem);
    DeleteDC    (hdcMem);

    


	return 0;
}

int OnPaint(HWND hWnd)
{
	PAINTSTRUCT ps;
	HDC hdc;

hdc = BeginPaint(hWnd, &ps);
		
		
		DrawField(hdc);
			
		EndPaint(hWnd, &ps);
		return 0;
}
int DrawField(HDC hdc)
{

DrawImage (hdc, hBitmapWallper, 1 , 1);
		// TODO: добавьте любой код отрисовки...
for(int e=0;e<100;e=e+5)
for(int yy=0;yy<100;yy=yy+5)
{

}

		return 0;
}
[\code]

Отправлено: 12:19, 11-02-2010 | #7

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Lev:
//HDC hdc;
GetObject(hBitmap, sizeof(bm), &bm);
// Создаем off-screen DC для двойной буферизации
hdcMem = CreateCompatibleDC(hdc);
// создаём картинку, инициализированную космическим мусором
hbmMem = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight );
// заменяем картинку по умолчанию на картинку с мусором
hOld = SelectObject(hdcMem, hbmMem);
// копируем картинку с мусором на экран
BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY);
// Освобождаем память
SelectObject(hdcMem, hOld);
DeleteObject(hbmMem);
DeleteDC (hdcMem); »
правильно я понимаю программу? а где отрисовка hBitmap?

Отправлено: 16:29, 11-02-2010 | #8

Lev Lev вне форума Автор темы

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


А как тогда? Этот кусок кода нашел в интернете.

Отправлено: 17:50, 12-02-2010 | #9


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Lev, вот функция, которая рисует изображение:
Код: Выделить весь код
VOID MyPaint(HWND drawitem, LPCSTR picture)
{
	HDC hdc,MemDC;
	PAINTSTRUCT  ps;
	HBITMAP hbmp = LoadImage(NULL, picture, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	hdc = BeginPaint(drawitem, &ps);
	MemDC = CreateCompatibleDC(hdc);
	SelectObject(MemDC, hbmp);
	BitBlt(hdc, 10, 10, 450, 400, MemDC, 0, 0, SRCCOPY);
	DeleteDC(MemDC);
	DeleteObject(hbmp);
	EndPaint(drawitem, &ps);
}
Проверял, у меня работает. Ну только там будет косячок при рисовании нескольких картинок, тогда функцию надо будет переделать.

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 17:58, 12-02-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Вывод картинок

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Загрузка картинок alleclf Вебмастеру 2 25-09-2008 16:19
Разрешение картинок Surround Мобильные ОС, смартфоны и планшеты 3 06-10-2005 00:34
поиск картинок badze Хочу все знать 5 29-03-2004 09:34
Сохранение картинок Guest Хочу все знать 2 16-03-2004 19:25
Прелоад картинок Vampire Вебмастеру 2 18-11-2003 23:58




 
Переход