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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2016, 12:47   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Не работает PathToRegion()

Добрый день !

Уверен, что есть люди которые работали с PathToRegion().

Подскажите пожалуйста, почему она возвращает ноль в WM_PAINT?

Код:
hRgn = PathToRegion(hdc);
___________________________________ _____________

Код:
POINT pt[5] = { {0,100}, {-59,-81}, {95,31}, {-95,31}, {59,-81} };
const int WIDTH = 400;
const int HEIGHT  = 300;
 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	static int sx, sy;
	static HBRUSH hBrush;
	HRGN hRgn;
	switch (message)
	{
	case WM_CREATE:
		hBrush = CreateSolidBrush(RGB(255, 0, 0));
		break;
	case WM_SIZE:
		sx = LOWORD(lParam);
		sy = HIWORD(lParam);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		SetMapMode(hdc, MM_ANISOTROPIC);	
		SetWindowExtEx(hdc, WIDTH, -HEIGHT , NULL);
		SetViewportExtEx(hdc, sx, sy, NULL);
		SetViewportOrgEx(hdc, sx/2, sy/2, NULL);
		BeginPath(hdc);
		Polyline(hdc, pt, 5);
		CloseFigure(hdc);
		EndPath(hdc);
		
		hRgn = PathToRegion(hdc);
		FillRgn(hdc,hRgn,hBrush);
		
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY: PostQuitMessage(0); break;
	default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
RAFA91 вне форума Ответить с цитированием
Старый 12.03.2016, 15:15   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну так запросите GetLastError после это функции и посмотрите какой код ошибки даст.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.03.2016, 16:18   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну так запросите GetLastError после это функции и посмотрите какой код ошибки даст.
Вы думаете я это не делал

ERROR_CAN_NOT_COMPLETE

как решить эту проблему. ?

нигде не нашел практического притенения PathToRegion().

одна теория с описанием
RAFA91 вне форума Ответить с цитированием
Старый 12.03.2016, 17:52   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы хоть знаете зачем она нужна?
дайте полный пример применения.

просто если вы тупо вызываете ее наобум, то так и должно быть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.03.2016, 18:14   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а вы хоть знаете зачем она нужна?
дайте полный пример применения.

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

___________________________________ _______

полный код обработки сообщений я привел.

вот еще главная функция.

Код:
#include <Windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
TCHAR WinName[] = _T("MainFrame") ;
int APIENTRY _tWinMain(HINSTANCE This, // Дескриптор текущего приложения
	HINSTANCE Prev,                   // В современных системах всегда 0
	LPTSTR cmd,                       // Командная строка
	int mode)                         // Режим отображения окна
{
	HWND hWnd;              // Дескриптор главного окна программы
	MSG msg;                // Структура для хранения сообщения
	WNDCLASS wc;  // Класс окна
// Определение класса окна
	wc.hInstance = This;
	wc.lpszClassName = WinName;                // Имя класса окна
	wc.lpfnWndProc = WndProc;                  // Функция окна
	wc.style = CS_HREDRAW | CS_VREDRAW;       // Стиль окна
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);    // Стандартная иконка
	wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Стандартный курсор
	wc.lpszMenuName = NULL;       // Нет меню
	wc.cbClsExtra = 0;            // Нет дополнительных данных класса
	wc.cbWndExtra = 0;            // Нет дополнительных данных окна
	// Заполнение окна белым цветом
	wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
	if (!RegisterClass(&wc)) return 0;   // Регистрация класса окна
// Создание окна
	hWnd = CreateWindow(WinName, // Имя класса окна
    _T("Каркас Windows-приложения"),  // Заголовок окна
	WS_OVERLAPPEDWINDOW,         // Стиль окна
	CW_USEDEFAULT, // x
	CW_USEDEFAULT, // y   Размеры окна
	CW_USEDEFAULT, // width


	CW_USEDEFAULT, // Height
	HWND_DESKTOP, // Дескриптор родительского окна
	NULL,         // Нет меню
	This,         // Дескриптор приложения
	NULL);        // Дополнительной информации нет
	ShowWindow(hWnd, mode); // Показать окно
// Цикл обработки сообщений
	while(GetMessage(&msg, NULL, 0, 0))
	{
	TranslateMessage(&msg); // Функция трансляции кодов нажатой клавиши
	DispatchMessage(&msg);  // Посылает сообщение функции WndProc()
	}
	return 0;
}


делал по этому примеру.
Изображения
Тип файла: jpg Безымянный.JPG (56.5 Кб, 70 просмотров)
Тип файла: jpg нный.JPG (52.1 Кб, 65 просмотров)

Последний раз редактировалось RAFA91; 12.03.2016 в 18:19.
RAFA91 вне форума Ответить с цитированием
Старый 12.03.2016, 19:03   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

где ваше применение функции? я не просил код создания окна.

PS: я догадываюсь в чем ошибка, но лучше все же точно увидеть, тогда я дам точный совет.
PPS: и можно название книги и номер главы/страницы, хочу посмотреть описан ли там нюанс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.03.2016, 12:33   #7
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
где ваше применение функции? я не просил код создания окна.

.
Повторюсь по поводу моей проблемы.

есть набор точек описывающих фигуру (в данном случае это вершины звезды)

Код:
POINT pt[5] = { {0,100}, {-59,-81}, {95,31}, {-95,31}, {59,-81} };
далее строю путь по этим точкам используя следующий набор функций.

Код:
BeginPath(hdc);
		Polyline(hdc, pt, 5);
		CloseFigure(hdc);
		EndPath(hdc);
далее собственно хочу получить регион (звезда) используя

Код:
hRgn = PathToRegion(hdc);
но в результате получаю ноль (((((((

в книге к сожалению не описано применение PathToRegion(), поэтому

и не знаю правильно ли я ее вообще использовал.

Вот по этому и прошу у Вас помощи.

___________________________________ ___________

Код:
POINT pt[5] = { {0,100}, {-59,-81}, {95,31}, {-95,31}, {59,-81} };
const int WIDTH = 400;
const int HEIGHT  = 300;
 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	static int sx, sy;
	static HBRUSH hBrush;
	HRGN hRgn;
	switch (message)
	{
	case WM_CREATE:
		hBrush = CreateSolidBrush(RGB(255, 0, 0));
		break;
	case WM_SIZE:
		sx = LOWORD(lParam);
		sy = HIWORD(lParam);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		SetMapMode(hdc, MM_ANISOTROPIC);	
		SetWindowExtEx(hdc, WIDTH, -HEIGHT , NULL);
		SetViewportExtEx(hdc, sx, sy, NULL);
		SetViewportOrgEx(hdc, sx/2, sy/2, NULL);
		BeginPath(hdc);
		Polyline(hdc, pt, 5);
		CloseFigure(hdc);
		EndPath(hdc);
		
		hRgn = PathToRegion(hdc);
		FillRgn(hdc,hRgn,hBrush);
		
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY: PostQuitMessage(0); break;
	default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
страница 50
Изображения
Тип файла: jpg p0001.jpg (82.1 Кб, 119 просмотров)

Последний раз редактировалось RAFA91; 13.03.2016 в 12:39.
RAFA91 вне форума Ответить с цитированием
Старый 14.03.2016, 12:24   #8
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Видать на самом деле PathToRegion(hdc); со своими приколами, раз даже спецы не могут ее преодолеть.

неужели никто с ней не работал ?
RAFA91 вне форума Ответить с цитированием
Старый 14.03.2016, 12:44   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
раз даже спецы не могут ее преодолеть.
все спецы могут, просто некогда мне было.

так...а кто вам сказал что hRgn равен NULL?
то то вы не видите свою закорючку не значит что == NULL.
область просмотра настройте сначала верно.

выкинув SetViewportOrgEx увидел фигуру крупно.
вы хоть не ставьте противоречивые значения.
у вас область окна задана 400*-300. а окно выходит больше, итого sx и sy больше допустимого, и вы рисуете за пределами окна.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.03.2016, 13:07   #10
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение

так...а кто вам сказал что hRgn равен NULL?

.
мне это сказал такой пример

Код:
if (!hRgn) TextOut(hdc, 0, 0, str_1, _tcsclen(str_1));
выводится строка
Код:
TCHAR *str_1 = _T("Боря");
если бы там нуля не было - то не получил бы это сообщение
Код:
SetViewportOrgEx(hdc, sx/2, sy/2, NULL);
перемещает начало координат в центр окна.

Последний раз редактировалось RAFA91; 14.03.2016 в 13:10.
RAFA91 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему прсер работает на одних сайтах и не работает на других PHP_DELETANT PHP 4 12.02.2016 13:45
Помогите разобраться - не работает файл со скриптом. При загрузке из консоли этот же скрипт работает Kazik JavaScript, Ajax 6 27.11.2015 16:09
Не работает анимация. Механизм работает лишь при изменения числа в едит1. Студент ММИ Помощь студентам 1 18.05.2015 07:39
не работает relese версия проги и debug работает тока на моем компе D][mon C# (си шарп) 2 04.05.2012 20:21
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56