zoukankan      html  css  js  c++  java
  • VC++自绘界面

    // MySkinDlg.cpp : implementation file 
    //

    #include "stdafx.h" 
    #include "MySkin.h" 
    #include "MySkinDlg.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()

    ///////////////////////////////////////////////////////////////////////////// 
    // CMySkinDlg dialog

    CMySkinDlg::CMySkinDlg(CWnd* pParent /*=NULL*/) 
        : CDialog(CMySkinDlg::IDD, pParent) 
    { 
        //{{AFX_DATA_INIT(CMySkinDlg) 
            // 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_ShowTitle = TRUE; 
    }

    void CMySkinDlg::DoDataExchange(CDataExchange* pDX) 
    { 
        CDialog::DoDataExchange(pDX); 
        //{{AFX_DATA_MAP(CMySkinDlg) 
            // NOTE: the ClassWizard will add DDX and DDV calls here 
        //}}AFX_DATA_MAP 
    }

    BEGIN_MESSAGE_MAP(CMySkinDlg, CDialog) 
        //{{AFX_MSG_MAP(CMySkinDlg) 
        ON_WM_SYSCOMMAND() 
        ON_WM_PAINT() 
        ON_WM_QUERYDRAGICON() 
        ON_WM_NCLBUTTONDOWN() 
        ON_WM_NCMOUSEMOVE() 
        //}}AFX_MSG_MAP 
    END_MESSAGE_MAP()

    ///////////////////////////////////////////////////////////////////////////// 
    // CMySkinDlg message handlers

    BOOL CMySkinDlg::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 
        
        // TODO: Add extra initialization here 
        
        return TRUE;  // return TRUE  unless you set the focus to a control 
    }

    void CMySkinDlg::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 CMySkinDlg::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 CMySkinDlg::OnQueryDragIcon() 
    { 
        return (HCURSOR) m_hIcon; 
    }

    LRESULT CMySkinDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        // TODO: Add your specialized code here and/or call the base class 
        LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam); 
        
        if (!::IsWindow(m_hWnd)) 
            return lrst; 
        
        if (message==WM_MOVE|| 
            message==WM_PAINT|| 
            message==WM_NCPAINT|| 
            message==WM_NCACTIVATE|| 
            message == WM_NOTIFY) 
        { 
            CDC* pWinDC = GetWindowDC(); 
            if (pWinDC) 
                DrawTitleBar(pWinDC); 
            ReleaseDC(pWinDC); 
        } 
        return lrst; 
    }

    void CMySkinDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
    { 
        // TODO: Add your message handler code here and/or call default 
        CRect rtWnd; 
        GetWindowRect(&rtWnd); 
        
        //mouse坐标转化为本窗口坐标 重要 
        point.x = point.x – rtWnd.left; 
        point.y = point.y – rtWnd.top; 
        //检测各按钮是否按到 
        if (m_rtButtExit.PtInRect(point)) 
        { 
            SendMessage(WM_CLOSE); 
        } 
        else 
        { 
            if (m_rtButtMin.PtInRect(point)) 
            { 
                m_ShowTitle = FALSE; 
                SendMessage(WM_SYSCOMMAND, 
                    SC_MINIMIZE, 
                    MAKELPARAM(point.x, point.y)); 
            } 
            else 
            { 
                if (m_rtButtMax.PtInRect(point)) 
                { 
                    m_ShowTitle = TRUE; 
                    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 
                { 
                    if (!IsZoomed()) 
                    { 
                        Default(); 
                    } 
                } 
            } 
        }

        CDialog::OnNcLButtonDown(nHitTest, point); 
    }

    void CMySkinDlg::OnNcMouseMove(UINT nHitTest, CPoint point) 
    { 
        // TODO: Add your message handler code here and/or call default 
        CDC* pDC = GetWindowDC(); 
        CDC* pDisplayMemDC=new CDC; 
        pDisplayMemDC->CreateCompatibleDC(pDC); 
        CBitmap* pBitmap = new CBitmap; 
        CBitmap* pOldBitmap; 
        CRect rtWnd, rtButton; 
        
        if (pDC) 
        { 
    //        CString StrTemp = ""; 
            GetWindowRect(&rtWnd); 
            //mouse坐标转化为本窗口坐标 重要 
            point.x = point.x – rtWnd.left; 
            point.y = point.y – rtWnd.top; 
            //判断mouse是否移到系统按钮上 
            if (m_rtButtExit.PtInRect(point)) 
            { 
                pBitmap->LoadBitmap(IDB_EXIT_FOCUS); 
    //            StrTemp = _T("关闭"); 
            } 
            else 
            { 
                if(m_rtButtMin.PtInRect(point)) 
                { 
                    pBitmap->LoadBitmap(IDB_MIN_FOCUS); 
    //                StrTemp = _T("最小化窗口"); 
                } 
                else 
                { 
                    if(m_rtButtMax.PtInRect(point)) 
                    { 
                        pBitmap->LoadBitmap(IDB_MAX_FOCUS); 
                        if(IsZoomed()) 
                        { 
    //                        StrTemp = _T("还原窗口"); 
                        } 
                        else 
                        { 
    //                        StrTemp = _T("最化大窗口"); 
                        } 
                    } 
                    else 
                    { 
                        pBitmap->LoadBitmap(IDB_NORMAL); 
                    } 
                } 
            } 
            
            rtButton = m_rtButtMin; 
            BITMAP BmpInfo; 
            pBitmap->GetBitmap(&BmpInfo); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            pDC->BitBlt(rtButton.left-6, 
                rtButton.top-2, 
                BmpInfo.bmWidth, 
                BmpInfo.bmHeight, 
                pDisplayMemDC, 
                0, 
                0, 
                SRCCOPY); 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            CRect ShowTipRec; 
            ShowTipRec = m_rtButtMin; 
    /*        if(!StrTemp.IsEmpty()) 
            { 
                // ScreenToClient(&ShowTipRec); 
                //  m_ToolTip.AddToolTip(IDD_TITLEBAR_DIALOG,&ShowTipRec,StrTemp); 
                // m_ToolTip.SetDelayTime(200); 
            }*/ 
        } 
        
        ReleaseDC(pDisplayMemDC); 
        ReleaseDC(pDC); 
        delete pDisplayMemDC; 
        delete pBitmap;

        CDialog::OnNcMouseMove(nHitTest, point); 
    }

    BOOL CMySkinDlg::DrawTitleBar(CDC *pDC) 
    { 
        if (m_hWnd) 
        { 
            CBrush Brush(RGB(0,100,255)); 
            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); 
            
            //计算最小化按钮的位置,位图大小为15X15 
            rtButtons.left = rtTitle.right-60; 
            rtButtons.top= rtTitle.top+2; 
            rtButtons.right = rtTitle.right-42; 
            rtButtons.bottom = rtTitle.top+20; 
            m_rtButtMin = rtButtons; 
            //计算最大化按钮的位置,位图大小为15X15 
            m_rtButtMax.left = m_rtButtMin.left + 18; 
            m_rtButtMax.top = m_rtButtMin.top; 
            m_rtButtMax.right = m_rtButtMin.right + 16; 
            m_rtButtMax.bottom = m_rtButtMin.bottom; 
            //计算关闭按钮的位置 
            m_rtButtExit.left = m_rtButtMax.left + 18; 
            m_rtButtExit.top =  m_rtButtMax.top; 
            m_rtButtExit.right = m_rtButtMax.right + 16; 
            m_rtButtExit.bottom = m_rtButtMax.bottom; 
            
            //准备 
            CBitmap* pBitmap = new CBitmap; 
            BITMAP BmpInfo; 
            CBitmap* pOldBitmap; 
            CDC* pDisplayMemDC=new CDC; 
            pDisplayMemDC->CreateCompatibleDC(pDC); 
            
            //重画Caption 
            POINT  DrawPonit; 
            DrawPonit.x = rtTitle.left-4; 
            DrawPonit.y = rtTitle.top-4; 
            pBitmap->LoadBitmap(IDB_TITLE_LEFT); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            pBitmap->GetBitmap(&BmpInfo); 
            pDC->BitBlt(rtTitle.left-4, 
                rtTitle.top-4, 
                BmpInfo.bmWidth, 
                BmpInfo.bmHeight, 
                pDisplayMemDC, 
                0, 
                0, 
                SRCCOPY); 
            DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth; 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            pBitmap->LoadBitmap(IDB_TOP); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            pBitmap->GetBitmap(&BmpInfo); 
            while(DrawPonit.x<= m_rtButtMin.left-66) 
            { 
                pDC->BitBlt(DrawPonit.x, 
                    DrawPonit.y, 
                    BmpInfo.bmWidth, 
                    BmpInfo.bmHeight, 
                    pDisplayMemDC, 
                    0, 
                    0, 
                    SRCCOPY); 
                DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth; 
            } 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            pBitmap->LoadBitmap(IDB_TITLE_RIGHT); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            pBitmap->GetBitmap(&BmpInfo); 
            pDC->BitBlt(DrawPonit.x, 
                DrawPonit.y, 
                BmpInfo.bmWidth, 
                BmpInfo.bmHeight, 
                pDisplayMemDC, 
                0, 
                0, 
                SRCCOPY); 
            
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            
            
            //重画最小化button 
            rtButtons = m_rtButtMin; 
            pBitmap->LoadBitmap(IDB_NORMAL); 
            pBitmap->GetBitmap(&BmpInfo); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            pDC->BitBlt(rtButtons.left-6, 
                rtButtons.top-2, 
                BmpInfo.bmWidth, 
                BmpInfo.bmHeight, 
                pDisplayMemDC, 
                0, 
                0, 
                SRCCOPY); 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            int nOldMode = pDC->SetBkMode(TRANSPARENT); 
            COLORREF clOldText=pDC->GetTextColor(); 
            CFont titleFont; 
            titleFont.CreateFont( 12, // nHeight 
                8, // nWidth 
                0, // nEscapement文本行逆时针旋转角度 
                0, // nOrientation字体角度 
                FW_BOLD, // nWeight字体粗细程度 
                FALSE, // bItalic 
                FALSE, // bUnderline 
                0, // cStrikeOut 删除线 
                ANSI_CHARSET, // nCharSet 
                OUT_DEFAULT_PRECIS, // nOutPrecision 
                CLIP_DEFAULT_PRECIS, // nClipPrecision 
                DEFAULT_QUALITY, // nQuality 
                DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
                _T("隶书"));// lpszFac pDC->SelectStockObject(SYSTEM_FIXED_FONT); 
            CFont *OldFont; 
            OldFont = pDC->SelectObject(&titleFont); 
            CString m_StrTitle; 
            GetWindowText(m_StrTitle); 
            pDC->SetTextColor(RGB(80,255,25)); 
            if(m_ShowTitle) 
            { 
                pDC->TextOut(65,10,m_StrTitle); 
            } 
            else 
            {   
                m_StrTitle = m_StrTitle.Left(6); 
                m_StrTitle += "…"; 
                pDC->TextOut(30,10,m_StrTitle); 
            } 
            pDC->SetBkMode(nOldMode); 
            pDC->SetTextColor(clOldText); 
            pDC->SelectObject(OldFont); 
            //pDC->TextOut(60,60,m_StrTitle); 
            //重画左边框 
            pBitmap->LoadBitmap(IDB_LEFTDOWN); 
            pBitmap->GetBitmap(&BmpInfo); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            int i ; 
            for (i= 20;i<=rtWnd.bottom;i=i+BmpInfo.bmHeight-3) 
            { 
                pDC->BitBlt(0, rtButtons.top+i, 
                    BmpInfo.bmWidth, 
                    BmpInfo.bmHeight, 
                    pDisplayMemDC, 
                    0, 
                    0, 
                    SRCCOPY); 
            } 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            //重画右边框 
            pBitmap->LoadBitmap(IDB_RIGHTDOWN); 
            pBitmap->GetBitmap(&BmpInfo); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            GetClientRect(&rtWnd); 
            for (i= 25;i<=rtWnd.bottom+27;i=i+BmpInfo.bmHeight-3) 
            { 
                pDC->BitBlt(rtWnd.right, i, 
                    BmpInfo.bmWidth, 
                    BmpInfo.bmHeight, 
                    pDisplayMemDC, 
                    0, 
                    0, 
                    SRCCOPY); 
            } 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            //重画底边框 
            pBitmap->LoadBitmap(IDB_DOWN); 
            pBitmap->GetBitmap(&BmpInfo); 
            pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
            GetClientRect(&rtWnd); 
            for (i= 9; i<=rtWnd.right; i=i+2) 
            { 
                GetClientRect(&rtWnd); 
                pDC->BitBlt(i,rtWnd.bottom+26, 
                    BmpInfo.bmWidth, 
                    BmpInfo.bmHeight, 
                    pDisplayMemDC, 
                    0, 
                    0, 
                    SRCCOPY); 
            } 
            pDisplayMemDC->SelectObject(pOldBitmap); 
            pBitmap->DeleteObject(); 
            
            
            ReleaseDC(pDisplayMemDC); 
            delete pDisplayMemDC; 
            delete pBitmap; 
    }

    return TRUE; 
    }

    效果:

  • 相关阅读:
    ImageView的属性android:scaleType作用
    android程序内存泄漏的原因和解决办法
    如何在Android使用Rest服务从客户端调用webservice
    android系统如何自适应屏幕大小
    使用GitHub进行版本管理
    Android中dp、sp、px的转换和区别。
    软件开发:手机应用程序开发注意事项
    学用MVC4做网站二:2.2添加用户组
    学用MVC4做网站二:2.1浏览用户组
    学用MVC4做网站二:2.4删除用户组
  • 原文地址:https://www.cnblogs.com/lidabo/p/3284811.html
Copyright © 2011-2022 走看看