www.pudn.com > SNMP·¶ÀýÔ´´úÂë.zip > COOL3DWNDMANAGER.CPP
// Cool3DWndManager.cpp: implementation of the CCool3DWndManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Oam.h"
#include "Cool3DWndManager.h"
#include "memDC.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
SIZE _sizeMiniSys;
CDibList imgBoader;
CDibList imgCaption;
AFX_STATIC void AFXAPI
DrawFrameEx(CDC* dc, LPCRECT lpRect, int nWidth, int nHeight, CDibList & img)
{
CRect rect;
// left stile
rect = *lpRect;
int nCount = rect.Height()/nHeight;
for(int i = 0; iFillRect(rectCaption,&brCaption);
imgCaption.Draw(pDCEx,nBase+0,rectCaption.TopLeft(),ILD_NORMAL & ~ILD_TRANSPARENT);
imgCaption.Draw(pDCEx,nBase+1,CPoint(rectCaption.left+30,rectCaption.top),ILD_NORMAL & ~ILD_TRANSPARENT);
imgCaption.Draw(pDCEx,nBase+2,CPoint(rectCaption.left+60,rectCaption.top),ILD_NORMAL & ~ILD_TRANSPARENT);
for(int i = 0; iSelectObject(m_fontSys);//_afx_hfontMiniSys);
int xLeft = rectCaption.left +
(dwStyle & WS_SYSMENU ? _sizeMiniSys.cx : 0);
CSize sizeText = pDCEx->GetTextExtent(strTitle, strTitle.GetLength());
if (sizeText.cx <= rectCaption.Width())
{
pDCEx->SetTextAlign(TA_CENTER);
xLeft += (rectCaption.right - xLeft) / 2;
}
TEXTMETRIC tm;
VERIFY(pDCEx->GetTextMetrics(&tm));
int yHeight = tm.tmAscent + tm.tmDescent + tm.tmInternalLeading;
rectCaption.InflateRect(0, 1);
int yHeightDiff = (rectCaption.Height() - yHeight + 1) / 2;
pDCEx->SetTextColor(::GetSysColor(bActive ?
COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));
pDCEx->SetBkMode(TRANSPARENT);
pDCEx->ExtTextOut(xLeft, rectCaption.top + yHeightDiff, ETO_CLIPPED,
rectCaption, strTitle, strTitle.GetLength(), NULL);
pDCEx->SelectObject(hFontOld);
}
rect.top = rectCaption.bottom;
delete pDCEx;
}
rect = rcAll;
rect.OffsetRect(-rect.left, -rect.top);
rect.top += _sizeMiniSys.cy;
DrawFrameEx(&dc, rect, 10,
10, imgBoader);
}
CCool3DWndManager::CCool3DWndManager()
{
m_pWnd = NULL;
m_bActive = FALSE;
m_bInSys = 0;
m_bLimitMin = TRUE;
if(imgBoader.m_hImageList == NULL)
imgBoader.Load("borders.bmp",7,RGB(255,0,255));
if(imgCaption.m_hImageList == NULL)
{
imgCaption.Load("captionbar.bmp",19,RGB(255,0,255));
_sizeMiniSys.cx = imgCaption.GetEverySize().cx;//bmStruct.bmWidth;
_sizeMiniSys.cy = imgCaption.GetEverySize().cy;//bmStruct.bmHeight;
}
}
CCool3DWndManager::~CCool3DWndManager()
{
HookWindow((HWND)NULL); // (unhook)
}
LRESULT CCool3DWndManager::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
if(imgBoader.m_hImageList == NULL || imgCaption.m_hImageList == NULL)
{
return CSubclassWnd::WindowProc(msg, wp, lp);
}
switch(msg) {
case WM_NCACTIVATE:
return OnNcActivate(wp);
break;
case WM_NCCALCSIZE:
{
OnNcCalcSize(wp,(LPNCCALCSIZE_PARAMS) lp);
return TRUE; // handled
break;
}
case WM_NCPAINT:
OnNcPaint();
return TRUE; // handled
break;
case WM_NCLBUTTONDOWN:
OnNcLButtonDown((INT) wp,CPoint(MAKEPOINTS(lp).x,MAKEPOINTS(lp).y));
return TRUE; // handled
break;
case WM_GETMINMAXINFO:
OnGetMinMaxInfo((LPMINMAXINFO) lp);
return TRUE; // handled
break;
case WM_NCLBUTTONUP:
OnNcLButtonUp((INT) wp,CPoint(MAKEPOINTS(lp).x,MAKEPOINTS(lp).y));
return TRUE; // handled
break;
case WM_ACTIVATE:
OnActivate(LOWORD(wp),CWnd::FromHandle((HWND) lp),(BOOL) HIWORD(wp));
return TRUE; // handled
break;
case WM_SIZE:
break;
case WM_INITDIALOG :
return OnInitDialog();
break;
}
return CSubclassWnd::WindowProc(msg, wp, lp);
}
void CCool3DWndManager::Install(CWnd *pWnd)
{
if(m_pWnd)
HookWindow((HWND)NULL);
ASSERT_VALID(pWnd);
m_pWnd = pWnd;
HookWindow(pWnd); // install message hook
}
void CCool3DWndManager::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
//
LONG dwStyle = m_pWnd->GetStyle();
if (dwStyle & (MFS_4THICKFRAME | WS_THICKFRAME | MFS_THICKFRAME))
{
::InflateRect(lpClientRect,
GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
}
else
{
::InflateRect(lpClientRect,
GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER));
}
if (dwStyle & WS_CAPTION)
lpClientRect->top -= _sizeMiniSys.cy;
}
void CCool3DWndManager::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)
{
Default();
// TODO: Add your message handler code here
if (WA_INACTIVE != nState && !m_bActive)// && pWndOther && (!IsChild(pWndOther) && !(pWndOther == this)))
{
m_bActive = TRUE;
m_pWnd->SendMessage(WM_NCPAINT);
}
else if(WA_INACTIVE == nState && m_bActive)//&& pWndOther && (IsChild(pWndOther) || pWndOther == this))
{
m_bActive = FALSE;
m_pWnd->SendMessage(WM_NCPAINT);
}
}
BOOL CCool3DWndManager::OnNcActivate(BOOL bActive)
{
return TRUE;
}
void CCool3DWndManager::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
{
LONG dwStyle = m_pWnd->GetStyle();
if (
m_pWnd->IsKindOf(RUNTIME_CLASS(CDialog))
||
(dwStyle & (MFS_4THICKFRAME | MFS_THICKFRAME | WS_THICKFRAME))
)
{
::InflateRect(lpncsp->rgrc,
-GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME));
}
else if(!m_pWnd->IsKindOf(RUNTIME_CLASS(CDialog)))
{
::InflateRect(lpncsp->rgrc,
-GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
}
if (dwStyle & WS_CAPTION)
lpncsp->rgrc[0].top += _sizeMiniSys.cy;
if(bCalcValidRects)
{
lpncsp->rgrc[0].top = lpncsp->lppos->y + _sizeMiniSys.cy;
lpncsp->rgrc[0].left += 6;
lpncsp->rgrc[0].bottom -= 6;
lpncsp->rgrc[0].right -= 6;
}
}
void CCool3DWndManager::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (nHitTest != HTZOOM && nHitTest !=HTMAXBUTTON
&& nHitTest !=HTGROWBOX && nHitTest != HTCLOSE
&& nHitTest !=HTMINBUTTON)
{
Default();
return;
}
m_bInSys = nHitTest;
m_bSysTracking = TRUE;
}
void CCool3DWndManager::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
if (!m_bSysTracking)
{
Default();
return;
}
m_bSysTracking = FALSE;
m_pWnd->ClientToScreen(&point);
UINT aa = m_pWnd->SendMessage(WM_NCHITTEST ,point.x,point.y);
if (nHitTest == m_bInSys)
{
switch (nHitTest)
{
case HTZOOM:
if(m_pWnd->GetStyle() & WS_MAXIMIZE)
m_pWnd->SendMessage(WM_SYSCOMMAND,SC_RESTORE ,0);
else
m_pWnd->SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE ,0);
break;
case HTSIZE:
m_pWnd->SendMessage(WM_SYSCOMMAND,SC_MINIMIZE ,0);
break;
case HTCLOSE:
m_pWnd->SendMessage(WM_SYSCOMMAND,SC_CLOSE ,0);
break;
case HTMINBUTTON:
m_pWnd->SendMessage(WM_SYSCOMMAND,SC_MINIMIZE ,0);
break;
}
}
}
void CCool3DWndManager::OnNcPaint()
{
CWindowDC dc(m_pWnd);
LONG dwStyle = m_pWnd->GetStyle();
CRect rect;
m_pWnd->GetWindowRect(&rect);
CString strTitle;
m_pWnd->GetWindowText(strTitle);
DrawLlxNcRect(dc,rect,strTitle,dwStyle,m_bActive);
}
void CCool3DWndManager::OnSize(UINT nType, int cx, int cy)
{
}
void CCool3DWndManager::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
{
Default(); // don't allow sizing smaller than the non-client area
CRect rectWindow, rectClient;
m_pWnd->GetWindowRect(rectWindow);
m_pWnd->GetClientRect(rectClient);
lpMMI->ptMinTrackSize.x = rectWindow.Width() - rectClient.right;
lpMMI->ptMinTrackSize.y = rectWindow.Height() - rectClient.bottom;
int nOffsetX = 10 - GetSystemMetrics(SM_CXBORDER) - GetSystemMetrics(SM_CXFRAME);
int nOffsetY = 10 - GetSystemMetrics(SM_CYBORDER) - GetSystemMetrics(SM_CYFRAME);
lpMMI->ptMaxPosition.x = 0;//+= (nOffsetX-1);
lpMMI->ptMaxPosition.y = 0;//+= (nOffsetX-1);
lpMMI->ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN);//-= nOffsetX;
lpMMI->ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN);//-= nOffsetY;
lpMMI->ptMaxTrackSize.x = GetSystemMetrics(SM_CXSCREEN);//-= nOffsetX;
lpMMI->ptMaxTrackSize.y = GetSystemMetrics(SM_CYSCREEN);//-= nOffsetY;
if(!m_bLimitMin)
{
lpMMI->ptMinTrackSize.x = 300;
lpMMI->ptMinTrackSize.y = 50;
}
else if(m_pWnd->IsKindOf(RUNTIME_CLASS(CDialog)))
{
lpMMI->ptMinTrackSize.x = 300;
lpMMI->ptMinTrackSize.y = 200;
}
else
{
lpMMI->ptMinTrackSize.x = 640;
lpMMI->ptMinTrackSize.y = 480;
}
}
BOOL CCool3DWndManager::OnInitDialog()
{
Default();
CRect rect;
m_pWnd->GetWindowRect(&rect);
rect.InflateRect(6,6);
m_pWnd->MoveWindow(rect,TRUE);
m_pWnd->CenterWindow();
return TRUE;
}
void CCool3DWndManager::UnInstall()
{
HookWindow((HWND)NULL); // (unhook)
}
BOOL CCool3DWndManager::LimitMin(BOOL bLimit)
{
BOOL ret = m_bLimitMin;
m_bLimitMin = bLimit;
return ret;
}