drawdialogdlg.cpp

来自「《Visual C++视频技术方案宝典》配套光盘」· C++ 代码 · 共 625 行 · 第 1/2 页

CPP
625
字号
		m_RTitleRc.CopyRect(CRect(FactRC.right-x,0,FactRC.right,m_TitleDrawHeight));

		WindowDC.StretchBlt(m_RTitleRc.left,m_RTitleRc.top,m_RTitleRc.Width(),m_RTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY);
		DeleteObject( memDC.SelectObject(OldObj));
		LeftLine.Detach();
	}

	//绘制中间标题
	if ( Flags & fMidTitle)
	{
		DeleteObject(LeftLine);
		LeftLine.LoadBitmap(IDB_MIDTITLE);
		//获取位图大小
		LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
		OldObj = memDC.SelectObject(&LeftLine);
		x = bitinfo.bmiHeader.biWidth;
		y = bitinfo.bmiHeader.biHeight;
		m_TitleDrawHeight  = (m_CaptionHeight+4>y)?m_CaptionHeight+4: y;

		m_MTitleRc.CopyRect(CRect(m_LTitleRc.right,0,m_RTitleRc.left,m_TitleDrawHeight));
		
		WindowDC.StretchBlt(m_MTitleRc.left,m_MTitleRc.top,m_MTitleRc.Width(),m_MTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY);
		LeftLine.Detach();
		memDC.SelectObject(OldObj);
	}

	//绘制右边框
	if ( Flags & fRightBar)
	{
		DeleteObject(LeftLine);
		LeftLine.LoadBitmap(IDB_RIGHTBAR);
		//获取位图大小
		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 & fBottomBar)
	{
		DeleteObject(LeftLine);
		LeftLine.LoadBitmap(IDB_BOTTOMBAR);
		//获取位图大小
		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();
	}

	//绘制底边框

	CPoint pos(30,1);
	m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));

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

	pos.x = 80;
	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.LoadBitmap(IDB_MINBT);
		//获取位图大小
		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.LoadBitmap(IDB_MAXBT);
		//获取位图大小
		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.LoadBitmap(IDB_CLOSEBT);
		//获取位图大小
		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();
	}

	LeftLine.DeleteObject();
	memDC.DeleteDC();
	DrawCaption();
}

void CDrawDialogDlg::DrawCaption()
{
	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 CDrawDialogDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	CRect rect;
	GetClientRect(rect);

	CPoint pos(30,1);
	m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight +2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));

	pos.x = 55;
	m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));
	pos.x = 80;
	m_CloseRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));
	Invalidate();	
}

void CDrawDialogDlg::OnNcMouseMove(UINT nHitTest, CPoint point) 
{	
		CRect tempMin,tempMax,tempClose,ClientRect;
		
		CWindowDC WindowDC (this);//= GetWindowDC();
		CDC memDC;
		memDC.CreateCompatibleDC(&WindowDC);

		BITMAPINFO bInfo;
		CBitmap LeftLine;
		int x,y;

		GetWindowRect(ClientRect);
		tempMin.CopyRect(CRect(m_MinRect.left+ ClientRect.left,ClientRect.top+m_MinRect.top,m_MinRect.right+m_MinRect.left+ ClientRect.left,m_MinRect.bottom+m_MinRect.top+ClientRect.top));
		tempMax.CopyRect(CRect(m_MaxRect.left+ ClientRect.left,ClientRect.top+m_MaxRect.top,m_MaxRect.right+m_MaxRect.left+ ClientRect.left,m_MaxRect.bottom+m_MaxRect.top+ClientRect.top));
		tempClose.CopyRect(CRect(m_CloseRect.left+ ClientRect.left,ClientRect.top+m_CloseRect.top,m_CloseRect.right+m_CloseRect.left+ ClientRect.left,m_CloseRect.bottom+m_CloseRect.top+ClientRect.top));

		if(tempMin.PtInRect(point)) //鼠标在最小化按钮上移动时,更改按钮显示的位图
		{
			if (m_ButtonState!= bsMin)
			{
				LeftLine.LoadBitmap(IDB_MINHOTBT);
				LeftLine.GetObject(sizeof(bInfo),&bInfo);
				
				x = bInfo.bmiHeader.biWidth;
				y = bInfo.bmiHeader.biHeight;
				memDC.SelectObject(&LeftLine);
				WindowDC.StretchBlt(m_MinRect.left,m_MinRect.top,m_MinRect.right,m_MinRect.bottom,&memDC,0,0,x,y,SRCCOPY);
				m_IsDrawForm = FALSE;
				m_ButtonState = bsMin;
				
				LeftLine.Detach();
			}
		}
		else if (tempMax.PtInRect(point))
		{
			if (m_ButtonState !=bsMax && m_ButtonState!=bsRes)
			{
				LeftLine.LoadBitmap(IDB_MAXHOTBT);
				LeftLine.GetObject(sizeof(bInfo),&bInfo);
				
				x = bInfo.bmiHeader.biWidth;
				y = bInfo.bmiHeader.biHeight;
				memDC.SelectObject(&LeftLine);
				WindowDC.StretchBlt(m_MaxRect.left,m_MaxRect.top,m_MaxRect.right,m_MaxRect.bottom,&memDC,0,0,x,y,SRCCOPY);
				m_IsDrawForm = FALSE;
				if (m_IsMax)
				{
					m_ButtonState = bsMax;
				}
				else
				{
					m_ButtonState = bsRes;
				}
				LeftLine.Detach();	
			}
		}
		else if (tempClose.PtInRect(point))
		{
			if (m_ButtonState != bsClose)
			{
				LeftLine.LoadBitmap(IDB_CLOSEHOTBT);
				LeftLine.GetObject(sizeof(bInfo),&bInfo);
				
				x = bInfo.bmiHeader.biWidth;
				y = bInfo.bmiHeader.biHeight;
				memDC.SelectObject(&LeftLine);
				WindowDC.StretchBlt(m_CloseRect.left,m_CloseRect.top,m_CloseRect.right,m_CloseRect.bottom,&memDC,0,0,x,y,SRCCOPY);
				m_IsDrawForm = FALSE;
				m_ButtonState = bsClose;
				LeftLine.Detach();	
			}
		}
		else
		{		
			if (m_IsDrawForm==FALSE)
			{
				if (m_ButtonState==bsMin)
					DrawDialog( fMinButton);
				else if (m_ButtonState==bsClose)
					DrawDialog( fCloseButton);
				else if (m_ButtonState==bsMax||m_ButtonState==bsRes)
					DrawDialog( fMaxButton);
			}
			m_ButtonState = bsNone;
		}
		LeftLine.DeleteObject();
		ReleaseDC(&memDC);
	CDialog::OnNcMouseMove(nHitTest, point);
}

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

void CDrawDialogDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{
	switch (m_ButtonState)
	{
	case bsClose: //关闭窗口
		{
			OnCancel();
		}
		break;
	case bsMin: 
		{
			ShowWindow(SW_SHOWMINIMIZED);
		}
		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 CDrawDialogDlg::OnNcLButtonUp(UINT nHitTest, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnNcLButtonUp(nHitTest, point);

}

BOOL CDrawDialogDlg::OnNcActivate(BOOL bActive) 
{
	OnPaint() ;	
	return TRUE;
}

void CDrawDialogDlg::OnNcPaint() 
{

}

⌨️ 快捷键说明

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