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; 
    }

    效果:

  • 相关阅读:
    高级(线性)素数筛
    Dijkstra(迪杰斯特拉)算法
    简单素数筛
    【解题报告】 POJ1958 奇怪的汉诺塔(Strange Tower of Hanoi)
    4 jQuery Chatting Plugins | jQuery UI Chatbox Plugin Examples Like Facebook, Gmail
    Web User Control Collection data is not storing
    How to turn on IE9 Compatibility View programmatically in Javascript
    从Javascrip 脚本中执行.exe 文件
    HtmlEditorExtender Ajax
    GRIDVIEW模板中查找控件的方式JAVASCRIPT
  • 原文地址:https://www.cnblogs.com/lidabo/p/3284811.html
Copyright © 2011-2022 走看看