⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skinwin.cpp

📁 换肤窗口也就是窗口内的基本元素及窗口外观会随着要求不断的变换风格。本实例中的窗口可以实现NeoStyle和XpStyle两种风格的互换。教你如何定制窗口框架、标题、边框等
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return TRUE;

}

BOOL CSkinWin::InstallSkin(CWnd *wnd)
{
	if ( !wnd  || !m_bInit ) return FALSE;
	HookWindow( (HWND)NULL);
	int r = HookWindow( wnd );

	DWORD style = GetWindowLong( m_hWnd, GWL_STYLE );
	m_sizable = style & WS_SIZEBOX;
	m_minable = style & WS_MINIMIZEBOX;
	m_maxable = style & WS_MAXIMIZEBOX;
	//m_sysmenu = style & WS_MAXIMIZEBOX;
	style &= ~(WS_MINIMIZEBOX);
	style &= ~WS_MAXIMIZEBOX;
	style &= ~WS_SYSMENU;
	SetWindowLong( m_hWnd, GWL_STYLE, style );

	return r;
}

LRESULT CSkinWin::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
	if ( !IsWindow(m_hWnd) )
		return 0;
	if ( !m_bInit  ) 
		return Default();
		
	switch ( msg )
	{
	case WM_SHOWWINDOW:
		//call setwindowpos to force OnNcCalcSize when hWnd is a dialog
		if ( wp )
			SetWindowPos( m_hWnd, 0, 0, 0, 400, 400, SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED );
		Default();
		return 0;
		break;
	//case WM_ERASEBKGND:
	case WM_INITMENUPOPUP:
		Default();
		return 0;
	//	return OnEraseBkgnd(CDC::FromHandle((HDC)wp) );
		/*
	case WM_INITMENU:
		//a hack, when popup sysmenu, redraw title bar
		HMENU h;
		h = (HMENU)wp;
		int c;
		h = GetSubMenu(h, 0);
		c = GetMenuItemID( h, 0 );
		if ( c == SC_RESTORE )
		{
			CRect r;
			GetClientRect( m_hWnd, r );
			OnNcPaint(0);
			r.bottom = GetSystemMetrics(SM_CYCAPTION);
			InvalidateRect( m_hWnd, r, TRUE );
			UpdateWindow( m_hWnd );
		}
		Default();
		return 0;
		*/
	case WM_SYSCOMMAND:
		OnSysCommand( wp, lp );
		//Default();
		return 0;
	case WM_SETTEXT:
		return OnSetText( wp, lp );
	case WM_NCPAINT:
		OnNcPaint( (HRGN)wp );
		return 0;
	case WM_NCCALCSIZE:
		OnNcCalcSize( (BOOL)wp, (NCCALCSIZE_PARAMS *)lp );
		return 0;
	case WM_SIZE:
		OnSize( wp, LOWORD(lp), HIWORD(lp) );
		return 0;	
	case WM_NCACTIVATE:
		return OnNcActivate( (BOOL)wp );
	case WM_NCHITTEST:
		return OnNcHitTest(CPoint(LOWORD(lp), HIWORD(lp)));
	case WM_NCLBUTTONUP:
		OnNcLButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
		return 0;
	case WM_NCLBUTTONDOWN:
		OnNcLButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
		return 0;
	case WM_NCLBUTTONDBLCLK:
		OnNcLButtonDblClk(wp, CPoint(LOWORD(lp), HIWORD(lp)));
		return 0;
	case WM_NCRBUTTONUP:
		OnNcRButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
		return 0;
	case WM_NCRBUTTONDOWN:
		OnNcRButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
		return 0;
	case WM_NCMOUSEMOVE:
		OnNcMouseMove( wp,CPoint(LOWORD(lp), HIWORD(lp)));
		return 0;
	case WM_GETMINMAXINFO:
		OnGetMinMaxInfo( (MINMAXINFO *)lp );
		return 0;
	case WM_WINDOWPOSCHANGING:
		OnWindowPosChanging((WINDOWPOS *)lp);
		return 0;
	case WM_SIZING:
		OnSizing( wp, (LPRECT)lp );
		return 0;
	case WM_ACTIVATE:
		OnActivate( wp, CWnd::FromHandle((HWND)lp), 0 );
		return 0;
	case WM_COMMAND:
		if ( !HandleSysCommand( wp, lp ) )
			Default();
		return 0;
	default:
		return Default();
	}
}

void CSkinWin::OnNcPaint(HRGN rgn1)
{	
	CWnd *pWnd = CWnd::FromHandle(m_hWnd);
	CDC * pDC = pWnd->GetWindowDC();
	CRect wr;
	pWnd->GetWindowRect( wr );

//f ( (DWORD)rgn) 
//pDC->SelectClipRgn( CRgn::FromHandle(rgn) );

	//m_bActive = GetActiveWindow() == m_hWnd;
	int state = 0;
	if ( m_bActive)
		state = 0;
	else state = 1;
	
	pDC->ExcludeClipRect(0, 0, wr.Width(),	m_TitleHeight );
	DrawFrame( pDC, 0, 0, wr.Width(), wr.Height(), state, 0 );	
	pDC->SelectClipRgn( NULL ); 

	CDC memDC, *pNewDC;
	CMyBitmap bmp;
	CBitmap  *obmp;
	memDC.CreateCompatibleDC( pDC );
	bmp.CreateCompatibleBitmap( pDC, wr.Width(), m_TitleHeight );
	obmp = memDC.SelectObject(&bmp);
	pNewDC = &memDC;
	
	DrawTitle( pNewDC, m_BorderLeftWidth , 0, 
   			wr.Width() - m_BorderRightWidth - m_BorderLeftWidth + 1, state );
	DrawLeft( pNewDC, 0, 0, m_bmpLeft.Height(), state );
	DrawRight( pNewDC, wr.Width() - m_BorderRightWidth , 0, m_bmpRight.Height(), state );

	
	CRgn newrgn;
	newrgn.CreateRectRgn( 0, 0, wr.Width(), wr.Height() );
	if ( m_bTrans )
	{
		CRgn rgn;
		rgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
		HRGN hrgn = bmp.CreateRgnFromFile( m_colTrans );
		newrgn.CombineRgn( &rgn, CRgn::FromHandle(hrgn), RGN_XOR  );
		pDC->SelectClipRgn( &newrgn ); 
	}
	else
		SetWindowRgn( m_hWnd, newrgn, FALSE );

	if ( m_downHitTest == HTCLOSE )
		DrawButton( pNewDC, 0, 1 );
	else if ( m_moveHitTest == HTCLOSE)
		DrawButton( pNewDC, 0, 2 );
	else
		DrawButton( pNewDC, 0, 0 );
	
	if ( m_downHitTest == HTMINBUTTON )
		DrawButton( pNewDC, 2, 1 );
	else if ( m_moveHitTest == HTMINBUTTON)
		DrawButton( pNewDC, 2, 2 );
	else
		DrawButton( pNewDC, 2, 0 );	

	if ( m_downHitTest == HTMAXBUTTON )
		DrawButton( pNewDC, 1, 1 );
	else if ( m_moveHitTest == HTMAXBUTTON)
		DrawButton( pNewDC, 1, 2 );
	else
		DrawButton( pNewDC, 1, 0 );		

	int cx = GetSystemMetrics(SM_CXSMICON);
	int cy = GetSystemMetrics(SM_CYSMICON);
	HICON hi = (HICON)SendMessage( m_hWnd, WM_GETICON, ICON_SMALL, 0);
	if ( !hi )
	{
#ifdef IDR_MAINFRAME
		hi = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
#endif
	}
	//draw icon
	::DrawIconEx( pNewDC->GetSafeHdc(), m_BorderLeftWidth, 5, (HICON)
		CopyImage( hi, IMAGE_ICON, 
		cx, cy, 0), cx, cy, 0, 0, DI_NORMAL);
	//draw text
	if ( m_title.IsEmpty() )
		pWnd->GetWindowText(m_title);

	if (m_bActive)
		pNewDC->SetTextColor( m_colTitle1 );
	else
		pNewDC->SetTextColor( m_colTitle2 );

	CFont font, *ofont;
	font.CreatePointFont( GetSystemMetrics(SM_CYSMCAPTION), "System" );
	ofont = pNewDC->SelectObject(&font);

	pNewDC->SetBkMode(TRANSPARENT);
	pNewDC->DrawText( m_title, CRect( m_textShift, m_textShiftVer, wr.Width() - m_bmpTitle.Width() + m_titleoff2, 
		m_TitleHeight ), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_WORD_ELLIPSIS  );

	pNewDC->SelectObject(&font);

	pDC->BitBlt( 0, 0, wr.Width(),
		m_TitleHeight, pNewDC, 0, 0, SRCCOPY );
	memDC.SelectObject(obmp);

	pDC->SelectClipRgn(NULL);
}

void CSkinWin::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
{
	if ( bCalcValidRects )
	{
		lpncsp->rgrc[0].left = lpncsp->rgrc[0].left + m_BorderLeftWidth;
		lpncsp->rgrc[0].right = lpncsp->rgrc[0].right - m_BorderRightWidth;
		lpncsp->rgrc[0].top = lpncsp->rgrc[0].top + m_TitleHeight;
		lpncsp->rgrc[0].bottom = lpncsp->rgrc[0].bottom - m_BorderBottomHeight;
		lpncsp->rgrc[1] = lpncsp->rgrc[0];

	}
	else
	{
		Default();
	}

}

void CSkinWin::OnSizing(UINT nSide, LPRECT lpRect)
{
		//Default();
	CWnd *pWnd = CWnd::FromHandle(m_hWnd);
	CRect wr(lpRect);

	/*
	if ( m_bTrans )
		SetWindowRgn( m_hWnd, GetRegion(wr.Width(), wr.Height() ), TRUE );
	else
		SetWindowRgn( m_hWnd, NULL, TRUE );
	*/
}


void CSkinWin::OnSize(UINT nType, int cx, int cy)
{
	//Default();
	CWnd *pWnd = CWnd::FromHandle(m_hWnd);
	CRect wr;	
	Default();
	pWnd->GetWindowRect(wr);
	pWnd->Invalidate();
	OnNcPaint(0);
	
	if ( m_bTrans )
		SetWindowRgn( m_hWnd, GetRegion(wr.Width(), wr.Height() ), TRUE );
	else
		SetWindowRgn( m_hWnd, NULL, TRUE );


}

HRGN CSkinWin::GetRegion(int w, int h)
{
	CWnd *pWnd = CWnd::FromHandle(m_hWnd);
	CRect wr;
	pWnd->GetWindowRect(wr);
	
	CRgn rgn;
	if ( m_bTrans )
	{
		CDC *pDC = pWnd->GetDC();
		CDC memDC;
		CMyBitmap bmp;
		CBitmap *obmp;
		memDC.CreateCompatibleDC(pDC);
		bmp.CreateCompatibleBitmap( pDC, w, m_TitleHeight );
		obmp = memDC.SelectObject(&bmp);
		/*
		memDC.FillSolidRect( 0, 0, w, h, 0 );
		DrawFrame( &memDC, 0, 0, w, h, 0 );
		*/
		DrawTitle( &memDC, m_BorderLeftWidth , 0, 
   				wr.Width() - m_BorderRightWidth - m_BorderLeftWidth + 1, 0 );
		DrawLeft( &memDC, 0, 0, m_bmpLeft.Height(), 0 );
		DrawRight( &memDC, wr.Width() - m_BorderRightWidth , 0, m_bmpRight.Height(), 0 );
		
		memDC.SelectObject(obmp);
		pWnd->ReleaseDC( pDC );

		rgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
		HRGN hrgn = bmp.CreateRgnFromFile( m_colTrans );
		CRgn newrgn;
		newrgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
		newrgn.CombineRgn( &rgn, CRgn::FromHandle(hrgn), RGN_XOR  );
		
		return (HRGN)newrgn.Detach();
	}
	else
		rgn.CreateRectRgn( 0, 0, wr.Width(), wr.Height() );
		
	
	return (HRGN)rgn.Detach();
}


BOOL CSkinWin::OnNcActivate(BOOL bActive)
{
	m_bActive = bActive;
	OnNcPaint(0);
	if ( !bActive )
	{
		return 1;
	}
	else
		return 0;
}



UINT CSkinWin::OnNcHitTest(CPoint point)
{
	CWnd *pWnd = CWnd::FromHandle(m_hWnd);
	CRect wr;
	pWnd->GetWindowRect(wr);
	
	point.x -= wr.left;
	point.y -= wr.top;
	if ( PtInRect( GetButtonRect(0), point ) )
		return HTCLOSE;
	if ( PtInRect( GetButtonRect(2), point ) && m_minable )
		return HTMINBUTTON;
	if ( PtInRect( GetButtonRect(1), point ) && m_maxable )
		return HTMAXBUTTON;

	CRect r;
	int cx = GetSystemMetrics(SM_CXSMICON);
	int cy = GetSystemMetrics(SM_CYSMICON);
	if ( PtInRect( CRect(m_BorderLeftWidth, 5, m_BorderLeftWidth + cx, cy + 5), point ) )
		return HTSYSMENU;

	r = CRect( 0, 0, m_BorderLeftWidth, m_TitleHeight );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTTOPLEFT;
	r = CRect( wr.Width() - m_BorderLeftWidth, 0,  wr.Width(), m_TitleHeight  );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTTOPRIGHT;
	r = CRect( 0, wr.Height() - m_BorderBottomHeight, m_BorderLeftWidth, wr.Height() );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTBOTTOMLEFT;
	r = CRect( wr.Width()-m_BorderRightWidth, wr.Height() - m_BorderBottomHeight,  wr.Width(), wr.Height() );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTBOTTOMRIGHT;
	r = CRect( 0, m_TitleHeight,  m_BorderLeftWidth, wr.Height() - m_BorderBottomHeight  );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTLEFT;
	r = CRect( wr.Width()-m_BorderRightWidth, m_TitleHeight,  wr.Width(), wr.Height() - m_BorderBottomHeight  );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -