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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2009, 01:59   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию вывод картинки на экран

Всем привет, вот я задуал идею, зделать прогу, чтобы при начале ее работы выводилась на экран картинка, фората .bmp, и висела определенное кол-во секунд (ну это чуть позже) и открывать ее не с помощью там редакторов, а вот наприер картинка 120*120 пикселов и чтобы она заниала это пространство на рабоче столе. Спасибо за внимание, буду благодарен за любую информацию.
P.S. у меня стоит VS 6
Olejik вне форума Ответить с цитированием
Старый 15.09.2009, 02:01   #2
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

ой, забыл, не нужна инфорация по поводу: про какие функции почитать (которые будут употреблены в ходе работы) и какие книжки взять в руки по этой теме
Olejik вне форума Ответить с цитированием
Старый 15.09.2009, 02:19   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от Olejik Посмотреть сообщение
какие книжки взять в руки по этой теме
бери книги по winapi

http://www.vsokovikov.narod.ru/New_M..._simpl_ogl.htm
counter вне форума Ответить с цитированием
Старый 15.09.2009, 10:25   #4
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

спасибо за ответ
Olejik вне форума Ответить с цитированием
Старый 15.09.2009, 19:10   #5
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Здравствуйте опять, у меня появились вопросики:
CreateBitmap,AlphaBlend,BitBlt,Load Bitmap - это мне поможет вывести картиночку на монитор?
И вообще я хочу узнать алгоритм вывода рисунка на экран,я так понял он примерно таков: открываем bmp файл, считываем оттудова рисунок (в двумерный массив, динамический), потом вписываем функции, которые будут выводить его на экран, задаем местоположение его на рабочем столе, создаем чот то наподобии окошка, размер которого равен размеру картинки и в него "запихиваем" картиночку. Если я не прав, то поправьте меня, т.к. я это из головы своей взял.
Olejik вне форума Ответить с цитированием
Старый 15.09.2009, 19:57   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вот, пример набросал:
Код:
#include <windows.h>
#include <tchar.h>

long __stdcall WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

HINSTANCE g_hInstance; // объявляем глобальную переменную g_hInstance, дабы можно было использовать hInstance в ф-циях, окромя WinMain.
const int width  = 600;
const int height = 300;

int __stdcall _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
{
	WNDCLASS wc;
	MSG msg;
	TCHAR* lpClassName = TEXT("SplashWindow");

	g_hInstance = hInstance;
	memset(&wc, 0, sizeof(wc));
	wc.hbrBackground = (HBRUSH)5;
	wc.hCursor = LoadCursor(0, IDC_ARROW);
	wc.hIcon   = LoadIcon(0, IDI_APPLICATION);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WindowProc;
	wc.lpszClassName = lpClassName;
	wc.style = CS_HREDRAW|CS_VREDRAW;

	RegisterClass(&wc);

	int x = (GetSystemMetrics(SM_CXSCREEN) - width)/2; // вычисляем координату икс так, чтобы окно было расположено по центру
	int y = (GetSystemMetrics(SM_CYSCREEN) - height)/2; // то же самое для игрек (GetSystemMetrics(SM_CYSCREEN) возвращает текущее разрешение по вертикали
// SM_CXSCREEN то же самое, но по горизонтали)
	CreateWindowEx(0, lpClassName, 0, WS_POPUP|WS_VISIBLE, x, y, width, height, NULL, 0, hInstance, 0); // задаём стиль WS_POPUP(чтобы окно было без заголовка и т.д.)

	while(GetMessage(&msg, NULL, 0, 0)) {
		DispatchMessage(&msg);
	}

	return 0;
}

long __stdcall WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	HDC hMemDC;
	PAINTSTRUCT ps;
	static HBITMAP hBitmap; // static, чтобы не создавались каждый раз
	static DWORD TimerID;   // при вызове ф-ции, а оставались теми же

	switch(uMsg) {
		case WM_CREATE:
			hBitmap = LoadBitmap(g_hInstance, TEXT("image")); // загружаем из ресурсов битмап
			TimerID = SetTimer(hWnd, 0, 2000, 0); // ставим таймер в 2 секунды
			break;

		case WM_PAINT:
			hDC = BeginPaint(hWnd, &ps); // получаем контекст окна

			hMemDC = CreateCompatibleDC(hDC); // создаём совместимый контекст в памяти
			SelectObject(hMemDC, hBitmap); // зарисовываем его нашей картинкой
			BitBlt(hDC, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY); // копируем из контекста в памяти в контекст окна
			DeleteDC(hMemDC); // удаляем контекст в памяти

			EndPaint(hWnd, &ps);
			break;

		case WM_TIMER: // это сообщение мы получаем раз в 2 секунды
			KillTimer(hWnd, TimerID); // поскольку всё что нам нужно - это закрытие окна, то можем смело удалять таймер прямо тут
			SendMessage(hWnd, WM_DESTROY, 0, 0); // отправляем окну сообщение о разрушении
			break;

		case WM_DESTROY:
			DeleteObject(hBitmap);
			PostQuitMessage(0); // завершить программу по закрытии окна
			break;

		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam); 
	}

	return 0;
}
битмап я храню в ресурсах, с идентификатором image.
Контекст окна(DC - Device Context - Контекст Устройства) - это область памяти, где хранится графическое отображение окна. Можно напрямую в него копировать битмап(SelectObject(hDC, hBitmap), но это будет медленно, быстрее отрисовать его в памяти, а потом скопировать эту память на контекст окна(это называется двойной буферизацией), для этого мы пользуемся ф-цией CreateCompatibleDC(hDC); - она создаёт совместимый контекст в памяти. В обработке сообщения WM_CREATE я устанавливаю таймер, который каждые две секунды будет посылать окну сообщение WM_TIMER, в обработке коего я посылаю окну сообщение о разрушении. В общем в интернете много материала на эту тему - почитайте, что не ясно - спрашивайте)

Последний раз редактировалось netrino; 15.09.2009 в 19:59.
netrino вне форума Ответить с цитированием
Старый 15.09.2009, 20:43   #7
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

хорошо, сейчас начну изучение, спасибо огромное )
Olejik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод на экран Nikolai_90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 02.05.2012 09:25
как вывести на экран определённую часть картинки? Gigabit Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 23.06.2009 14:22
вывод картинки *.png на экран телефона furstenberg Общие вопросы по Java, Java SE, Kotlin 3 31.07.2008 22:07
Вывод на экран Rifler Паскаль, Turbo Pascal, PascalABC.NET 10 18.07.2008 18:30
Вывод на 2-ой экран DShiller Общие вопросы Delphi 0 26.05.2008 15:25