1.從CDialog 派生一個新的對話框內,命名一個你自己想要的名字,我的命名爲(CMDDialog)。
頭文件如下:
// CMKDialog 對話框
class CMKDialog : public CDialog
...{
DECLARE_DYNAMIC(CMKDialog)
public:
CMKDialog(); // 標準構造函數
CMKDialog(UINT uTemplate,CWnd* pParent = NULL); // 標準構造函數
CMKDialog(LPCTSTR lpszTemplateName,CWnd *pParent = NULL); // 標準構造函數
virtual ~CMKDialog();
public:
typedef enum _tagDrawState
...{
StateNormal = 0,
StateDown = 1,
StateFocus = 2,
StateDisable = 3
}DrawState;
typedef enum _tagMouseState
...{
MouseStateNormal = 0,
MouseStateDown =1,
MouseStateUp = 2
}MouseState;
typedef enum _tagTitleButtons
...{
ExitButton = 0,
MaximizeButton = 1,
MinimizeButton = 2,
NoneButton = -1
}TitleButtons;
protected:
BOOL m_bActive;
int m_ExitButtonState;
int m_MaximizeButtonState;
int m_MinimizeButtonState;
MouseState m_NcMouseState;
TitleButtons m_SelTitleButton;
protected:
void MKGradientRectXP(CDC *pDC , LPRECT pRect,COLORREF crColor[4]) ;
public:
BOOL MKDrawFrameBorder(CDC *pDC,HRGN hrgn = NULL);
BOOL MKDrawMenuBar(CDC *pDC,LPARAM lParam,HRGN hrgn = NULL);
BOOL MKDrawTitleBar(CDC* pDC,BOOL bActive,HRGN hrgn = NULL);
BOOL MKDrawTitleBarButtons(CDC* pDC);
LRESULT OnMKNcPaint(WPARAM wParam, LPARAM lParam);
LRESULT OnMKNcActive(WPARAM wParam, LPARAM lParam);
LRESULT OnMKActive(WPARAM wParam,LPARAM lParam);
LRESULT OnMKNodify(WPARAM wParam, LPARAM lParam);
LRESULT OnMKActiveApp(WPARAM wParam,LPARAM lParam);
LRESULT OnMKSetIcon(WPARAM wParam, LPARAM lParam);
LRESULT OnMKNcMouseMove(WPARAM wParam,LPARAM lParam);
LRESULT OnMKNcLMouseDown(WPARAM wParam,LPARAM lParam);
LRESULT OnMKNcLMouseUp(WPARAM wParam,LPARAM lParam);
LRESULT OnMKMouseMove(WPARAM wParam, LPARAM lParam);
LRESULT OnMKLButtonUp(WPARAM wParam, LPARAM lParam);
LRESULT OnMKNcHitTest(WPARAM wParam, LPARAM lParam);
LRESULT OnMKGetText(WPARAM wParam, LPARAM lParam);
LRESULT OnMKSetText(WPARAM wParam, LPARAM lParam);
LRESULT OnMKEraseBackGround(WPARAM wParam,LPARAM lParam);
LRESULT OnMKNcRButtonDown(WPARAM wParam,LPARAM lParam);
LRESULT OnMKNcRButtonUp(WPARAM wParam,LPARAM lParam);
LRESULT OnMKSysCommand(WPARAM wParam,LPARAM lParam);
LRESULT OnMKSetCursor(WPARAM wParam,LPARAM lParam);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};
2.實現文件如下CPP
//
#include "stdafx.h"
#include "MKDialog.h"
#include "MKDraw.h"
// CMKDialog 對話框
static COLORREF MKButtons[][4] =
...{
...{0x00FFE7CE, 0x00FFE7CE, 0x00EE8269, 0xFFEE8269},
...{0x00BDCBD6, 0x00C6CFD6, 0x00EFF3F7, 0xFFEFF3F7},
...{0x00CFF0FF, 0x00CFF0FF, 0x000097E5, 0xFF0097E5},
...{0x00C1CCD1, 0x00C1CCD1, 0x00EEF1F2, 0xFFEEF1F2},
...{0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2},
};
static COLORREF MKTitle[][4] =
...{
...{0x00FF900B, 0x00FF900B,0x00F7CBAD, 0x00FF350B },
...{0x00FFFFFF, 0x00FFFFFF,0x00FF900B, 0x00FF900B }
};
IMPLEMENT_DYNAMIC(CMKDialog, CDialog)
CMKDialog::CMKDialog()
: CDialog()
...{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CMKDialog::CMKDialog(UINT uTemplate,CWnd *pParent)
: CDialog(uTemplate,pParent)
...{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CMKDialog::CMKDialog(LPCTSTR lpszTemplateName,CWnd* pParent)
: CDialog(lpszTemplateName,pParent)
...{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CMKDialog::~CMKDialog()
...{
}
void CMKDialog::DoDataExchange(CDataExchange* pDX)
...{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMKDialog, CDialog)
END_MESSAGE_MAP()
// CMKDialog 消息處理程序
BOOL CMKDialog::MKDrawFrameBorder(CDC *pDC,HRGN hrgn)
...{
//畫框架
DWORD dwStyle = GetStyle() ;
if ( (dwStyle & WS_CHILD ) == WS_CHILD ) return FALSE ;
CRect rtWnd;
GetWindowRect(&rtWnd);
int Frame_BorderWidth = GetSystemMetrics(SM_CXDLGFRAME);
int Frame_BorderHeight =GetSystemMetrics(SM_CYDLGFRAME);
CRect rtBorder;
rtBorder.SetRect(0,0,rtWnd.Width(),rtWnd.Height());
//畫立體邊框
for(int i = 0; i < Frame_BorderWidth ; i ++)
...{
if(i < 4)
...{
pDC->Draw3dRect(i,i,rtWnd.Width() - 2*i,rtWnd.Height() - 2*i,RGB(0,0,200),RGB(0,0,200));
}
else
...{
pDC->Draw3dRect(i,i,rtWnd.Width() - 2*i,rtWnd.Height() - 2*i,RGB(0,0,200),RGB(0,0,200));
}
}
return TRUE;
}
BOOL CMKDialog::MKDrawMenuBar(CDC *pDC,LPARAM lParam,HRGN hrgn)
...{
CMenu *pMenu = GetMenu();
if(pMenu == NULL) return TRUE;
CRect rtMenu;
CRect rtWnd;
DWORD style = GetStyle();
int BorderWidth = 0;
int BorderHeight = 0;
int CaptionHeight = 0;
BorderWidth = GetSystemMetrics(SM_CXDLGFRAME);
BorderHeight =GetSystemMetrics(SM_CYDLGFRAME);
//no support toolswindow
if((style & WS_CAPTION) == WS_CAPTION)
...{
CaptionHeight = GetSystemMetrics(SM_CYCAPTION);
}
GetWindowRect(&rtWnd);
rtMenu.left = GetSystemMetrics(SM_CXFRAME);
rtMenu.top = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CXFRAME) + 1;
rtMenu.right = rtWnd.Width() - GetSystemMetrics(SM_CXFRAME);
rtMenu.bottom = rtMenu.top + GetSystemMetrics(SM_CYMENU);
UINT ItemCount = pMenu->GetMenuItemCount();
int PrevTop = rtMenu.top;
int PrevLeft = rtMenu.left;
int MenuItemHeight = GetSystemMetrics(SM_CYMENU);
CRect rtMenuItem;
//畫菜單上部線
CBrush brMenu(GetSysColor(COLOR_MENU));
CBrush* pOldBrush = pDC->SelectObject(&brMenu);
pDC->PatBlt(rtMenu.left,rtMenu.top - 1,rtMenu.Width(),1, PATCOPY);
for(UINT items = 0; items < ItemCount; items++)
...{
GetMenuItemRect(m_hWnd,pMenu->m_hMenu,items,&rtMenuItem);
//畫系統菜單
HRGN rgn = CreateRectRgn(rtMenuItem.left,rtMenuItem.top,rtMenuItem.right,rtMenuItem.bottom);
if(hrgn != NULL)
...{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
...{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
...{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
int MenuTop = rtMenuItem.top - rtWnd.top;
MenuItemHeight = rtMenuItem.Height();
if(MenuTop != PrevTop)
...{
rgn = CreateRectRgn(rtWnd.left + PrevLeft,rtWnd.top + PrevTop,rtWnd.right - BorderWidth,rtWnd.top + PrevTop + MenuItemHeight);
if(hrgn != NULL)
...{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
...{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
...{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
PrevTop = MenuTop;
PrevLeft = rtMenu.left + rtMenuItem.Width();
}
else
...{
PrevLeft += rtMenuItem.Width();
}
}
HRGN rgn = CreateRectRgn(rtWnd.left + PrevLeft,rtWnd.top + PrevTop,rtWnd.right - BorderWidth,rtWnd.top + PrevTop + MenuItemHeight);
if(hrgn != NULL)
...{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
...{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
...{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
//畫菜單上部線
pDC->PatBlt(rtMenu.left,PrevTop + MenuItemHeight,rtMenu.Width(),1, PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
BOOL CMKDialog::MKDrawTitleBar(CDC* pDC,BOOL bActive,HRGN hrgn)
...{
//取得標題欄的位置
DWORD style = GetStyle();
if((style & WS_CAPTION) != WS_CAPTION) return TRUE;
CRect rtWnd;
GetWindowRect(&rtWnd);
CRect rtTitle;
rtTitle.CopyRect(&rtWnd) ;
rtTitle.right -= rtTitle.left ;
rtTitle.bottom -= rtTitle.top ;
rtTitle.left = rtTitle.top = 0 ;
rtTitle.left += GetSystemMetrics(SM_CXDLGFRAME);
rtTitle.top += GetSystemMetrics(SM_CYDLGFRAME);
rtTitle.right -= GetSystemMetrics(SM_CYDLGFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYCAPTION);
CMemDC memDC(pDC,rtTitle);
COLORREF TitleTextColor;
UINT DrawMode;
if(bActive)
...{
this->MKGradientRectXP(&memDC,&rtTitle ,MKTitle[0] ) ;
TitleTextColor = GetSysColor(COLOR_CAPTIONTEXT);
}
else
...{
this->MKGradientRectXP(&memDC,&rtTitle,MKTitle[1] ) ;
TitleTextColor = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
}
//畫標題欄圖標
HICON hIcon = GetIcon(FALSE);
CRect rtTitleText;
if(hIcon != NULL)
...{
DrawIconEx(memDC.m_hDC,rtTitle.left+1,rtTitle.top+1,hIcon,rtTitle.Height() - 2,rtTitle.Height() - 2,0,NULL,DI_NORMAL);
rtTitleText.SetRect(rtTitle.left + rtTitle.Height(),rtTitle.top,rtTitle.right - 60,rtTitle.bottom);
}
else
...{
rtTitleText.SetRect(rtTitle.left + 1,rtTitle.top,rtTitle.right - 60,rtTitle.bottom);
}
//畫標題欄文字
CFont TitleFont;
NONCLIENTMETRICS nif;
nif.cbSize = sizeof(nif);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&nif,0);
TitleFont.CreateFontIndirect(&nif.lfCaptionFont);
CFont *pOldFont = memDC.SelectObject(&TitleFont);
CString titleText;
GetWindowText(titleText);
int oldBkMode = memDC.SetBkMode(TRANSPARENT);
int oldTextColor = memDC.SetTextColor(TitleTextColor);
TEXTMETRIC Metrics;
pDC->GetTextMetrics(&Metrics);
rtTitleText.top = rtTitle.top + (rtTitle.Height() - Metrics.tmHeight)/2 + 1;
memDC.DrawText(titleText,&rtTitleText,DT_LEFT | DT_SINGLELINE);
memDC.SetBkMode(oldBkMode);
memDC.SetTextColor(oldTextColor);
memDC.SelectObject(&pOldFont);
//畫標題欄按扭
MKDrawTitleBarButtons(&memDC);
return TRUE;
}
LRESULT CMKDialog::OnMKNcPaint(WPARAM wParam, LPARAM lParam)
...{
//繪製非客戶區
//if(m_bEnableSkin == FALSE)
//{
// return CDialog::WindowProc(WM_NCPAINT,wParam,lParam);
//}
CWindowDC dc(this);
HRGN hrgn = NULL;
CRect rtWnd;
GetWindowRect(&rtWnd);
if(wParam != 1)
...{
hrgn = (HRGN)wParam;
}
if(hrgn != NULL)
...{
::SelectClipRgn(dc.m_hDC,hrgn);
::OffsetClipRgn(dc.m_hDC,0 - rtWnd.left,0 - rtWnd.top);
}
MKDrawFrameBorder(&dc,hrgn);
MKDrawTitleBar(&dc,m_bActive,hrgn);
MKDrawMenuBar(&dc,lParam);
if(hrgn != NULL)
...{
::SelectClipRgn(dc.m_hDC,NULL);
DeleteObject(hrgn);
}
return FALSE;
}
LRESULT CMKDialog::OnMKNcActive(WPARAM wParam, LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCACTIVATE,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCACTIVATE,wParam,lParam);
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
return TRUE;
}
LRESULT CMKDialog::OnMKActive(WPARAM wParam,LPARAM lParam)
...{
LRESULT result = CDialog::WindowProc(WM_ACTIVATE,wParam,lParam);
//if(!m_bEnableSkin)return result;
//if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
if(wParam == WA_INACTIVE)
...{
m_bActive = FALSE;
}
else
...{
m_bActive = TRUE;
}
OnMKNcPaint(1,0);
return result;
}
LRESULT CMKDialog::OnMKNodify(WPARAM wParam, LPARAM lParam)
...{
LRESULT result = CDialog::WindowProc(WM_NOTIFY,wParam,lParam);
//if(!m_bEnableSkin)return result;
//if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
return result;
}
LRESULT CMKDialog::OnMKActiveApp(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
LRESULT result = CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
m_bActive = (BOOL)wParam;
return 0;
}
LRESULT CMKDialog::OnMKSetText(WPARAM wParam, LPARAM lParam)
...{
LRESULT result = CDialog::WindowProc(WM_SETTEXT,wParam,lParam);
//if(!m_bEnableSkin)return result;
//if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
return result;
}
BOOL CMKDialog::MKDrawTitleBarButtons(CDC* pDC)
...{
//取得標題欄的位置
CRect rtWnd;
CRect rtTitle;
GetWindowRect(&rtWnd);
rtTitle.left = GetSystemMetrics(SM_CXDLGFRAME);
rtTitle.top = GetSystemMetrics(SM_CYDLGFRAME);
rtTitle.right = rtWnd.Width() - GetSystemMetrics(SM_CXDLGFRAME);
rtTitle.bottom = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME); ;
int iButtonWidth = GetSystemMetrics(SM_CYCAPTION) ;
CRect rtButtons;
//畫標題欄按扭
DWORD dwStyle = GetStyle() ;
//重畫關閉button
if(dwStyle & WS_SYSMENU )
...{
rtButtons.left = rtTitle.right - iButtonWidth + 2 ;
rtButtons.top = rtTitle.top + 2;
rtButtons.right = rtTitle.right - 2;
rtButtons.bottom = rtTitle.bottom - 2;
pDC->RoundRect(rtButtons.left-1, rtButtons.top -1, rtButtons.right +1, rtButtons.bottom +1, 4,4 );
MKGradientRectXP(pDC, &rtButtons, MKButtons[m_ExitButtonState]);
pDC->MoveTo( rtButtons.left + 2, rtButtons.top + 2);
pDC->LineTo( rtButtons.right - 2, rtButtons.bottom - 2);
pDC->MoveTo(rtButtons.right - 2, rtButtons.top + 2);
pDC->LineTo(rtButtons.left + 2, rtButtons.bottom - 2);
}
//重畫最大化/恢復button
if(dwStyle & WS_MAXIMIZEBOX )
...{
rtButtons.right = rtButtons.left - 2;
rtButtons.left = rtButtons.left - rtTitle.Height() +2;
pDC->RoundRect(rtButtons.left-1, rtButtons.top -1,rtButtons.right +1, rtButtons.bottom +1, 4,4);
MKGradientRectXP(pDC, &rtButtons, MKButtons[m_MaximizeButtonState]) ;
if ( IsZoomed() )
...{
pDC->MoveTo(rtButtons.left + 2 , rtButtons.top + rtButtons.Height() / 2 - 1) ;
pDC->LineTo(rtButtons.left + rtButtons.Width() - 2 , rtButtons.top + rtButtons.Height()/2 -1) ;
pDC->MoveTo(rtButtons.left + 2 , rtButtons.top + rtButtons.Height() / 2 ) ;
pDC->LineTo(rtButtons.left + rtButtons.Width() - 2 , rtButtons.top + rtButtons.Height()/2 ) ;
pDC->MoveTo(rtButtons.left + 2 , rtButtons.top + rtButtons.Height() / 2 +1) ;
pDC->LineTo(rtButtons.left + rtButtons.Width() - 2 , rtButtons.top + rtButtons.Height()/2 +1) ;
}
else
...{
pDC->MoveTo(rtButtons.left + 2, rtButtons.top + rtButtons.Height()/2);
pDC->LineTo(rtButtons.left + rtButtons.Width() -2 , rtButtons.top +rtButtons.Height()/2 );
pDC->MoveTo(rtButtons.left + rtButtons.Width()/2 , rtButtons.top + 2 );
pDC->LineTo(rtButtons.left + rtButtons.Width()/2 , rtButtons.top + rtButtons.Height() - 2);
}
}
//重畫最小化button
if(dwStyle & WS_MAXIMIZEBOX )
...{
rtButtons.right = rtButtons.left - 2;
rtButtons.left = rtButtons.left - rtTitle.Height() + 2 ;
pDC->RoundRect(rtButtons.left-1, rtButtons.top -1,rtButtons.right +1, rtButtons.bottom +1, 4,4);
MKGradientRectXP(pDC, &rtButtons, MKButtons[m_MinimizeButtonState]) ;
pDC->MoveTo(rtButtons.left + 4, rtButtons.bottom - 4);
pDC->LineTo(rtButtons.right - 4, rtButtons.bottom - 4);
pDC->MoveTo(rtButtons.left + 4, rtButtons.bottom - 5);
pDC->LineTo(rtButtons.right- 4, rtButtons.bottom - 5);
}
return TRUE;
}
LRESULT CMKDialog::OnMKNcRButtonUp(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCRBUTTONUP,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCRBUTTONUP,wParam,lParam);
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
return CDialog::WindowProc(WM_NCRBUTTONUP,wParam,lParam);
}
LRESULT CMKDialog::OnMKSetIcon(WPARAM wParam, LPARAM lParam)
...{
LRESULT result = CDialog::WindowProc(WM_SETICON,wParam,lParam);
//if(!m_bEnableSkin)return result;
//if(!m_bEnableTitleBar)return result;
if(IsWindow(m_hWnd))
...{
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
}
return result;
}
LRESULT CMKDialog::OnMKNcMouseMove(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin) return CDialog::WindowProc(WM_NCMOUSEMOVE,wParam,lParam);
//if(!m_bEnableTitleBar) return CDialog::WindowProc(WM_NCMOUSEMOVE,wParam,lParam);
LRESULT result = 0;
CWindowDC dc(this);
switch(wParam)
...{
case HTMAXBUTTON:
if(m_NcMouseState == MouseStateNormal)
...{
if(m_MaximizeButtonState != StateFocus)
...{
m_MaximizeButtonState = StateFocus;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
else if(m_NcMouseState == MouseStateDown)
...{
if(m_SelTitleButton == MaximizeButton)
...{
if(m_MaximizeButtonState != StateDown)
...{
m_MaximizeButtonState = StateDown;
MKDrawTitleBarButtons(&dc);
}
}
else if(m_SelTitleButton != NoneButton)
...{
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
break;
case HTMINBUTTON:
if(m_NcMouseState == MouseStateNormal)
...{
if(m_MinimizeButtonState != StateFocus)
...{
m_MinimizeButtonState = StateFocus;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
else if(m_NcMouseState == MouseStateDown)
...{
if(m_SelTitleButton == MinimizeButton)
...{
if(m_MinimizeButtonState != StateDown)
...{
m_MinimizeButtonState = StateDown;
MKDrawTitleBarButtons(&dc);
}
}
else if(m_SelTitleButton != NoneButton)
...{
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
break;
case HTCLOSE:
if(m_NcMouseState == MouseStateNormal)
...{
if(m_ExitButtonState != StateFocus)
...{
m_ExitButtonState = StateFocus;
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
else if(m_NcMouseState == MouseStateDown)
...{
if(m_SelTitleButton == ExitButton)
...{
if(m_ExitButtonState != StateDown)
...{
m_ExitButtonState = StateDown;
MKDrawTitleBarButtons(&dc);
}
}
else if(m_SelTitleButton != NoneButton)
...{
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
break;
default:
if(m_ExitButtonState != StateNormal || m_MinimizeButtonState != StateNormal || m_MaximizeButtonState != StateNormal)
...{
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
result = 0;//DefWindowProc(WM_NCMOUSEMOVE,wParam,lParam);
break;
}
return result;
}
LRESULT CMKDialog::OnMKNcLMouseDown(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
LRESULT result = 0;
CWindowDC dc(this);
switch(wParam)
...{
case HTMAXBUTTON:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = MaximizeButton;
m_MaximizeButtonState = StateDown;
MKDrawTitleBarButtons(&dc);
SetCapture();
break;
case HTMINBUTTON:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = MinimizeButton;
m_MinimizeButtonState = StateDown;
MKDrawTitleBarButtons(&dc);
SetCapture();
break;
case HTCLOSE:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = ExitButton;
m_ExitButtonState = StateDown;
MKDrawTitleBarButtons(&dc);
SetCapture();
break;
default:
result = CDialog::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
break;
}
MKDrawTitleBar(&dc,m_bActive);
return result;
}
LRESULT CMKDialog::OnMKNcLMouseUp(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
LRESULT result = 0;
if(m_NcMouseState == MouseStateNormal)
...{
return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
}
m_NcMouseState = MouseStateNormal;
ReleaseCapture();
if(wParam == HTMAXBUTTON)
...{
if(m_SelTitleButton == MaximizeButton)
...{
CWindowDC dc(this);
m_SelTitleButton = NoneButton;
m_MaximizeButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
if(IsZoomed())
...{
SendMessage(WM_SYSCOMMAND, SC_RESTORE, lParam);
}
else
...{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE,lParam);
}
}
}
else if(wParam == HTMINBUTTON)
...{
if(m_SelTitleButton == MinimizeButton)
...{
CWindowDC dc(this);
m_SelTitleButton = NoneButton;
m_MinimizeButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE,lParam);
}
}
else if(wParam == HTCLOSE)
...{
if(m_SelTitleButton == ExitButton)
...{
CWindowDC dc(this);
m_SelTitleButton = NoneButton;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
SendMessage(WM_CLOSE);
}
}
else
...{
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
result = CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
}
return result;
}
LRESULT CMKDialog::OnMKMouseMove(WPARAM wParam, LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam);
if(m_NcMouseState != MouseStateNormal)
...{
CRect rtWnd;
GetWindowRect(&rtWnd);
CPoint point(lParam);
ClientToScreen(&point);
UINT hit = (UINT)CDialog::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnMKNcMouseMove(hit,MAKELPARAM(point.x,point.y));
}
else
...{
if(m_ExitButtonState != StateNormal || m_MinimizeButtonState != StateNormal || m_MaximizeButtonState != StateNormal)
...{
CWindowDC dc(this);
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
MKDrawTitleBarButtons(&dc);
}
}
return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam);
}
LRESULT CMKDialog::OnMKLButtonUp(WPARAM wParam, LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam);
if(m_NcMouseState != MouseStateNormal)
...{
CRect rtWnd;
GetWindowRect(&rtWnd);
CPoint point(lParam);
ClientToScreen(&point);
UINT hit = (UINT)CDialog::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnMKNcLMouseUp(hit,MAKELPARAM(point.x,point.y));
}
return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam);
}
LRESULT CMKDialog::OnMKEraseBackGround(WPARAM wParam,LPARAM lParam)
...{
CDC *pDC = CDC::FromHandle((HDC)wParam);
CRect rtClient;
GetClientRect(&rtClient);
DWORD dwStyle = GetStyle() ;
if ( ( dwStyle & WS_CHILD ) == WS_CHILD ) //是子對話框
...{
pDC->FillSolidRect(&rtClient , RGB(198,211,247) ) ;
}
else
...{
CMKDraw::MKFillGradient(pDC,rtClient,RGB(255,255,255),RGB(198,211,247),TRUE ) ;
}
return TRUE;
}
LRESULT CMKDialog::OnMKNcRButtonDown(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCRBUTTONDOWN,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCRBUTTONDOWN,wParam,lParam);
return 0;
}
LRESULT CMKDialog::OnMKSysCommand(WPARAM wParam,LPARAM lParam)
...{
//if(!m_bEnableSkin)return CDialog::WindowProc(WM_SYSCOMMAND,wParam,lParam);
//if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_SYSCOMMAND,wParam,lParam);
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
return CDialog::WindowProc(WM_SYSCOMMAND,wParam,lParam);
}
LRESULT CMKDialog::OnMKSetCursor(WPARAM wParam,LPARAM lParam)
...{
LRESULT rt = CDialog::WindowProc(WM_SETCURSOR,wParam,lParam);
//if(!m_bEnableSkin)return rt;
//if(!m_bEnableTitleBar)return rt;
UINT nHitTest = LOWORD(lParam);
CWindowDC dc(this);
switch(nHitTest)
...{
case HTBORDER:
case HTLEFT:
case HTRIGHT:
case HTTOP:
case HTBOTTOM:
case HTBOTTOMLEFT:
case HTBOTTOMRIGHT:
case HTTOPLEFT:
case HTTOPRIGHT:
MKDrawTitleBar(&dc,m_bActive);
break;
default:
break;
}
return rt;
}
LRESULT CMKDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
...{
switch(message)
...{
case WM_INITMENUPOPUP:
if(1)
...{
CWindowDC dc(this);
MKDrawTitleBar(&dc,m_bActive);
}
break;
case WM_NCPAINT:
return OnMKNcPaint(wParam,lParam);
case WM_NCACTIVATE:
return OnMKNcActive(wParam,lParam);
case WM_ACTIVATE:
return OnMKActive(wParam,lParam);
case WM_ACTIVATEAPP:
return OnMKActiveApp(wParam,lParam);
case WM_NOTIFY:
return OnMKNodify(wParam,lParam);
case WM_SETTEXT:
return OnMKSetText(wParam,lParam);
case WM_SETICON:
return OnMKSetIcon(wParam,lParam);
case WM_NCMOUSEMOVE:
return OnMKNcMouseMove(wParam,lParam);
case WM_NCLBUTTONDOWN:
return OnMKNcLMouseDown(wParam,lParam);
case WM_NCLBUTTONUP:
OnMKNcLMouseUp(wParam,lParam);
case WM_LBUTTONUP:
return OnMKLButtonUp(wParam,lParam);
case WM_MOUSEMOVE:
return OnMKMouseMove(wParam,lParam);
case WM_ERASEBKGND:
return OnMKEraseBackGround(wParam,lParam);
case WM_NCRBUTTONUP:
return OnMKNcRButtonUp(wParam,lParam);
case WM_NCRBUTTONDOWN:
return OnMKNcRButtonDown(wParam,lParam);
case WM_SYSCOMMAND:
return OnMKSysCommand(wParam,lParam);
case WM_SETCURSOR:
return OnMKSetCursor(wParam,lParam);
default:
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CMKDialog::MKGradientRectXP(CDC *pDC , LPRECT pRect,COLORREF crColor[4])
...{
int i;
TRIVERTEX Tve[4];
GRADIENT_RECT GRect;
GRADIENT_TRIANGLE GTrg;
for (i = 0; i < 4; i++)
...{
Tve[i].Red = ((COLOR16) GetRValue(crColor[i])) << 8;
Tve[i].Green = ((COLOR16) GetGValue(crColor[i])) << 8;
Tve[i].Blue = ((COLOR16) GetBValue(crColor[i])) << 8;
Tve[i].Alpha = ((COLOR16) (crColor[i] >> 24)) << 8;
}
Tve[0].x = pRect->left;
Tve[0].y = pRect->top;
Tve[1].x = pRect->right;
Tve[1].y = pRect->top;
Tve[2].x = pRect->left;
Tve[2].y = pRect->bottom;
Tve[3].x = pRect->right;
Tve[3].y = pRect->bottom;
if ((crColor[0] == crColor[2]) &&(crColor[1] == crColor[3]))
i = GRADIENT_FILL_RECT_H;
if ((crColor[0] == crColor[1]) && (crColor[2] == crColor[3]))
i = GRADIENT_FILL_RECT_V;
else
i = GRADIENT_FILL_TRIANGLE;
if (i == GRADIENT_FILL_TRIANGLE)
...{
GTrg.Vertex1 = 0;
GTrg.Vertex2 = 1;
GTrg.Vertex3 = 2;
}
else
...{
GRect.UpperLeft = 0;
GRect.LowerRight = 3;
}
pDC->GradientFill(Tve , 4 ,((i == GRADIENT_FILL_TRIANGLE) ? ((PVOID) >rg) : ((PVOID) &GRect)) ,1,i ) ;
if (i == GRADIENT_FILL_TRIANGLE)
...{
GTrg.Vertex1 = 3;
pDC->GradientFill(Tve, 4, >rg, 1, GRADIENT_FILL_TRIANGLE);
}
}
至此對話框類建立完成,如果自己要其它的效果,可以修改代碼完成,也可做成動態加載的效果而達到換膚的作用。