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 + -
显示快捷键?