www.gusucode.com > 一个VC++ GUI测试程序-源码程序 > 一个VC++ GUI测试程序-源码程序/code/DlgBaseClass.cpp
//Download by http://www.NewXing.com // DlgBaseClass.cpp : implementation file #include "stdafx.h" #include "DlgBaseClass.h" #include <winuser.h> #include "resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgBaseClass dialog CImageList* CDlgBaseClass::m_pImageList=NULL; BOOL CDlgBaseClass::InitDlgBase() { m_pImageList=new CImageList; CImageList *il=new CImageList; m_pImageList->Create(IDB_BITMAP_BUTTONICONS_1,25,0,RGB(255,0,255)); il->Create(IDB_BITMAP_BUTTONICONS_2,25,0,RGB(255,0,255)); int i,n=il->GetImageCount(); for(i=0;i<n;i++) m_pImageList->Add(il->ExtractIcon(i)); n=m_pImageList->GetImageCount(); il->DeleteImageList(); delete il; return TRUE; } void CDlgBaseClass::ExitDlgBase() { if(m_pImageList) delete m_pImageList; } CDlgBaseClass::CDlgBaseClass(UINT nID,CWnd* pParent /*=NULL*/) : CDialog(nID, pParent) { //{{AFX_DATA_INIT(CDlgBaseClass) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_nID=nID; m_hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR_HAND); m_hBackBrush=(HBRUSH)::CreateSolidBrush(RGB(237,240,247)); } BEGIN_MESSAGE_MAP(CDlgBaseClass, CDialog) //{{AFX_MSG_MAP(CDlgBaseClass) ON_WM_CTLCOLOR() ON_WM_SETCURSOR() ON_WM_ERASEBKGND() ON_WM_NCLBUTTONDOWN() ON_WM_NCMOUSEMOVE() ON_WM_CREATE() //}}AFX_MSG_MAP ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgBaseClass message handlers HBRUSH CDlgBaseClass::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { UINT nID=pWnd->GetDlgCtrlID(); if(nCtlColor==CTLCOLOR_SCROLLBAR) { return m_hBackBrush; } if(nCtlColor==CTLCOLOR_STATIC) { pDC->SetTextColor(RGB(255, 255, 255)); pDC->SetBkMode(TRANSPARENT); return m_hBackBrush; } return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); } BOOL CDlgBaseClass::OnEraseBkgnd(CDC* pDC) { CRect rect; GetClientRect(rect); pDC->FillRect(rect,CBrush::FromHandle(m_hBackBrush)); return TRUE; } BOOL CDlgBaseClass::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { CRuntimeClass *pc=pWnd->GetRuntimeClass(); if(pc->IsDerivedFrom(RUNTIME_CLASS(CButton))) SetCursor(m_hCursor); else return CDialog::OnSetCursor(pWnd, nHitTest, message); return TRUE; } BOOL CDlgBaseClass::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) { TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; CString strTipText; UINT nID = pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)){ // idFrom is actually the HWND of the tool nID = ::GetDlgCtrlID((HWND)nID); } if (nID != 0) { // will be zero on a separator if(!m_tooltipMap.Lookup(nID,strTipText)) { if(!strTipText.LoadString(nID)) return TRUE; } } if (pNMHDR->code == TTN_NEEDTEXTA) lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); else _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); *pResult = 0; return TRUE; } BOOL CDlgBaseClass::OnInitDialog() { CDialog::OnInitDialog(); m_tooltipMap.InitHashTable(50); EnableToolTips(TRUE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgBaseClass::SetToolTipMap(UINT nID, CString strToolTip) { if(strToolTip.IsEmpty()||strToolTip.GetLength()==0) m_tooltipMap.RemoveKey(nID); else m_tooltipMap[nID]=strToolTip; } void CDlgBaseClass::ClearToolTipMap() { m_tooltipMap.RemoveAll(); } void CDlgBaseClass::PostNcDestroy() { ::DeleteObject(m_hBackBrush); m_tooltipMap.RemoveAll(); while(m_btns.GetSize()) { delete m_btns[0]; m_btns.RemoveAt(0); } CDialog::PostNcDestroy(); } void CDlgBaseClass::CreateIconButtons(UINT *nIDs,int n) { for(int i=0;i<n;i++) { m_btns.Add(new CIconButton); m_btns[i]->SubclassDlgItem(nIDs[i],this); } } void CDlgBaseClass::SetButtonIcon(UINT nID, LONG nIconIndex, LONG nStyle, LONG nSize, DWORD ibg) { CIconButton *pi=(CIconButton*)GetDlgItem(nID); if(!pi)return; if(nIconIndex<0) { nIconIndex=-nIconIndex; pi->SetHasMenu(); } pi->SetIconSize(nIconIndex,nStyle,nSize,ibg); } // --------------------------------------------------------- // 名称: DrawXPBmp // 功能: 绘制XP风格的背景位图 // 变量: pDC -- 设备指针,ID -- 资源ID,pt1, pt2 -- 点位置 // 返回: 无 // 编写: 徐景周,2002.4.8 // --------------------------------------------------------- void CDlgBaseClass::DrawXPBmp(CDC *pDC,int ID,CPoint pt1,CPoint pt2) { CDC *memdc=new CDC; CRect rect; CBitmap bitmap; BITMAP szbitmap; bitmap.LoadBitmap(ID); bitmap.GetObject(sizeof(BITMAP),&szbitmap); CSize size(szbitmap.bmWidth,szbitmap.bmHeight); memdc->CreateCompatibleDC(pDC); CBitmap *oldbitmap=memdc->SelectObject(&bitmap); pDC->StretchBlt(pt1.x,pt1.y,pt2.x,pt2.y,memdc,0,0,size.cx ,size.cy ,SRCCOPY); memdc->SelectObject(oldbitmap); memdc->DeleteDC(); if( memdc ) delete memdc; } // --------------------------------------------------------- // 名称: DrawTitleBar // 功能: 绘制具有XP风格的窗体框架 // 变量: pDC -- 设备指针 // 返回: 无 // 修改: 徐景周,2002.4.8 // --------------------------------------------------------- void CDlgBaseClass::DrawTitleBar(CDC *pDC) { if (m_hWnd) { CBrush Brush(RGB(10,80,240)); CBrush* pOldBrush = pDC->SelectObject(&Brush); CRect rtWnd, rtTitle, rtButtons; GetWindowRect(&rtWnd); //取得标题栏的位置 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 = GetSystemMetrics(SM_CXFRAME) + 1; //左边框 point.y = rtWnd.Height(); DrawXPBmp(pDC,IDB_LEFT,CPoint(0,0),CPoint(point.x,point.y)); point.x = rtWnd.Width(); //底边框 point.y = GetSystemMetrics(SM_CYFRAME) + 1; DrawXPBmp(pDC,IDB_BOTTOM,CPoint(0, rtWnd.Height()-point.y), CPoint(point.x, point.y)); point.x = GetSystemMetrics(SM_CXFRAME) + 1; //右边框 point.y = rtWnd.Height(); DrawXPBmp(pDC,IDB_RIGHT,CPoint(rtWnd.Width()-point.x, 0), CPoint(point.x, point.y)); point.x = rtWnd.Width(); //顶边框 point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME); DrawXPBmp(pDC,IDB_TOP,CPoint(0,0),CPoint(point.x,point.y)); //重画图标 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()); //准备画XP风格按钮 CBitmap* pBitmap = new CBitmap; CBitmap* pOldBitmap; CDC* pDisplayMemDC=new CDC; pDisplayMemDC->CreateCompatibleDC(pDC); //重画关闭button rtButtons.left = rtTitle.right - 16; rtButtons.top = rtTitle.top; rtButtons.right = rtButtons.left + 16; rtButtons.bottom = rtButtons.top + 15; pBitmap->LoadBitmap(IDB_EXIT_NORMAL); 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(::GetSysColor(COLOR_3DSHADOW)); LOGFONT logFont; //获取标题栏字体 SystemParametersInfo( SPI_GETICONTITLELOGFONT, 0, &logFont, 0); CFont m_captionFont; m_captionFont.CreateFontIndirect(&logFont); CFont* pOldFont = NULL; //zwh Adding,2002.6.20 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); //3D显示文字 pDC->DrawText(m_strTitle, rtTitle+CPoint(3,3), DT_LEFT); pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); pDC->DrawText(m_strTitle, rtTitle, DT_LEFT); pDC->SetBkMode(nOldMode); pDC->SetTextColor(clOldText); //zwh Adding,2002.6.20 if (pOldFont != NULL) { pDC->SelectObject(pOldFont); m_captionFont.DeleteObject(); } //zwh Modifing,2002.6.20 //ReleaseDC(pDisplayMemDC); pDisplayMemDC->DeleteDC(); delete pDisplayMemDC; delete pBitmap; } } void CDlgBaseClass::OnNcLButtonDown(UINT nHitTest, CPoint point) { //检测各按钮是否按到 if (m_rtButtExit.PtInRect(point)) SendMessage(WM_COMMAND,IDCANCEL); 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)); else { SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y)); Invalidate(); } } else Default(); CDialog::OnNcLButtonDown(nHitTest, point); } void CDlgBaseClass::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_FOCUS); else pBitmap->LoadBitmap(IDB_EXIT_NORMAL); 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); } LRESULT CDlgBaseClass::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam); if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE||message==WM_SETTEXT) { try { CWindowDC dc(this); if (&dc) DrawTitleBar(&dc); } catch( CException* e ) { e->Delete(); } } return lrst; } BOOL CDlgBaseClass::PreCreateWindow(CREATESTRUCT& cs) { cs.style &= ~WS_SYSMENU; //去掉系统菜单,避免XP风格窗体下,在98/2000下鼠标点击标题或菜单时,系统按钮暴露问题,jingzhou xu return CDialog::PreCreateWindow(cs); } int CDlgBaseClass::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; ModifyStyle(WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,NULL); return 0; }