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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2017, 17:28   #1
__Игорь__
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 26
По умолчанию Круглая кнопка

Здравствуйте. Понимаю, что это тема наверное уже набила оскомину )
Однако ) Создаю круглую кнопку через CreateEllipticRgn и SetWindowRgn.
Все прекрасно работает, но обламывает то, что у кнопки рваные края получаются (видно ступеньки пикселов на краях), хотя прямоугольник задаю при создании кнопки 50 на 50.
Можно это как-нибудь поправить ? Спасибо
__Игорь__ вне форума Ответить с цитированием
Старый 27.04.2017, 09:09   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

поставь стиль BS_OWNERDRAW и рисуй кнопку в WM_DRAWITEM
Это проще чем кажется
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.04.2017, 09:33   #3
__Игорь__
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
поставь стиль BS_OWNERDRAW и рисуй кнопку в WM_DRAWITEM
Это проще чем кажется
да я так и делаю собственно

Код:
case WM_INITDIALOG:
	{
		InitCommonControls();
		//Button 
		HWND hWndButton = CreateWindow(L"button", L"But",
			WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | BS_OWNERDRAW,
			50, 535, 50, 50,
			hDlg, (HMENU)ID_BUTTON, hInst, NULL);
		RECT rct;
	       GetClientRect(hwnd, &rct);
	       HRGN hRgn = CreateEllipticRgn(rct.left, rct.top, rct.right, rct.bottom);
	      SetWindowRgn(hwnd, hRgn, false);
	       DeleteObject(hRgn);

**********************************************
case WM_DRAWITEM:
	{
		LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;

		if (lpdis->CtlID == ID_BUTTON)
		{
			HDC hdcMem = CreateCompatibleDC(lpdis->hDC);
			HBITMAP scin_stop1 = (HBITMAP)LoadImage(hInst, L"D:\\Igor_Program\\1\\Ukazchik_Test\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

			HBITMAP scin_stop2 = (HBITMAP)LoadImage(hInst, L"D:\\Igor_Program\\1\\Ukazchik_Test\\2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

			
			if ( !g_but_check)
			{
				SelectObject(hdcMem, scin_stop2);
			}
			else
			{
				SelectObject(hdcMem, scin_stop1);
			}
			SetStretchBltMode(lpdis->hDC, HALFTONE);
			StretchBlt(lpdis->hDC, 0, 0, 50, 50, hdcMem, 0, 0, 50, 50, SRCCOPY);
			DeleteObject(scin_stop2);
			DeleteObject(scin_stop1);
			DeleteDC(hdcMem);
		}
		return 0;
g_but_check инвертируется при нажатии на кнопку. Код не боевой, просто экспериментирую пока. Раньше интерфейсами под винду особо не занимался, больше с микропроцессорами дело имел
__Игорь__ вне форума Ответить с цитированием
Старый 27.04.2017, 09:49   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от __Игорь__ Посмотреть сообщение
SetWindowRgn(hwnd, hRgn, false);
SetWindowRgn(hWndButton, hRgn, false); какбэ надо
а это
DeleteObject(hRgn);
после SetWindowRgn() делать не надо

Последний раз редактировалось BLACK_RAIN; 27.04.2017 в 09:56.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.04.2017, 09:55   #5
__Игорь__
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
SetWindowRgn(hWndButton, hRgn, false); какбэ надо
да, у меня так и есть, просто скопировал неудачно (у меня часть кода в отдельной функции лежит) на форум слил все вместе для удобства просмотра
__Игорь__ вне форума Ответить с цитированием
Старый 27.04.2017, 09:58   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

уберите DeleteObject(hRgn);
он здесь не нужен.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.04.2017, 10:02   #7
__Игорь__
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
уберите DeleteObject(hRgn);
он здесь не нужен.
хорошо, убрал. Я еще вчера вечером прочитал, что так неправильно, но разницы особой не заметил и оставил как есть
__Игорь__ вне форума Ответить с цитированием
Старый 27.04.2017, 10:05   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от __Игорь__ Посмотреть сообщение
у кнопки рваные края получаются
скриншот покажите
попробуйте сделать
SetWindowRgn(hWndButton, hRgn, true);

Последний раз редактировалось BLACK_RAIN; 27.04.2017 в 10:12.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.04.2017, 10:08   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от __Игорь__ Посмотреть сообщение
хорошо, убрал. Я еще вчера вечером прочитал, что так неправильно, но разницы особой не заметил и оставил как есть
SetWindowRgn() сам уничтожит регион.
После его вызова, hRgn уже недействителен.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.04.2017, 10:09   #10
__Игорь__
Пользователь
 
Регистрация: 25.04.2017
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
скриншот покажите
вот
Изображения
Тип файла: jpg but.jpg (2.2 Кб, 59 просмотров)
__Игорь__ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если коннект то кнопка Button2 должна быть скрыта, и если дисконнект, то кнопка Button2 должна появляться/ компонент IdSMTP Almaz92 Помощь студентам 13 14.03.2016 00:31
Кнопка Vetaluy Microsoft Office Excel 2 17.05.2011 00:03
Кнопка Nortym Паскаль, Turbo Pascal, PascalABC.NET 1 23.04.2011 22:56
Кнопка Obey177 Общие вопросы Delphi 24 02.09.2010 04:50