ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
[WinApi] Как добавить поддержку скинов? |

07.08.2009, 15:17
|
|
Познающий
Регистрация: 30.01.2009
Сообщений: 30
Провел на форуме: 75077
Репутация:
14
|
|
[WinApi] Как добавить поддержку скинов?
Хочется, чтоб в программе была поддержка скинов. Причем серьёзных, чтоб перерисовывать границы окна и кнопки в заголовке. Всё, что я нашел с сети - это платные библиотеки. А это - фигня, хочется самому написать.
Пишу на С + winapi. Подскажите, пожалуйста, в какую сторону копать. Или линк на статью по этому поводу - вообще в круто было.
|
|
|

09.08.2009, 14:13
|
|
Постоянный
Регистрация: 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;
//----------------------------------------------
|
|
|

09.08.2009, 14:25
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме: 991929
Репутация:
395
|
|
А смысл прост рисуй окно и элементы на WM_PAINT у каких можно элементов обрабатывай OWNERDRAW, если нужно можно воспользоватся сабклассингом (я сделал для кнопок чтобы определять наведение на них). При прорисовке элементов еще можно определять части какие нужно перерисовывать перекрытия...
Некоторые элементы придется делать самому например прогресс бары... возможно скролы... в общем это гемор )
|
|
|

09.08.2009, 15:00
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Вообще достаточно глянуть как реализовано это в винампе. Там всё банально.
И там нет кнопок и прочих элементов вообще.
т.е. форма - рисунок с нарисованными элементами.
Все элементы представляют собой всеголишь координаты.
И к примеру когда нажимаеш на форму, то берутся координаты и вычисляется к какому элементу они относятся. Затем просто рисунок этого участка перерисовывается. и русиется изображение соответствующее этому элементу и события. Типа Кнопка
Основной вид, нажатое состояние, наведенное состояние. Также и с другими элементами. Концепция довольно легко реализуемая, но в тоже время дающая ооочень хорошие перспективы, потому как к примеру кнопка может иметь обсолютно любую форму.
|
|
|

11.08.2009, 14:03
|
|
Познающий
Регистрация: 30.01.2009
Сообщений: 30
Провел на форуме: 75077
Репутация:
14
|
|
Сообщение от Gar|k
А смысл прост рисуй окно и элементы на WM_PAINT у каких можно элементов обрабатывай OWNERDRAW, если нужно можно воспользоватся сабклассингом (я сделал для кнопок чтобы определять наведение на них). При прорисовке элементов еще можно определять части какие нужно перерисовывать перекрытия...
Некоторые элементы придется делать самому например прогресс бары... возможно скролы... в общем это гемор )
Про кнопки и т.д. - то понятно. Я парился с самим заголовком окна, бордерами, кнопками на заголовке...
|
|
|

11.08.2009, 16:09
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
2 BlackSilver А кто тебе не дает убрать вообще заголовок окна?
Убираеш его нафиг, и вверху проги сам чтонить рисуй и кнопки накидай.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|