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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2016, 21:01   #1
ponchic
Пользователь
 
Регистрация: 23.08.2015
Сообщений: 34
По умолчанию Не выводится растр из Бо после добавления двойной буферизации! - C++ WinAPI

Почему программа не выводит изображение из БО в окно? Но зато 4 предупреждения что hBmp не может использоваться без инициализации, не сочтите за труд помочь нубу, до того как добавил двойную буферизицию кое-как выводила.

http://pastebin.com/eLHVNgRw

Последний раз редактировалось Stilet; 06.01.2016 в 21:51.
ponchic вне форума Ответить с цитированием
Старый 06.01.2016, 22:19   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Потому что это
Код:
HBITMAP hBmp, hMaska, hOldBitmap;
...
            if (hBmp != NULL)
            hMemBmp = hBmp;
и
Код:
        HBITMAP hBmp;
if ( OpenClipboard(hWnd) )
hBmp = (HBITMAP)GetClipboardData(CF_BITMAP);
две разные hBmp
p51x вне форума Ответить с цитированием
Старый 07.01.2016, 10:04   #3
ponchic
Пользователь
 
Регистрация: 23.08.2015
Сообщений: 34
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Потому что это
Код:
HBITMAP hBmp, hMaska, hOldBitmap;
...
            if (hBmp != NULL)
            hMemBmp = hBmp;
и
Код:
        HBITMAP hBmp;
if ( OpenClipboard(hWnd) )
hBmp = (HBITMAP)GetClipboardData(CF_BITMAP);
две разные hBmp
на 75 объявление убрал, попробовал в вм_паинте к hBmp прописать глобальный доступ ::hBmp - не помогло.
убрал скобки в вм_креат - тоже не помогло
Что делать?(((
ponchic вне форума Ответить с цитированием
Старый 07.01.2016, 21:52   #4
ponchic
Пользователь
 
Регистрация: 23.08.2015
Сообщений: 34
По умолчанию

всем спасибо за рвение помоч
вот варинат без БО
Код:
#include <windows.h> // заголовочный файл, содержащий WINAPI


// Прототип функции обработки сообщений с пользовательским названием:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR mainMessage[] = L"Какой то-текст!"; // строка с сообщением

// Управляющая функция:
int WINAPI WinMain(HINSTANCE hInst, // дескриптор экземпляра приложения
	HINSTANCE hPrevInst, // не используем
	LPSTR lpCmdLine, // не используем
	int nCmdShow) // режим отображения окошка
{
	TCHAR szClassName[] = L"Мой класс"; // строка с именем класса
	HWND hMainWnd; // создаём дескриптор будущего окошка
	MSG msg; // создём экземпляр структуры MSG для обработки сообщений
	WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
	wc.cbSize        = sizeof(wc); // размер структуры (в байтах)
	wc.style         = CS_HREDRAW | CS_VREDRAW; // стиль класса окошка
	wc.lpfnWndProc   = WndProc; // указатель на пользовательскую функцию
	wc.lpszMenuName  = NULL; // указатель на имя меню (у нас его нет)
	wc.lpszClassName = szClassName; // указатель на имя класса
	wc.cbWndExtra    = NULL; // число освобождаемых байтов в конце структуры
	wc.cbClsExtra    = NULL; // число освобождаемых байтов при создании экземпляра приложения
	wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
	wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
	wc.hInstance     = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
	if(!RegisterClassEx(&wc)){
		// в случае отсутствия регистрации класса:
		MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
		return NULL; // возвращаем, следовательно, выходим из WinMain
	}
	// Функция, создающая окошко:
	hMainWnd = CreateWindow(
		szClassName, // имя класса
		L"Сохранение снимка", // имя окошка (то что сверху)
		WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окошка
		CW_USEDEFAULT, // позиция окошка по оси х
		NULL, // позиция окошка по оси у (раз дефолт в х, то писать не нужно)
		CW_USEDEFAULT, // ширина окошка
		NULL, // высота окошка (раз дефолт в ширине, то писать не нужно)
		(HWND)NULL, // дескриптор родительского окна
		NULL, // дескриптор меню
		HINSTANCE(hInst), // дескриптор экземпляра приложения
		NULL); // ничего не передаём из WndProc
	if(!hMainWnd){
		// в случае некорректного создания окошка (неверные параметры и тп):
		MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
		return NULL;
	}
	ShowWindow(hMainWnd, nCmdShow); // отображаем окошко
	UpdateWindow(hMainWnd); // обновляем окошко
	while(GetMessage(&msg, NULL, NULL, NULL)){ // извлекаем сообщения из очереди, посылаемые фу-циями, ОС
		TranslateMessage(&msg); // интерпретируем сообщения
		DispatchMessage(&msg); // передаём сообщения обратно ОС
	}
	return msg.wParam; // возвращаем код выхода из приложения
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
	HDC hDC, hDCMem; // создаём дескриптор ориентации текста на экране
	PAINTSTRUCT ps; // структура, сод-щая информацию о клиентской области (размеры, цвет и тп)
	RECT rect; // стр-ра, определяющая размер клиентской области
	COLORREF colorText = RGB(255, 0, 0); // задаём цвет текста
	HBITMAP hBmp, hMaska, hOldBitmap;
	BITMAP bmInfo;
	HINSTANCE hInstance;
	BOOL sucess;
	switch(uMsg){

	case WM_CREATE: 
		hDC = BeginPaint(hWnd, &ps); 
		//HBITMAP hBmp;




break;
			
			
	case WM_PAINT: {// если нужно нарисовать, то:
		 GetClientRect(hWnd, &rect);
			
			hDC = BeginPaint(hWnd, &ps); // инициализируем контекст устройства
			if ( OpenClipboard(hWnd) )
hBmp = (HBITMAP)GetClipboardData(CF_BITMAP);
			if (hBmp == NULL)
			{
				MessageBox(NULL, L"error", L" ", MB_OK);
				PostQuitMessage(NULL);
			}

			hDCMem = CreateCompatibleDC(hDC);
			hOldBitmap = (HBITMAP) SelectObject(hDCMem, hBmp);
GetObject(hBmp, sizeof(bmInfo), &bmInfo);

			 BitBlt(hDC, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, hDCMem, 8, 22, SRCCOPY);
			
CloseClipboard();
			
			 DeleteDC(hDCMem);
			

EndPaint(hWnd, &ps); // заканчиваем рисовать

break;
	}
	case WM_DESTROY: // если окошко закрылось, то:
		PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окошко
	}
	return NULL; // возвращаем значение
}
ponchic вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не выводится 2 знака после запятой _Lenn C# (си шарп) 4 17.11.2013 18:21
Как записать растр в файл? Как прочесть растр из файла? litvin44 Win Api 1 20.05.2010 23:17
Использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Win Api 1 05.04.2010 20:08
Win Api: использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Помощь студентам 0 05.04.2010 19:55
Выводится повторное исключение после моего стандартного. prikolist Общие вопросы C/C++ 4 26.03.2009 13:35