📄 drawformdlg.cpp
字号:
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 + -