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