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

📄 drawformdlg.cpp

📁 VC经典换肤程序,很好使用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			LeftLine.Detach();
			memDC.SelectObject(OldObj);
		}
		/*****************************绘制中间标题***************************************/

		/*****************************绘制右边框**************************************/
		if ( Flags & fRightBand)
		{
			DeleteObject(LeftLine);
			LeftLine.Attach(pSkin->GetBitmapRes(5));
			//获取位图大小
			LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
			OldObj = memDC.SelectObject(&LeftLine);
			x = bitinfo.bmiHeader.biWidth;
			y = bitinfo.bmiHeader.biHeight;
			
			rLineWidth = m_FrameWidth+m_BorderWidth;
			
			rLineWidth= rLineWidth>x? rLineWidth:x;

			WindowDC.StretchBlt(m_RTitleRc.right-rLineWidth,m_TitleDrawHeight,rLineWidth,FactRC.Height()-m_TitleDrawHeight,&memDC,0,0,x,y,SRCCOPY);
			memDC.SelectObject(OldObj);
			LeftLine.Detach();
		}
		/*****************************绘制右边框***************************************/

		/*****************************绘制底边框**************************************/
			
		if ( Flags & fBottomBand)
		{
			DeleteObject(LeftLine);
			LeftLine.Attach(pSkin->GetBitmapRes(4));
			//获取位图大小
			LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
			OldObj = memDC.SelectObject(&LeftLine);
			x = bitinfo.bmiHeader.biWidth;
			y = bitinfo.bmiHeader.biHeight;
			bLineHeight = m_BorderHeight+m_FrameHeight;
			bLineHeight = bLineHeight>y? bLineHeight:y;

			WindowDC.StretchBlt(leftlinewidth,FactRC.Height()-bLineHeight,m_RTitleRc.right-rLineWidth-leftlinewidth, bLineHeight,&memDC,0,0,x,y,SRCCOPY);
			memDC.SelectObject(OldObj);
			LeftLine.Detach();
		}

		/*****************************绘制底边框******************************************/
		if (pSkin->GetDrawRound())
		{
			/*****************************绘制左下角******************************************/
			if ( Flags & fLeftBottom)
			{
				DeleteObject(LeftLine);
				LeftLine.Attach(pSkin->GetBitmapRes(12));
				//获取位图大小
				LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
				OldObj = memDC.SelectObject(&LeftLine);
				x = bitinfo.bmiHeader.biWidth;
				y = bitinfo.bmiHeader.biHeight;

				WindowDC.StretchBlt(0,FactRC.Height()-bLineHeight,leftlinewidth,bLineHeight,&memDC,0,0,x,y,SRCCOPY);
				memDC.SelectObject(OldObj);
				LeftLine.Detach();
			}
			/*****************************绘制左下角*****************************************/

			/*****************************绘制右下角*****************************************/
			if ( Flags & fRightBottom)
			{
				DeleteObject(LeftLine);
				LeftLine.Attach(pSkin->GetBitmapRes(13));
				//获取位图大小
				LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
				OldObj = memDC.SelectObject(&LeftLine);
				x = bitinfo.bmiHeader.biWidth;
				y = bitinfo.bmiHeader.biHeight;

				WindowDC.StretchBlt(m_RTitleRc.right-x,FactRC.Height()-bLineHeight,x,bLineHeight,&memDC,0,0,x,y,SRCCOPY);
				memDC.SelectObject(OldObj);
				LeftLine.Detach();
			}
			/*****************************绘制右下角*****************************************/

		}
		CPoint pos = pSkin->GetButtonPos(6);
		m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));

		pos = pSkin->GetButtonPos(7);	
		m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));

		pos = pSkin->GetButtonPos(8);
		m_CloseRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));

		/*****************************绘制最小化按钮**************************************/
		if ( Flags & fMinButton)
		{
			DeleteObject(LeftLine);
			LeftLine.Attach(pSkin->GetBitmapRes(6));
			//获取位图大小
			LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
			OldObj = memDC.SelectObject(&LeftLine);
			x = bitinfo.bmiHeader.biWidth;
			y = bitinfo.bmiHeader.biHeight;
			WindowDC.StretchBlt(m_MinRect.left,m_MinRect.top,m_MinRect.right,m_MinRect.bottom,&memDC,0,0,x,y,SRCCOPY);
			memDC.SelectObject(OldObj);
			LeftLine.Detach();
		}
		/*****************************绘制最小化按钮***************************************/

		/*****************************绘制最大化按钮**************************************/
		if ( Flags & fMaxButton)
		{
			DeleteObject(LeftLine);
			LeftLine.Attach(pSkin->GetBitmapRes(7));
			//获取位图大小
			LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
			OldObj =  memDC.SelectObject(&LeftLine);
			x = bitinfo.bmiHeader.biWidth;
			y = bitinfo.bmiHeader.biHeight;
			WindowDC.StretchBlt(m_MaxRect.left,m_MaxRect.top,m_MaxRect.right,m_MaxRect.bottom,&memDC,0,0,x,y,SRCCOPY);
			memDC.SelectObject(OldObj);
			LeftLine.Detach();
		}
		/*****************************绘制最大化按钮***************************************/

		/*****************************绘制关闭按钮**************************************/
		if ( Flags & fCloseButton)
		{
			DeleteObject(LeftLine);
			LeftLine.Attach(pSkin->GetBitmapRes(8));
			//获取位图大小
			LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
			OldObj =  memDC.SelectObject(&LeftLine);
			x = bitinfo.bmiHeader.biWidth;
			y = bitinfo.bmiHeader.biHeight;
			WindowDC.StretchBlt(m_CloseRect.left,m_CloseRect.top,m_CloseRect.right,m_CloseRect.bottom,&memDC,0,0,x,y,SRCCOPY);
			memDC.SelectObject(OldObj);
			LeftLine.Detach();
		}
		/*****************************绘制关闭按钮***************************************/
		m_IsDrawForm = TRUE;
		LeftLine.DeleteObject();
		memDC.DeleteDC();
		DrawFormCaption();
	}
}




void CDrawFormDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
{	
	CDialog::OnShowWindow(bShow, nStatus);

}

HBRUSH CDrawFormDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{	
	//绘制背景
	if (nCtlColor==CTLCOLOR_DLG && m_LoadDll==TRUE)
	{
		if (m_LoadDll)
		{
			CBrush m_Brush(&m_Bk);
			CRect rect;
			GetClientRect(rect);
			pDC->SelectObject(&m_Brush);
			pDC->FillRect(rect,&m_Brush);
			return m_Brush;
		}
		else
			return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	}
	else if (nCtlColor ==CTLCOLOR_STATIC)
	{
		pDC->SetBkMode(TRANSPARENT);
		return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	}
	else
		return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

void CDrawFormDlg::DrawFormCaption()
{
	if (! m_Caption.IsEmpty())
	{
		CDC* pDC = GetWindowDC();
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(m_CapitonColor);
		pDC->SetTextAlign(TA_CENTER);
		CRect rect;
		GetClientRect(rect);
		pDC->SelectObject(&m_CaptionFont);
		pDC->TextOut(rect.Width()/2, m_CaptionHeight/3 ,m_Caption);	
		ReleaseDC(pDC);
	}
}



void CDrawFormDlg::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
{
	CDialog::OnWindowPosChanged(lpwndpos);	
}



void CDrawFormDlg::InitSkin()
{
	m_LoadDll = ((CDrawFormApp*)AfxGetApp())->m_LoadDll;
	pSkin = ((CDrawFormApp*)AfxGetApp())->pSkin;
	m_Bk.DeleteObject();
	m_CaptionFont.DeleteObject();
	if (m_LoadDll)
	{

		ModifyStyle(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU,0);
		m_Bk.Attach(pSkin->GetBitmapRes(14));
		//获取按钮位图大小
		
		CBitmap bitmap;
		bitmap.Attach(pSkin->GetBitmapRes(6));
		BITMAPINFO bInfo;
		bitmap.GetObject(sizeof(bInfo),&bInfo);
		m_ButtonWidth = bInfo.bmiHeader.biWidth;
		m_ButtonHeight = bInfo.bmiHeader.biHeight;
		bitmap.Detach();
		WndRgn.DeleteObject();

		SetWinVisibleRect();

		m_CaptionFont.CreateFont(14,10,0,0,600,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_ROMAN,"宋体");
		m_label1.ModifyStyleEx(0,WS_EX_TRANSPARENT);
	}
	else
	{
		ModifyStyle(0,WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU|WS_CAPTION);
	}
}


void CDrawFormDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	CDialog::OnMouseMove(nFlags, point);
	if (m_ButtonState != bsNone)
	{
		if (m_ButtonState==bsMin)
			DrawForm( fMinButton);
		else if (m_ButtonState==bsClose)
			DrawForm( fCloseButton);
		else if (m_ButtonState==bsMax||m_ButtonState==bsRes)
			DrawForm( fMaxButton);
		m_ButtonState = bsNone;
	}
}

void CDrawFormDlg::SetWinVisibleRect()
{
	DrawForm();
	CRect winrect,factRC;
	GetWindowRect(winrect);

	factRC.CopyRect(CRect(0,0,winrect.Width(),winrect.Height()));
	WndRgn.DeleteObject();

	WndRgn.CreateRectRgnIndirect(factRC);

	CBitmap bitmap;
	BITMAPINFO bInfo;
	//去除左上角的空白区域
	bitmap.Attach(pSkin->GetBitmapRes(0));
	bitmap.GetObject(sizeof(bInfo),&bInfo);
	int x,y,m,n;
	x = bInfo.bmiHeader.biWidth;
	y = bInfo.bmiHeader.biHeight;
	CDC memDC;
	CDC* pDC = GetDC();
	memDC.CreateCompatibleDC(pDC);
	memDC.SelectObject(&bitmap);
	for ( m = 0; m<x; m++)
		for (n = 0; n<y; n++)
		{
			if (memDC.GetPixel(m,n)==RGB(255,255,255))
			{
				ClipRgn.CreateRectRgn(m,n,m+1,n+1);
				WndRgn.CombineRgn(&WndRgn,&ClipRgn,RGN_XOR);
				ClipRgn.DeleteObject();
			}
		}
	bitmap.Detach();

	//去除右上角的空白区域
	bitmap.Attach(pSkin->GetBitmapRes(2));
	bitmap.GetObject(sizeof(bInfo),&bInfo);
	x = bInfo.bmiHeader.biWidth;
	y = bInfo.bmiHeader.biHeight;
	memDC.SelectObject(&bitmap);
	for ( m = 0; m<x; m++)
		for (n = 0; n<y; n++)
		{
			if (memDC.GetPixel(m,n)==RGB(255,255,255))
			{
				ClipRgn.CreateRectRgn(m_RTitleRc.left+m,m_RTitleRc.top+n,m_RTitleRc.left+ m+1,m_RTitleRc.top+n+1);

				WndRgn.CombineRgn(&WndRgn,&ClipRgn,RGN_XOR);
				ClipRgn.DeleteObject();
			}
		}

	bitmap.Detach();
	//去除左下角的空白区域
	bitmap.Attach(pSkin->GetBitmapRes(12));
	bitmap.GetObject(sizeof(bInfo),&bInfo);
	x = bInfo.bmiHeader.biWidth;
	y = bInfo.bmiHeader.biHeight;
	memDC.SelectObject(&bitmap);
	for ( m = 0; m<x; m++)
		for (n = 0; n<y; n++)
		{
			if (memDC.GetPixel(m,n)==RGB(255,255,255))
			{
				ClipRgn.CreateRectRgn(m,factRC.Height()-y+n ,m+1,factRC.Height()-y+n+1);
				WndRgn.CombineRgn(&WndRgn,&ClipRgn,RGN_XOR);
				ClipRgn.DeleteObject();
			}
		}
	bitmap.Detach();

	//去除右下角的空白区域
	bitmap.Attach(pSkin->GetBitmapRes(13));
	bitmap.GetObject(sizeof(bInfo),&bInfo);
	x = bInfo.bmiHeader.biWidth;
	y = bInfo.bmiHeader.biHeight;
	memDC.SelectObject(&bitmap);
	for ( m = 0; m<x; m++)
		for (n = 0; n<y; n++)
		{
			if (memDC.GetPixel(m,n)==RGB(255,255,255))
			{
				ClipRgn.CreateRectRgn(m_RTitleRc.right-x+m,factRC.Height()-y+n,m_RTitleRc.right-x+m+1,factRC.Height()-y+n+1);
				WndRgn.CombineRgn(&WndRgn,&ClipRgn,RGN_XOR);
				ClipRgn.DeleteObject();
			}
		}
	bitmap.Detach();
	ReleaseDC(&memDC);
	ReleaseDC(pDC);
	SetWindowRgn(WndRgn,TRUE);
	DeleteObject(WndRgn);
}

void CDrawFormDlg::OnNcPaint() 
{
	if (!m_LoadDll)
		CWnd::OnNcPaint();  
}



void CDrawFormDlg::OnNcLButtonUp(UINT nHitTest, CPoint point) 
{	
	CDialog::OnNcLButtonUp(nHitTest, point);
}

void CDrawFormDlg::OnCancel()
{
	if  (m_LoadDll)
	{
		m_Bk.Detach();
		m_CaptionFont.DeleteObject();
	}
	CDialog::OnCancel();
}


void CDrawFormDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{
	if (m_LoadDll)
	{
		switch (m_ButtonState)
		{
		case bsClose: //关闭窗口
			{
				OnCancel();
			}
			break;
		case bsIni: //还原窗口到初始大小和位置
			{
			//	m_IsMax = TRUE;
			//	MoveWindow(m_OrigonRect.left,m_OrigonRect.top,m_OrigonRect.Width(),m_OrigonRect.Height());
			}
			break;
		case bsMin: //
			{
				ShowWindow(SW_SHOWMINIMIZED);
				//CWnd* pDesk = GetDesktopWindow();
				//CRect rect;
				//pDesk->GetClientRect(rect);
				//SetWindowPos(0 ,(rect.Width()-m_OrigonRect.Width())/2,2,m_OrigonRect.Width(),0,SWP_SHOWWINDOW);
			}
			break;
		case bsMax:
			{
				m_ButtonState = bsMax;
				ShowWindow(SW_SHOWMAXIMIZED);
				m_IsMax = FALSE;
			}
			break;
		case bsRes:
			{			
				ShowWindow(SW_RESTORE);
				m_IsMax = TRUE;
			}
			break;
		}
	}	
	CDialog::OnNcLButtonDown(nHitTest, point);
}

void CDrawFormDlg::OnRestorebutton() 
{
	if (m_LoadDll)
	{
		((CDrawFormApp*)AfxGetApp())->pSkin->Release();
		FreeLibrary(((CDrawFormApp*)AfxGetApp())->m_Instance);
		((CDrawFormApp*)AfxGetApp())->m_LoadDll=FALSE;
		m_LoadDll = FALSE;
		InitSkin();

		SetWindowPos(NULL,0,0,0,0,SWP_NOMOVE  |SWP_NOSIZE|SWP_DRAWFRAME);
		Invalidate();
		OnSize(0,0,0);
	}
}

void CDrawFormDlg::OnButton1() 
{
	CFileDialog fDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"皮肤(.ski)|*.ski",this);
	if (fDlg.DoModal()==IDOK)
	{
		m_Bk.DeleteObject();
		m_CaptionFont.DeleteObject();
		((CDrawFormApp*)AfxGetApp())->ChangeSkin(fDlg.GetPathName());
		InitSkin();
		fDlg.DestroyWindow();
		Invalidate();
	}
}

void CDrawFormDlg::OnButton2() 
{
	CMyDlg myDlg(NULL,IDD_DRAWFORM_DIALOG1);//
	myDlg.DoModal();
//	OnCancel();	
}

⌨️ 快捷键说明

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