www.gusucode.com > C++自绘窗体的完整代码-源码程序 > C++自绘窗体的完整代码-源码程序/code/DrawDialogDlg.cpp
// DrawDialogDlg.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "DrawDialog.h" #include "DrawDialogDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDrawDialogDlg dialog CDrawDialogDlg::CDrawDialogDlg(CWnd* pParent /*=NULL*/) : CDialog(CDrawDialogDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDrawDialogDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_CapitonColor =RGB(0,0,255); m_Caption = "对话框自绘设计方案二"; m_IsMax = TRUE; } void CDrawDialogDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDrawDialogDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDrawDialogDlg, CDialog) //{{AFX_MSG_MAP(CDrawDialogDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CTLCOLOR() ON_WM_SIZE() ON_WM_NCMOUSEMOVE() ON_WM_MOUSEMOVE() ON_WM_NCLBUTTONDOWN() ON_WM_NCLBUTTONUP() ON_WM_NCACTIVATE() ON_WM_NCPAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDrawDialogDlg message handlers BOOL CDrawDialogDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon //加载背景位图 m_BKGround.LoadBitmap(IDB_BKGROUND); m_BorderHeight = GetSystemMetrics(SM_CYBORDER); m_BorderWidth = GetSystemMetrics(SM_CXBORDER); m_CaptionHeight = GetSystemMetrics(SM_CYCAPTION); SetWindowText(m_Caption); m_CaptionFont.CreateFont(14,10,0,0,600,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_ROMAN,"宋体"); CBitmap bitmap; bitmap.LoadBitmap(IDB_MINBT); BITMAPINFO bInfo; bitmap.GetObject(sizeof(bInfo),&bInfo); m_ButtonWidth = bInfo.bmiHeader.biWidth; m_ButtonHeight = bInfo.bmiHeader.biHeight; bitmap.DeleteObject(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CDrawDialogDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDrawDialogDlg::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(); } DrawDialog(); m_IsDrawForm = TRUE; } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDrawDialogDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CDrawDialogDlg::OnOK() { } HBRUSH CDrawDialogDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr; if (nCtlColor==CTLCOLOR_DLG) { //定义一个位图画刷 CBrush m_Brush(&m_BKGround); CRect rect; GetClientRect(rect); //选中画刷 pDC->SelectObject(&m_Brush); //填充客户区域 pDC->FillRect(rect,&m_Brush); return m_Brush; } else hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); return hbr; } void CDrawDialogDlg::DrawDialog(UINT Flags) { m_FrameHeight= GetSystemMetrics(SM_CYFIXEDFRAME); m_BorderHeight = GetSystemMetrics(SM_CYBORDER); m_FrameWidth= GetSystemMetrics(SM_CXFIXEDFRAME); m_BorderWidth = GetSystemMetrics(SM_CXBORDER); m_CaptionHeight = GetSystemMetrics(SM_CYCAPTION); CRect Clientrect; GetClientRect(Clientrect); CRect WinRC,FactRC; GetWindowRect(WinRC); FactRC.CopyRect(CRect(0,0,WinRC.Width(),WinRC.Height())); //获取窗口设备上下文 CWindowDC WindowDC(this); CBitmap LeftLine,*OldObj; BITMAPINFO bitinfo; CDC memDC; memDC.CreateCompatibleDC(&WindowDC); int leftwidth=0; //左标题的宽度 int rightwidth = 0; //右标题的宽度 int leftlinewidth = 0; //窗体边框和3D宽度 int rLineWidth; int bLineHeight; DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_RIGHTTITLE); //加载右标题 LeftLine.GetObject(sizeof(bitinfo),&bitinfo); rightwidth = bitinfo.bmiHeader.biWidth; LeftLine.Detach(); int x,y; //绘制左边线 //获取位图大小 if ( Flags & fLeftBar ) { DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_LEFTBAR); LeftLine.GetObject(sizeof(bitinfo),&bitinfo); LeftLine.GetObject(sizeof(bitinfo),&bitinfo); x = bitinfo.bmiHeader.biWidth; y = bitinfo.bmiHeader.biHeight; OldObj = memDC.SelectObject(&LeftLine); //判断位图的宽度与窗体边缘的宽度 leftlinewidth = (x> m_FrameWidth+m_BorderWidth)? x:m_FrameWidth+m_BorderWidth; WindowDC.StretchBlt(0,m_CaptionHeight,leftlinewidth,FactRC.Height()-m_CaptionHeight,&memDC,0,0,x,y,SRCCOPY); memDC.SelectObject(OldObj); LeftLine.Detach(); } //绘制左标题 if ( Flags & fLeftTitle) { DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_LEFTTITLE); //获取位图大小 LeftLine.GetObject(sizeof(bitinfo),&bitinfo); OldObj = memDC.SelectObject(&LeftLine); leftwidth = x = bitinfo.bmiHeader.biWidth; y = bitinfo.bmiHeader.biHeight; m_TitleDrawHeight = (m_CaptionHeight+4>y)?m_CaptionHeight+4: y; m_LTitleRc.CopyRect(CRect(0,0,x,m_TitleDrawHeight)); WindowDC.StretchBlt(m_LTitleRc.left,m_LTitleRc.top,m_LTitleRc.Width(),m_LTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY); memDC.SelectObject(OldObj); LeftLine.Detach(); } //绘制右标题 if ( Flags & fRightTitle) { DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_RIGHTTITLE); //获取位图大小 LeftLine.GetObject(sizeof(bitinfo),&bitinfo); OldObj = memDC.SelectObject(&LeftLine); x = bitinfo.bmiHeader.biWidth; y = bitinfo.bmiHeader.biHeight; m_TitleDrawHeight = (m_CaptionHeight+4>y)?m_CaptionHeight+4: y; m_RTitleRc.CopyRect(CRect(FactRC.right-x,0,FactRC.right,m_TitleDrawHeight)); WindowDC.StretchBlt(m_RTitleRc.left,m_RTitleRc.top,m_RTitleRc.Width(),m_RTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY); DeleteObject( memDC.SelectObject(OldObj)); LeftLine.Detach(); } //绘制中间标题 if ( Flags & fMidTitle) { DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_MIDTITLE); //获取位图大小 LeftLine.GetObject(sizeof(bitinfo),&bitinfo); OldObj = memDC.SelectObject(&LeftLine); x = bitinfo.bmiHeader.biWidth; y = bitinfo.bmiHeader.biHeight; m_TitleDrawHeight = (m_CaptionHeight+4>y)?m_CaptionHeight+4: y; m_MTitleRc.CopyRect(CRect(m_LTitleRc.right,0,m_RTitleRc.left,m_TitleDrawHeight)); WindowDC.StretchBlt(m_MTitleRc.left,m_MTitleRc.top,m_MTitleRc.Width(),m_MTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY); LeftLine.Detach(); memDC.SelectObject(OldObj); } //绘制右边框 if ( Flags & fRightBar) { DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_RIGHTBAR); //获取位图大小 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 & fBottomBar) { DeleteObject(LeftLine); LeftLine.LoadBitmap(IDB_BOTTOMBAR); //获取位图大小 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(); } //绘制底边框 CPoint pos(30,1); m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight)); pos.x = 55; m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight)); pos.x = 80; 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.LoadBitmap(IDB_MINBT); //获取位图大小 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.LoadBitmap(IDB_MAXBT); //获取位图大小 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.LoadBitmap(IDB_CLOSEBT); //获取位图大小 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(); } LeftLine.DeleteObject(); memDC.DeleteDC(); DrawCaption(); } void CDrawDialogDlg::DrawCaption() { 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 CDrawDialogDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CRect rect; GetClientRect(rect); CPoint pos(30,1); m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight +2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight)); pos.x = 55; m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight)); pos.x = 80; m_CloseRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight)); Invalidate(); } void CDrawDialogDlg::OnNcMouseMove(UINT nHitTest, CPoint point) { CRect tempMin,tempMax,tempClose,ClientRect; CWindowDC WindowDC (this);//= GetWindowDC(); CDC memDC; memDC.CreateCompatibleDC(&WindowDC); BITMAPINFO bInfo; CBitmap LeftLine; int x,y; GetWindowRect(ClientRect); tempMin.CopyRect(CRect(m_MinRect.left+ ClientRect.left,ClientRect.top+m_MinRect.top,m_MinRect.right+m_MinRect.left+ ClientRect.left,m_MinRect.bottom+m_MinRect.top+ClientRect.top)); tempMax.CopyRect(CRect(m_MaxRect.left+ ClientRect.left,ClientRect.top+m_MaxRect.top,m_MaxRect.right+m_MaxRect.left+ ClientRect.left,m_MaxRect.bottom+m_MaxRect.top+ClientRect.top)); tempClose.CopyRect(CRect(m_CloseRect.left+ ClientRect.left,ClientRect.top+m_CloseRect.top,m_CloseRect.right+m_CloseRect.left+ ClientRect.left,m_CloseRect.bottom+m_CloseRect.top+ClientRect.top)); if(tempMin.PtInRect(point)) //鼠标在最小化按钮上移动时,更改按钮显示的位图 { if (m_ButtonState!= bsMin) { LeftLine.LoadBitmap(IDB_MINHOTBT); LeftLine.GetObject(sizeof(bInfo),&bInfo); x = bInfo.bmiHeader.biWidth; y = bInfo.bmiHeader.biHeight; memDC.SelectObject(&LeftLine); WindowDC.StretchBlt(m_MinRect.left,m_MinRect.top,m_MinRect.right,m_MinRect.bottom,&memDC,0,0,x,y,SRCCOPY); m_IsDrawForm = FALSE; m_ButtonState = bsMin; LeftLine.Detach(); } } else if (tempMax.PtInRect(point)) { if (m_ButtonState !=bsMax && m_ButtonState!=bsRes) { LeftLine.LoadBitmap(IDB_MAXHOTBT); LeftLine.GetObject(sizeof(bInfo),&bInfo); x = bInfo.bmiHeader.biWidth; y = bInfo.bmiHeader.biHeight; memDC.SelectObject(&LeftLine); WindowDC.StretchBlt(m_MaxRect.left,m_MaxRect.top,m_MaxRect.right,m_MaxRect.bottom,&memDC,0,0,x,y,SRCCOPY); m_IsDrawForm = FALSE; if (m_IsMax) { m_ButtonState = bsMax; } else { m_ButtonState = bsRes; } LeftLine.Detach(); } } else if (tempClose.PtInRect(point)) { if (m_ButtonState != bsClose) { LeftLine.LoadBitmap(IDB_CLOSEHOTBT); LeftLine.GetObject(sizeof(bInfo),&bInfo); x = bInfo.bmiHeader.biWidth; y = bInfo.bmiHeader.biHeight; memDC.SelectObject(&LeftLine); WindowDC.StretchBlt(m_CloseRect.left,m_CloseRect.top,m_CloseRect.right,m_CloseRect.bottom,&memDC,0,0,x,y,SRCCOPY); m_IsDrawForm = FALSE; m_ButtonState = bsClose; LeftLine.Detach(); } } else { if (m_IsDrawForm==FALSE) { if (m_ButtonState==bsMin) DrawDialog( fMinButton); else if (m_ButtonState==bsClose) DrawDialog( fCloseButton); else if (m_ButtonState==bsMax||m_ButtonState==bsRes) DrawDialog( fMaxButton); } m_ButtonState = bsNone; } LeftLine.DeleteObject(); ReleaseDC(&memDC); CDialog::OnNcMouseMove(nHitTest, point); } void CDrawDialogDlg::OnMouseMove(UINT nFlags, CPoint point) { if (m_ButtonState != bsNone) { if (m_ButtonState==bsMin) DrawDialog( fMinButton); else if (m_ButtonState==bsClose) DrawDialog( fCloseButton); else if (m_ButtonState==bsMax||m_ButtonState==bsRes) DrawDialog( fMaxButton); m_ButtonState = bsNone; } CDialog::OnMouseMove(nFlags, point); } void CDrawDialogDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) { switch (m_ButtonState) { case bsClose: //关闭窗口 { OnCancel(); } break; case bsMin: { ShowWindow(SW_SHOWMINIMIZED); } 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 CDrawDialogDlg::OnNcLButtonUp(UINT nHitTest, CPoint point) { // TODO: Add your message handler code here and/or call default CDialog::OnNcLButtonUp(nHitTest, point); } BOOL CDrawDialogDlg::OnNcActivate(BOOL bActive) { OnPaint() ; return TRUE; } void CDrawDialogDlg::OnNcPaint() { }