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

📄 skinwin.cpp

📁 换肤窗口也就是窗口内的基本元素及窗口外观会随着要求不断的变换风格。本实例中的窗口可以实现NeoStyle和XpStyle两种风格的互换。教你如何定制窗口框架、标题、边框等
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		return HTRIGHT;
	r = CRect( m_BorderLeftWidth, wr.Height() - m_BorderBottomHeight,  wr.Width()-m_BorderRightWidth, wr.Height() );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTBOTTOM;
	r = CRect( m_BorderLeftWidth, 0,  wr.Width()-m_BorderRightWidth, m_BorderBottomHeight );
	if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		return HTTOP;
	//set to boder 5
	r = CRect( m_BorderLeftWidth, 5 , wr.Width()-m_BorderRightWidth, m_TitleHeight );
	if ( PtInRect( r, point ) )
		return HTCAPTION;



	return HTCLIENT;
}

void CSkinWin::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{
	if ( nHitTest == HTCAPTION && m_sizable )
	{
		if ( m_winstate == 1 )
			Restore();
		else
			Maximize(); //ShowWindow(m_hWnd, SW_MAXIMIZE);
		m_downHitTest = 0;
		m_moveHitTest = 0;
		OnNcPaint(0);
	}
}

void CSkinWin::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
	m_downHitTest = nHitTest;
	m_moveHitTest = m_downHitTest;

	OnNcPaint(0);	
	if ( nHitTest >= HTLEFT && nHitTest <= HTBOTTOMRIGHT || 
		nHitTest == HTCAPTION && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		Default();
	else if ( nHitTest == HTSYSMENU )
	{
		PopupSysMenu(point);
		/*
		CWnd * pWnd = CWnd::FromHandle(m_hWnd);
		//a tricky hack
		pWnd->ModifyStyle( 0, WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );			
		Default();
		pWnd->ModifyStyle( WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0 );			
		*/
	}
}

void CSkinWin::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
	if ( nHitTest == HTCLOSE )
	{
		SendMessage(m_hWnd, WM_CLOSE, 0, 0);
		return;
	}
	else if ( nHitTest == HTMINBUTTON )
		Minimize();
	else if ( nHitTest == HTMAXBUTTON )
	{
		if ( m_winstate == 1 ) // IsZoomed(m_hWnd) )
			Restore(); //ShowWindow(m_hWnd, SW_RESTORE);
		else
			Maximize(); //ShowWindow(m_hWnd, SW_MAXIMIZE);
	}
	else
		return;
	m_downHitTest = 0;
	m_moveHitTest = 0;
	OnNcPaint(0);

}

void CSkinWin::OnNcMouseMove(UINT nHitTest, CPoint point)
{
	if ( nHitTest >= HTLEFT && nHitTest <= HTBOTTOMRIGHT || 
		 nHitTest == HTCAPTION && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
		Default();
	
	m_moveHitTest = nHitTest;
	m_downHitTest = 0;
	if ( m_oldHitTest != nHitTest )
	{
		/*
		CRect r;
		r = GetButtonRect(0);
		r.UnionRect( r, GetButtonRect(1) );
		r.UnionRect( r, GetButtonRect(2) );
		CRgn rgn;
		rgn.CreateRectRgn( r.left, r.top, r.right, r.bottom );
		*/
		OnNcPaint(0);
		m_oldHitTest = nHitTest;
	}
	
}

void CSkinWin::OnNcRButtonDown(UINT nHitTest, CPoint point)
{
	if ( nHitTest == HTCAPTION )
	{
		/*
		CWnd * pWnd = CWnd::FromHandle(m_hWnd);
		pWnd->ModifyStyle( 0, WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );			
		Default();
		pWnd->ModifyStyle( WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0 );			
		*/
		PopupSysMenu(point);
	}
}

void CSkinWin::OnNcRButtonUp(UINT nHitTest, CPoint point)
{


}

CRect CSkinWin::GetButtonRect(int i)
{
	CWnd *pWnd = CWnd::FromHandle(m_hWnd);
	CRect wr;
	pWnd->GetWindowRect(wr);

	CRect r;
	if ( i == 0 && m_bmpCloseBtn.GetSafeHandle() )
	{
		//close
		r = m_rectCloseBtn;
		r.left = wr.Width() - m_rectCloseBtn.right;
		r.right = wr.Width() - m_rectCloseBtn.left;
	}
	if ( i == 1 && m_bmpMaxBtn.GetSafeHandle())
	{
		//max
		
		if ( m_winstate != 1 || !m_bmpRestoreBtn.GetSafeHandle() )
		{
			r = m_rectMaxBtn;
			r.left = wr.Width() - m_rectMaxBtn.right;
			r.right = wr.Width() - m_rectMaxBtn.left;
		}
		else
		{
			r = m_rectRestoreBtn;
			r.left = wr.Width() - m_rectRestoreBtn.right;
			r.right = wr.Width() - m_rectRestoreBtn.left;
		}
			
	}
	if ( i == 2 && m_bmpMinBtn.GetSafeHandle())
	{
		//min
		r = m_rectMinBtn;
		r.left = wr.Width() - m_rectMinBtn.right;
		r.right = wr.Width() - m_rectMinBtn.left;
	}

	return r;

}

BOOL CSkinWin::DrawButton( CDC * pDC, int i, int state)
{
	if ( i == 0 )
	{
		if ( m_bmpCloseBtn.GetSafeHandle() )
		{
			CRect r = GetButtonRect(0);
			m_bmpCloseBtn.Draw( pDC, r.left, r.top, 
				CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ), m_colTrans, m_bTrans );
		}
	}
	if ( i == 1 )
	{
		CRect r = GetButtonRect(1);
		if ( m_maxable && m_bmpMaxBtn.GetSafeHandle() )
			if ( m_winstate == 1&& m_bmpRestoreBtn.GetSafeHandle() )
				m_bmpRestoreBtn.Draw( pDC, r.left, r.top, 
					CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ), m_colTrans, m_bTrans );
			else
				m_bmpMaxBtn.Draw( pDC, r.left, r.top, 
					CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ) , m_colTrans, m_bTrans);
	}
	if ( i == 2 )
	{
		if ( m_minable && m_bmpMinBtn.GetSafeHandle() )
		{
			CRect r = GetButtonRect(2);
			m_bmpMinBtn.Draw( pDC, r.left, r.top, 
				CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ) , m_colTrans, m_bTrans);

		}
	}
	return TRUE;
	
}

void CSkinWin::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
{
	lpMMI->ptMinTrackSize = CPoint( m_bmpTitle.Width() + m_bmpLeft.Width() +
		m_bmpRight.Width(),  m_bmpLeft.Height() + 20 );
}


void CSkinWin::OnWindowPosChanging(WINDOWPOS *lpwndpos)
{
}


BOOL CSkinWin::OnEraseBkgnd(CDC *pDC)
{
	if ( m_bmpDlg.GetSafeHandle() )
	{
		CRect r;
		GetClientRect( m_hWnd, r);
		for ( int i = 0; i < r.Width()/m_bmpDlg.Width() + 1; i++ )
			for ( int j = 0; j < r.Height()/m_bmpDlg.Height() + 1; j++ )
			{
				m_bmpDlg.Draw( pDC, CRect( i *  m_bmpDlg.Width(), j * m_bmpDlg.Height(),
					i *  m_bmpDlg.Width() + m_bmpDlg.Width(), j * m_bmpDlg.Height() + m_bmpDlg.Height() ) );
			}

		return TRUE;
	}
	else
		return FALSE;
}

CRect CSkinWin::GetMaximizeRect()
{
	CRect r;
	SystemParametersInfo(SPI_GETWORKAREA, 0, r, 0);
	
	return r;
}

BOOL CSkinWin::Maximize()
{
	CRect r = GetMaximizeRect();
	GetWindowRect( m_hWnd, m_rectRestoreWin );
	m_winstate = 1;
	::MoveWindow( m_hWnd, r.left, r.top, r.Width(), r.Height(), TRUE  );
	UpdateWindow( m_hWnd );
	return TRUE;
}

BOOL CSkinWin::Minimize()
{
	m_oldwinstate = m_winstate;
	m_winstate = 2;
	ShowWindow(m_hWnd, SW_MINIMIZE);
	return TRUE;
}

BOOL CSkinWin::Restore()
{
	if ( m_winstate == 1 )
	{
		::MoveWindow( m_hWnd, m_rectRestoreWin.left, m_rectRestoreWin.top,
			m_rectRestoreWin.Width(), m_rectRestoreWin.Height(), TRUE  );
		m_winstate = 0;
		UpdateWindow( m_hWnd );
	}
	return TRUE;
}

//void OnActivate(UINT nState,CWnd* pWndOther, BOOL bMinimized );

void CSkinWin::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)
{
	//Default();
	m_bActive = ( nState == WA_ACTIVE || nState == WA_CLICKACTIVE );
	OnNcActivate(m_bActive);
}

LRESULT CSkinWin::OnSetText(WPARAM wp, LPARAM lp)
{
	char * str = ( char *)lp;

	Default();
	m_title = str;
	OnNcPaint(0);
	return 0;
}



void CSkinWin::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ( nID == SC_MAXIMIZE )
		Maximize();
	else if ( nID == SC_RESTORE && m_winstate == 1 )
		Restore();
	else if ( nID == SC_RESTORE && m_winstate == 2 )
	{
		ShowWindow( m_hWnd, SW_RESTORE );
		m_winstate = m_oldwinstate;
		OnNcPaint(0);
	}
	else 
		Default();
}

BOOL CSkinWin::PopupSysMenu(CPoint point)
{
	CWnd * pWnd = CWnd::FromHandle(m_hWnd);
	CMenu SysMenu;
	SysMenu.Attach( GetSystemMenu(m_hWnd, FALSE) );




/*
  when gray menuitem, a strange line appears!!
  
	if ( m_winstate == 0 )
	{
		SysMenu.EnableMenuItem( SC_MINIMIZE, MF_BYCOMMAND|MF_ENABLED );
		SysMenu.EnableMenuItem( SC_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED );
		SysMenu.EnableMenuItem( SC_RESTORE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED );
	}	
	else if ( m_winstate == 1 )
	{
		SysMenu.EnableMenuItem( SC_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED );
		SysMenu.EnableMenuItem( SC_RESTORE, MF_BYCOMMAND|MF_ENABLED );
	}
	else if ( m_winstate == 2 )
	{
		SysMenu.EnableMenuItem( SC_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED );
		SysMenu.EnableMenuItem( SC_RESTORE, MF_BYCOMMAND|MF_ENABLED );
	}
*/
	
	SysMenu.TrackPopupMenu( 0, point.x, point.y, pWnd  );		
	SysMenu.Detach();
	return TRUE;
}

BOOL CSkinWin::HandleSysCommand(WPARAM wp, LPARAM lp)
{
	if ( lp == 0 )
	{
		CMenu SysMenu;
		SysMenu.Attach( GetSystemMenu(m_hWnd, FALSE) );
		int count = SysMenu.GetMenuItemCount();
		for( int i = 0; i < count ; i++ )
			if ( SysMenu.GetMenuItemID(i) == wp )
				break;
		SysMenu.Detach();
		if ( i >= count )
			return FALSE;
		if ( wp == SC_MAXIMIZE )
			Maximize();
		else if ( wp == SC_MINIMIZE )
			Minimize();
		else if ( wp == SC_RESTORE && m_winstate == 1 )
			Restore();
		else if ( wp == SC_RESTORE && m_winstate == 2 )
		{
			ShowWindow( m_hWnd, SW_RESTORE );
			m_winstate = m_oldwinstate;
			OnNcPaint(0);
		}
		else 
			SendMessage( m_hWnd, WM_SYSCOMMAND, wp, lp );
		return TRUE;
	}

	return FALSE;
}

⌨️ 快捷键说明

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