VC++自绘界面

简介: // MySkinDlg.cpp : implementation file // #include "stdafx.h" #include "MySkin.h" #include "MySkinDlg.

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

效果:

目录
相关文章
|
4月前
|
数据可视化 编译器 程序员
【好一朵美丽的玫瑰花】(C++代码实现+EasyX图形化界面)
【好一朵美丽的玫瑰花】(C++代码实现+EasyX图形化界面)
36 0
|
5月前
|
C++
c++搭建的车道线和路牌的识别系统 使用qt界面
c++搭建的车道线和路牌的识别系统 使用qt界面
27 0
|
8月前
|
C++ 计算机视觉 Python
Qt+C++窗体界面中英文语言切换
这篇博客针对<<Qt+C++窗体界面中英文语言切换>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
91 0
|
数据可视化 程序员 编译器
【好一朵美丽的玫瑰花】(C++代码实现+EasyX图形化界面)
以程序员的方式撒狗粮,专业浪漫,值得拥有!为您展示一朵迷人的七夕玫瑰花
359 0
【好一朵美丽的玫瑰花】(C++代码实现+EasyX图形化界面)
|
图形学 C++ Windows
C++ | GDI+绘制界面
界面除了拖控件贴图,最根本的要学会绘制界面
294 0
|
机器学习/深度学习 C++ Windows
C++彩色数据流动界面
一个数据流动界面     #include #include #include #include #include #include using namespace std ; #define MAX 20 #define LEN 5 char t...
736 0
|
程序员 C++ Windows
windows下VC界面 DIY系列1----写给想要写界面的C++程序员的话
        很早就想写关于C++ UI开发的一系列博文,博客专栏刚审核通过,就马上开始刷博文,不能辜负自己的一番热血,我并不是写界面的高手,只想通过写博文提高我自己的技术积累,也顺便帮助大家解决界面开发的瓶颈。
1339 0
|
C++
C++编写绚丽的界面
最近项目特别的操蛋,要用C++写出各种变态界面,今晚上赶工总算有了一点小的收货。 由于没有时间去写博文 ,等项目期完了  准备 写一系列 如何在C++/win32/mfc开发高质量  可扩展界面组建 下面这个界面就可以通过  配置文件 直接配置不同页面 不同按钮组  支持四态八态图。
670 0
|
C++
VC++的菜单控制和自绘菜单
菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态  需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值),工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项。
842 0