ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

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

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

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

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

Репутация: 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
Провел на форуме:
991929

Репутация: 395


По умолчанию

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

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

  #4  
Старый 09.08.2009, 15:00
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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

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

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

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

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

  #6  
Старый 11.08.2009, 16:09
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как стать админом ICQ (c) yarrak InfernoNet Болталка 77 06.08.2009 15:15
Как стать хакером! foreva Болталка 19 12.12.2007 00:12
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42



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


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




ANTICHAT.XYZ