漂亮的登錄界面:
主要源代碼:
// TitleBarColorDlg.cpp : implementation file
// Download by http://www.NewXing.com
#include "stdafx.h"
#include "TitleBarColor.h"
#include "TitleBarColorDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTitleBarColorDlg dialog
CTitleBarColorDlg::CTitleBarColorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTitleBarColorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTitleBarColorDlg)
m_userName = _T("admin");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTitleBarColorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTitleBarColorDlg)
DDX_Control(pDX, IDC_EDIT_USERPWD, m_EditUserPwd);
DDX_Control(pDX, IDC_EDIT_USERNAME, m_EditUserName);
DDX_Control(pDX, IDC_BUTTON_QUIT, m_quit);
DDX_Control(pDX, IDC_BUTTON_ENTER, m_enter);
DDX_Text(pDX, IDC_EDIT_USERNAME, m_userName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTitleBarColorDlg, CDialog)
//{{AFX_MSG_MAP(CTitleBarColorDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCMOUSEMOVE()
ON_WM_ERASEBKGND()
ON_WM_CREATE()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_BUTTON_QUIT, OnButtonQuit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTitleBarColorDlg message handlers
BOOL CTitleBarColorDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// TODO: Add extra initialization here
return TRUE;
}
void CTitleBarColorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTitleBarColorDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//屏蔽回車和ESC退出
BOOL CTitleBarColorDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN){
switch(pMsg->wParam){
case VK_RETURN://截獲回車
return TRUE;
case VK_ESCAPE://截獲ESC
return TRUE;
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
//對話框窗口缺省消息處理
LRESULT CTitleBarColorDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//return CDialog::DefWindowProc(message, wParam, lParam);
LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);
/*
IsWindow()函數用法:
IsWindow()函數判斷hwndDlg是否已經指向一個窗口,如果返回TRUE,表示對話框已經顯示,
不需要再調用對話框,如果返回FALSE,調用CreateDialog()顯示對話框。要注意一點,
hwndDlg必須聲明爲全局變量,而不是對話框函數的私有變量,否則每次對話框函數被調用都將重新初始化
該變量IsWindow(hwndDlg)總方會FALSE,上面的判斷語句就形同虛設了。同時應在調用EndDialog()前設hwndDlg=NULL,
否則對話框關閉後IsWindow(hwndDlg)總返回TRUE,再也打不開了*/
if (!::IsWindow(m_hWnd))
return lrst;
if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
{
try
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
catch( CException* e )
{
e->Delete();
}
}
return lrst;
}
// 函 數 名:DrawTitleBar
// 功能描述:繪製標題欄、邊框顏色,繪製標題內容、圖標和按鈕
// 輸入參數:pDC:設備指針
// 輸出參數:void
// 創建日期:2006-2-20
// 修改日期:2006-2-20
// 作 者:joinclear
// 附加說明:無
void CTitleBarColorDlg::DrawTitleBar(CDC *pDC)
{
if (m_hWnd)
{
CBrush Brush(RGB(187,200,143));
CBrush* pOldBrush = pDC->SelectObject(&Brush);
CRect rtWnd, rtTitle, rtButtons;
GetWindowRect(&rtWnd);
//取得標題欄的位置
//SM_CXFRAME 窗口邊框的邊緣寬度
//SM_CYFRAME 窗口邊框的邊緣高度
//SM_CXSIZE 窗口標題欄寬度
//SM_CYSIZE 窗口標題欄高度
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
CPoint point;
//填充頂部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME) + 0;
pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
//填充左側框架
point.x = GetSystemMetrics(SM_CXFRAME) -1;
point.y = rtWnd.Height()- 1;
pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
//填充底部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYFRAME);
pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
//填充右側框架
point.x = GetSystemMetrics(SM_CXFRAME);
point.y = rtWnd.Height();
pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
//重畫標題欄圖標
m_rtIcon.left = rtTitle.left ;
m_rtIcon.top = rtTitle.top;
m_rtIcon.right = m_rtIcon.left + 16;
m_rtIcon.bottom = m_rtIcon.top + 15;
::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME),
m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
m_rtIcon.OffsetRect(rtWnd.TopLeft());
CBitmap* pBitmap = new CBitmap;
CBitmap* pOldBitmap;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
//重畫關閉button
rtButtons.left = rtTitle.right - 16;
rtButtons.top = rtTitle.top - 1;
rtButtons.right = rtButtons.left + 16;
rtButtons.bottom = rtButtons.top + 15;
pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtExit = rtButtons;
m_rtButtExit.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重畫最大化/恢復button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 16;
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
else
pBitmap->LoadBitmap(IDB_MAX_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMax = rtButtons;
m_rtButtMax.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重畫最小化button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 16;
pBitmap->LoadBitmap(IDB_MIN_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMin = rtButtons;
m_rtButtMin.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重畫caption
int nOldMode = pDC->SetBkMode(TRANSPARENT);
COLORREF clOldText=pDC->SetTextColor(RGB(255, 255, 255));
CFont m_captionFont;
m_captionFont.CreateFont(
18, // 字體的高度
0, // 字體的寬度
0, // 字體顯示的角度
0, // 字體的角度
FW_BOLD, // 字體的磅數
FALSE, // 斜體字體
FALSE, // 帶下劃線的字體
0, // 帶刪除線的字體
ANSI_CHARSET, // 所需的字符集
OUT_DEFAULT_PRECIS, // 輸出的精度
CLIP_DEFAULT_PRECIS, // 裁減的精度
DEFAULT_QUALITY, // 邏輯字體與輸出設備的實際字體之間的精度
DEFAULT_PITCH | FF_SWISS, // 字體間距和字體集
_T("Arial")); // 字體名稱
CFont* pOldFont = NULL;
pOldFont = pDC->SelectObject(&m_captionFont);
rtTitle.left += m_rtIcon.Width ()+3;
rtTitle.top = rtTitle.top;
rtTitle.bottom = rtTitle.top + 30;
CString m_strTitle;
GetWindowText(m_strTitle);
pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
pDC->SetBkMode(nOldMode);
pDC->SetTextColor(clOldText);
ReleaseDC(pDisplayMemDC);
delete pDisplayMemDC;
delete pBitmap;
}
}
// 函 數 名:OnNcLButtonDown
// 功能描述:在非客戶區單擊 繪製消息
// 輸入參數:
// 輸出參數:void
// 創建日期:2006-2-20
// 修改日期:2006-2-20
// 作 者:joinclear
// 附加說明:無
void CTitleBarColorDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (m_rtButtExit.PtInRect(point)) //關閉
SendMessage(WM_CLOSE);
else if (m_rtButtMin.PtInRect(point)) //最小化
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
else if (m_rtButtMax.PtInRect(point))
{
if (IsZoomed()) //最大化
{
SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));
CRect rtWnd;
GetWindowRect(&rtWnd);
CRgn rgn;
rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd.Height(),5,5);
SetWindowRgn((HRGN)rgn,true);
Invalidate();
}
else
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
CRect rtWnd;
GetWindowRect(&rtWnd);
CRgn rgn;
rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd.Height(),5,5);
SetWindowRgn((HRGN)rgn,true);
Invalidate();
}
}
else if (!IsZoomed())
Default();
}
// 函 數 名:OnNcMouseMove
// 功能描述:在非客戶區 鼠標移動 繪製消息
// 輸入參數:
// 輸出參數:void
// 創建日期:2006-2-20
// 修改日期:2006-2-20
// 作 者:joinclear
// 附加說明:無
void CTitleBarColorDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
{
CWindowDC dc(this);
CWindowDC* pDC = &dc;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
CBitmap* pBitmap = new CBitmap;
CBitmap* pOldBitmap;
CRect rtWnd, rtButton;
if (pDC)
{
GetWindowRect(&rtWnd);
//關閉button
if (m_rtButtExit.PtInRect(point))
pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
else
pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
rtButton = m_rtButtExit;
rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//最大化/恢復button
if (m_rtButtMax.PtInRect(point))
{
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_FOCUS);
else
pBitmap->LoadBitmap(IDB_MAX_FOCUS);
}
else
{
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
else
pBitmap->LoadBitmap(IDB_MAX_NORMAL);
}
rtButton = m_rtButtMax;
rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//最小化button
if (m_rtButtMin.PtInRect(point))
pBitmap->LoadBitmap(IDB_MIN_FOCUS);
else
pBitmap->LoadBitmap(IDB_MIN_NORMAL);
rtButton = m_rtButtMin;
rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
}
pDisplayMemDC->DeleteDC();
delete pDisplayMemDC;
delete pBitmap;
CDialog::OnNcMouseMove(nHitTest, point);
}
//填充背景
BOOL CTitleBarColorDlg::OnEraseBkgnd(CDC* pDC)
{
BOOL retValue= CDialog::OnEraseBkgnd(pDC);
CRect rc;
GetClientRect(&rc);
pDC->FillSolidRect(&rc,RGB(236,233,216));
return retValue;
}
//改變窗口邊框爲圓角
int CTitleBarColorDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rtWnd;
GetWindowRect(&rtWnd);
CRgn rgn;
rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd.Height(),5,5);
SetWindowRgn((HRGN)rgn,true);
return 0;
}
//joinclear 2006-4-9 add
HBRUSH CTitleBarColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
//static顏色
if (pWnd->GetDlgCtrlID()==IDC_STATIC)
{
pDC->SetTextColor(RGB(0,100,0));
pDC->SetBkMode(TRANSPARENT);
}
//標題
if (pWnd->GetDlgCtrlID()==IDC_STATIC_TITLE)
{
CFont font;
font.CreatePointFont(200,"隸書");
pDC->SelectObject(&font);
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkMode(TRANSPARENT);
}
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
pDC->SetBkMode(TRANSPARENT);
HBRUSH B=CreateSolidBrush(RGB(236,233,216));
return B;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
void CTitleBarColorDlg::OnButtonQuit()
{
CDialog::OnCancel();
}
效果圖:
程序和源代碼鏈接:http://download.csdn.net/download/zhangxiaoyu_sy/10012772