www.pudn.com > SDKSkin.rar > SkinFrame.h


/**************************************************** 
**  Fujitsu Copyright (C) 2006 - 2007 
**	功    能:	对有CAPTION风格的窗体进行操作。 
 
**	文件名称: 	SkinFrame 
**	文件基类: 
**	扩 展 名:	h 
**	创建日期:	2006-8-19 15:40 
**	作    者:	汪荣 
*****************************************************/ 
 
#ifndef _SKINFRAME_ONCE_ 
#define _SKINFRAME_ONCE_ 
 
//#include "stdafx.h" 
#include ".//SkinProcessor.h" 
#include ".//SkinRect.h" 
#include "./Controls/SkinMenu.h" 
#include "./Controls/SkinDrawItem.h" 
 
extern FILE *pFile; 
BOOL __stdcall EnumChildFunc(HWND  hwnd,LPARAM  lParam)   
{   
	HRGN  pRgn  =  (HRGN)lParam;   
	RECT  rcChild = {0,0,0,0};   
	::GetWindowRect(hwnd,&rcChild);   
	HRGN  rgnChild;   
	HRGN  rgnCopy;   
	rgnCopy = CreateRectRgn(0,0,1,1); 
	CombineRgn(rgnCopy,pRgn,NULL,RGN_COPY); 
	rgnChild = CreateRectRgn(rcChild.left,  rcChild.top,     
		rcChild.right,  rcChild.bottom);   
	CombineRgn(pRgn,rgnCopy,rgnChild,RGN_OR);   
	return  TRUE;   
} 
 
class SkinFrame 
{ 
public: 
	SkinFrame() 
	{ 
	} 
 
	LRESULT CALLBACK SkinFrameProc(SKINMSG &skMsg) 
	{ 
		//return SkinResList::CallDefWndProc(skMsg); 
		LRESULT	lr; 
		SkinProcessor skProcess(skMsg); 
 
		switch(skMsg._msg) 
		{ 
			case WM_SHOWWINDOW: 
				if((BOOL)skMsg._wPm) 
				{ 
					SkinMenuBar::SetRedrawMenu(skMsg._hWnd,0); 
				} 
				break; 
			case 174: 
				return 0; 
			case WM_SETTEXT: 
				{ 
					LRESULT lr = SkinResList::CallDefWndProc(skMsg); 
					SkinPaint sp(skMsg); 
					sp.DrawTitle(); 
					return lr; 
				} 
			case WM_SIZE: 
				lr = SkinResList::CallDefWndProc(skMsg); 
				{ 
					SKRect wndRc = SkinRect::GetWndRect(skMsg._hWnd); 
					HRGN newrgn = CreateRectRgn( 0, 0, wndRc.Width(), wndRc.Height() ); 
					SetWindowRgn(skMsg._hWnd,newrgn,TRUE); 
					//SkinWndState::InvalidRect(skMsg._hWnd,FALSE); 
					//SetWindowPos(skMsg._hWnd,0,0,0, 
					//	0, 
					//	0, 
					//	SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED|SWP_NOSIZE); 
					 
				} 
				return lr; 
			 
					//CTLCOLOR_DLG  
					//CTLCOLOR_EDIT 
					//CTLCOLOR_LISTBOX  
					//CTLCOLOR_MSGBOX 
					//CTLCOLOR_SCROLLBAR  
					//CTLCOLOR_STATIC 
			case WM_CTLCOLORBTN: 
			case WM_CTLCOLORSTATIC: 
				{ 
					SetBkMode((HDC)skMsg._wPm,TRANSPARENT);					 
				} 
				return (LRESULT)GetStockObject(NULL_BRUSH); 
			case WM_ERASEBKGND: 
				return skProcess.ProcessEraseBG(); 
			case WM_NCPAINT: 
				return skProcess.ProcessNcArea(); 
			case WM_ACTIVATE: 
				lr = SkinResList::CallDefWndProc(skMsg); 
				if((skMsg._wPm == WA_ACTIVE || skMsg._wPm == WA_CLICKACTIVE)) 
					SkinResList::GetWndFlag(skMsg._hWnd)->wnActive = 1; 
				else SkinResList::GetWndFlag(skMsg._hWnd)->wnActive = 0; 
				 
				skProcess.ProcessNcArea(); 
				return lr; 
			case WM_NCACTIVATE: 
				if((BOOL)skMsg._wPm) 
					SkinResList::GetWndFlag(skMsg._hWnd)->wnActive = 1; 
				else SkinResList::GetWndFlag(skMsg._hWnd)->wnActive = 0; 
 
				skProcess.ProcessNcArea((BOOL)skMsg._wPm); 
				return !((BOOL)skMsg._wPm); 
			case WM_NCCALCSIZE: 
				return skProcess.ProcessNcCalcSize(); 
			case WM_NCHITTEST: 
				return skProcess.ProcessNcHitTest(); 
			case WM_NCLBUTTONDOWN: 
			case WM_NCRBUTTONDOWN: 
			case WM_NCLBUTTONUP: 
			case WM_NCMOUSEMOVE: 
				return skProcess.ProcessNcMouse(); 
			case WM_SETCURSOR: 
			//case WM_MOUSEMOVE: 
				//return skProcess.ProcessMouse(); 
				//POINT pt; 
				//GetCursorPos(&pt); 
				//RECT rc 
				if(LOWORD(skMsg._lPm) == HTCLIENT) 
				{ 
					SkinMenuBar* pmInfo = SkinMenuBar::GetSkinMenuBar(skMsg._hWnd); 
					if(pmInfo != NULL) 
					{ 
						pmInfo->DrawSkinMenuBar(skMsg._hWnd); 
						SkinMenuBar::SetMenuDrawState(skMsg._hWnd,0); 
					} 
				} 
				break; 
			case WM_GETMINMAXINFO: 
				skProcess.ProcessMinMax((MINMAXINFO *)skMsg._lPm); 
				break; 
		} 
		return SkinResList::CallDefWndProc(skMsg); 
	} 
 
	int  SetBackTransparent(HWND pWnd,BOOL bClientOnly)   
	{   
		HRGN  rgn;   
		if(bClientOnly)   
		{   
			HRGN  rgnWindow,  rgnClient;   
			RECT  rcWindow,  rcClient,  rcRgn;   
			GetWindowRect(pWnd,&rcWindow);   
			GetClientRect(pWnd,&rcClient); 
			int nWid = rcClient.right-rcClient.left; 
			int nHei = rcClient.bottom-rcClient.top; 
			rcClient.left += rcWindow.left; 
			rcClient.top += rcWindow.top; 
			rcClient.right = rcClient.left + nWid; 
			rcClient.bottom = rcClient.top + nHei; 
	  
			rgnWindow = CreateRectRgn(rcWindow.left,rcWindow.top,     
									  rcWindow.right,rcWindow.bottom);   
			rgnClient = CreateRectRgn(rcClient.left,rcClient.top,     
									  rcClient.right,rcClient.bottom);   
			rgn = CreateRectRgn(0,0,1,1); 
			CombineRgn(rgn,rgnWindow,rgnClient,RGN_DIFF);   
		} 
		else   
		{   
			rgn = CreateRectRgn(0,0,0,0); 
		}   
		::EnumChildWindows(pWnd,(WNDENUMPROC)EnumChildFunc,(LPARAM)&rgn);   
		return  SetWindowRgn(pWnd,rgn,TRUE); 
	}  	 
}; 
 
#endif