[WinApi] Как добавить поддержку скинов?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by BlackSilver, 7 Aug 2009.

  1. BlackSilver

    BlackSilver New Member

    Joined:
    30 Jan 2009
    Messages:
    28
    Likes Received:
    4
    Reputations:
    0
    Хочется, чтоб в программе была поддержка скинов. Причем серьёзных, чтоб перерисовывать границы окна и кнопки в заголовке. Всё, что я нашел с сети - это платные библиотеки. А это - фигня, хочется самому написать.
    Пишу на С + winapi. Подскажите, пожалуйста, в какую сторону копать. Или линк на статью по этому поводу - вообще в круто было.
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    [​IMG]
    вот исходник, а вот на основе его theme.h и theme.rc

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

    Code:
    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;
    
    		//----------------------------------------------
    
    
     
    _________________________
    2 people like this.
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    А смысл прост рисуй окно и элементы на WM_PAINT у каких можно элементов обрабатывай OWNERDRAW, если нужно можно воспользоватся сабклассингом (я сделал для кнопок чтобы определять наведение на них). При прорисовке элементов еще можно определять части какие нужно перерисовывать перекрытия...

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

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще достаточно глянуть как реализовано это в винампе. Там всё банально.
    И там нет кнопок и прочих элементов вообще.
    т.е. форма - рисунок с нарисованными элементами.
    Все элементы представляют собой всеголишь координаты.
    И к примеру когда нажимаеш на форму, то берутся координаты и вычисляется к какому элементу они относятся. Затем просто рисунок этого участка перерисовывается. и русиется изображение соответствующее этому элементу и события. Типа Кнопка
    Основной вид, нажатое состояние, наведенное состояние. Также и с другими элементами. Концепция довольно легко реализуемая, но в тоже время дающая ооочень хорошие перспективы, потому как к примеру кнопка может иметь обсолютно любую форму.
     
  5. BlackSilver

    BlackSilver New Member

    Joined:
    30 Jan 2009
    Messages:
    28
    Likes Received:
    4
    Reputations:
    0
    Про кнопки и т.д. - то понятно. Я парился с самим заголовком окна, бордерами, кнопками на заголовке...
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 BlackSilver А кто тебе не дает убрать вообще заголовок окна?
    Убираеш его нафиг, и вверху проги сам чтонить рисуй и кнопки накидай.