HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[WinApi] Как добавить поддержку скинов?
  #1  
Старый 07.08.2009, 15:17
BlackSilver
Познающий
Регистрация: 30.01.2009
Сообщений: 30
С нами: 9093757

Репутация: 14
Question [WinApi] Как добавить поддержку скинов?

Хочется, чтоб в программе была поддержка скинов. Причем серьёзных, чтоб перерисовывать границы окна и кнопки в заголовке. Всё, что я нашел с сети - это платные библиотеки. А это - фигня, хочется самому написать.
Пишу на С + winapi. Подскажите, пожалуйста, в какую сторону копать. Или линк на статью по этому поводу - вообще в круто было.
 
Ответить с цитированием

  #2  
Старый 09.08.2009, 14:13
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
С нами: 9023100

Репутация: 395


По умолчанию


вот исходник, а вот на основе его theme.h и theme.rc

юзать примерно так можно:

Код:
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,
					LPSTR lpCmdLine,int nShowCmd)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	
	MSG Msg;

	// настройка темы
	tema.sz_window.w=500;
	tema.sz_window.h=300;
	tema.cl_window.fon=0x484848;
	tema.cl_window.border=0x000000;

	tema.cl_top.fon=0x4a4a4a;
	tema.cl_top.border=0x4e4e4e;
	tema.top_height=13+14;
	tema.cl_topfont=0xffffff;

	tema.cl_button.fon=tema.cl_button.border=0x484848;
	tema.cl_buttonA.fon=0x5b5b5b;
	tema.cl_buttonA.border=0x737373;
	tema.cl_buttonP.fon=0x6d6d6d;
	tema.cl_buttonP.border=0xa0a0a0;
	tema.cl_buttonfont=0xffffff;
	tema.buttonfont=(HFONT)GetStockObject(ANSI_VAR_FONT);

	tema.cl_splitline=0x242424;

	CreateMainWindow(hInstance,nShowCmd);

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

	return (int)Msg.wParam;
}

...
при обработке
//----------------------------------------------
		case WM_CREATE:
		
		close=CreateWindow(_TEXT("button"),NULL,WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,
			tema.sz_window.w-15-7,7,
		15,13,
		hWnd,(HMENU)BT_CLOSE,NULL,NULL);
		oldfunc=SetWindowLong(close, GWL_WNDPROC, (LONG)&GarikBtnProc);

		mini=CreateWindow(_TEXT("button"),NULL,WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,
			tema.sz_window.w-38,7,
		15,13,
		hWnd,(HMENU)BT_MINI,NULL,NULL);
		SetWindowLong(mini, GWL_WNDPROC, (LONG)&GarikBtnProc);

		bit_openfile=CreateWindow(_TEXT("button"),_TEXT("+ История"),WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,
		6,33,
		70,20,
		hWnd,(HMENU)IDB_OPF,NULL,NULL);
		SetWindowLong(bit_openfile, GWL_WNDPROC, (LONG)&GarikBtnProc);

		bit_opendir=CreateWindow(_TEXT("button"),_TEXT("+ Папка"),WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,
		78,33,
		60,20,
		hWnd,(HMENU)IDB_OPD,NULL,NULL);
		SetWindowLong(bit_opendir, GWL_WNDPROC, (LONG)&GarikBtnProc);
..........
// в общем сабклассинг

//----------------------------------------------
		case WM_DRAWITEM:

		LPDRAWITEMSTRUCT bs;
		bs=(LPDRAWITEMSTRUCT)lParam;

// если рисуем кнопачку
if(bs->CtlType==ODT_BUTTON)
	{
	DrawButton(wParam,bs);
	// закончили кнопочку рисовать
	}

		break;

		//----------------------------------------------
//----------------------------------------------
		case WM_PAINT:
			hDC=BeginPaint(hWnd,&PaintStruct);

			//рисуем рамку окна
			DrawPryam(hDC,tema.cl_window,0,0,tema.sz_window.w,tema.sz_window.h);

			//рисуем заголовок
			DrawTop(hDC,NULL);

			//типа меню
			RAMKA color;
			color.fon=0x494949;
			color.border=0x5d5d5d;
			int height,y2,y1,x1,x2;
			height=30;
			x1=1;
			x2=tema.sz_window.w-1;
			y1=tema.top_height+1;
			y2=tema.top_height+height;
			

			DrawPryam(hDC,color,x1,y1,x2,y2);y1=y2;
			DrawLine(hDC,tema.cl_splitline,x1,y1,x2,y2,1);y1=y2+1;
			
			
			height=206;
			y2+=height+1;
			color.fon=color.border;
			DrawPryam(hDC,color,x1,y1,x2,y2);y1=y2;
			DrawLine(hDC,tema.cl_splitline,x1,y1,x2,y2,1);


			EndPaint(hWnd,&PaintStruct);
			return 0;

		//----------------------------------------------
 
Ответить с цитированием

  #3  
Старый 09.08.2009, 14:25
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
С нами: 9023100

Репутация: 395


По умолчанию

А смысл прост рисуй окно и элементы на WM_PAINT у каких можно элементов обрабатывай OWNERDRAW, если нужно можно воспользоватся сабклассингом (я сделал для кнопок чтобы определять наведение на них). При прорисовке элементов еще можно определять части какие нужно перерисовывать перекрытия...

Некоторые элементы придется делать самому например прогресс бары... возможно скролы... в общем это гемор )
 
Ответить с цитированием

  #4  
Старый 09.08.2009, 15:00
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

Вообще достаточно глянуть как реализовано это в винампе. Там всё банально.
И там нет кнопок и прочих элементов вообще.
т.е. форма - рисунок с нарисованными элементами.
Все элементы представляют собой всеголишь координаты.
И к примеру когда нажимаеш на форму, то берутся координаты и вычисляется к какому элементу они относятся. Затем просто рисунок этого участка перерисовывается. и русиется изображение соответствующее этому элементу и события. Типа Кнопка
Основной вид, нажатое состояние, наведенное состояние. Также и с другими элементами. Концепция довольно легко реализуемая, но в тоже время дающая ооочень хорошие перспективы, потому как к примеру кнопка может иметь обсолютно любую форму.
 
Ответить с цитированием

  #5  
Старый 11.08.2009, 14:03
BlackSilver
Познающий
Регистрация: 30.01.2009
Сообщений: 30
С нами: 9093757

Репутация: 14
По умолчанию

Цитата:
Сообщение от Gar|k  
А смысл прост рисуй окно и элементы на WM_PAINT у каких можно элементов обрабатывай OWNERDRAW, если нужно можно воспользоватся сабклассингом (я сделал для кнопок чтобы определять наведение на них). При прорисовке элементов еще можно определять части какие нужно перерисовывать перекрытия...

Некоторые элементы придется делать самому например прогресс бары... возможно скролы... в общем это гемор )
Про кнопки и т.д. - то понятно. Я парился с самим заголовком окна, бордерами, кнопками на заголовке...
 
Ответить с цитированием

  #6  
Старый 11.08.2009, 16:09
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

2 BlackSilver А кто тебе не дает убрать вообще заголовок окна?
Убираеш его нафиг, и вверху проги сам чтонить рисуй и кнопки накидай.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как стать админом ICQ (c) yarrak InfernoNet Болталка 77 06.08.2009 15:15
Как стать хакером! foreva Болталка 19 12.12.2007 00:12



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...
×

ESCROW ADMIN PANEL

Загрузка...
Загрузка...