一步步做一個自己的對話框類之二(繪製對話框)

1.從CDialog 派生一個新的對話框內,命名一個你自己想要的名字,我的命名爲(CMDDialog)。

頭文件如下:

 

#pragma once


// 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

 

// MKDialog.cpp : 實現文件
//

#include 
"stdafx.h"
#include 
"MKDialog.h"
#include 
"MKDraw.h"
// CMKDialog 對話框

static COLORREF MKButtons[][4=
{        
        
{0x00FFE7CE0x00FFE7CE0x00EE82690xFFEE8269},            
        
{0x00BDCBD60x00C6CFD60x00EFF3F70xFFEFF3F7},    
        
{0x00CFF0FF0x00CFF0FF0x000097E50xFF0097E5},        
        
{0x00C1CCD10x00C1CCD10x00EEF1F20xFFEEF1F2},
        
{0x00FFFFFF0x00FFFFFF0x00D6DFE20xFFD6DFE2},
}
;

static COLORREF MKTitle[][4=
{
        
{0x00FF900B0x00FF900B,0x00F7CBAD0x00FF350B },
        
{0x00FFFFFF0x00FFFFFF,0x00FF900B0x00FF900B }
}
;


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 +14,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 +14,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 +14,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) &GTrg) : ((PVOID) &GRect)) ,1,i ) ;  

    
if (i == GRADIENT_FILL_TRIANGLE)
    
{
        GTrg.Vertex1 
= 3;
        pDC
->GradientFill(Tve, 4&GTrg, 1, GRADIENT_FILL_TRIANGLE);
    }


}

 

至此對話框類建立完成,如果自己要其它的效果,可以修改代碼完成,也可做成動態加載的效果而達到換膚的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章