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

效果:

VC++自绘界面的更多相关文章

  1. VC之美化界面(内容覆盖十分全面,经典)

    界面美化 摘要本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理: 2. 熟悉Windows消息机制,熟悉MFC的消息映射和 ...

  2. 基于VC的MFC界面开发

    教你熟悉VC6.0创建一个可视化软件的过程 UpdateData(TRUE);//将输入数据赋给文本框变量. UpdateData(FALSE);//将内容显示在文本框中 AfxMessageBox( ...

  3. 美化VC界面(用户登录界面)

    源代码:下载 VC开发程序单调的界面相信大家都是深有感触,提到界面美化编程,人们都会说做界面不要用VC写,太难了.一句俗语:难者不会,会者不难.VC的美化界面编程并没有人们想像的那么难.这篇文章是我写 ...

  4. [收藏夹整理]VC部分

    c++多线程(一) C++11 多线程 鸡啄米:C++编程入门系列之十二(类与对象:面向对象设计的基本思想和特点) 鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员) [笔记]VS ...

  5. MFC Button控件自绘

    文章参考地址:  http://blog.csdn.net/yue7603835/article/details/6649458    VC下的界面着实难看 有时候我们不得不自己进行控件的绘制 以前 ...

  6. Swift - 界面的跳转模式

    iOS开发中界面跳转有两种方式,上下跳转和左右跳转. 上下跳转_TO: let secondViewController = SecondViewController() self.presentVi ...

  7. 怎样在VC里面使用graphics.h绘图

    网上很多绘图程序和小游戏程序都是用的 TC,在 VC 下编译时提示错误:fatal error C1083: Cannot open include file: 'graphics.h': No su ...

  8. openlayers4 入门开发系列之地图标绘篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  9. 结对项目——图形界面实现与dll动态链接

    先来一发软件截图~~~ 生成题目的界面 测评界面 第三块本来准备做一个文件历史记录的界面,但是由于时间不够,暂时还没做完. 图形界面的设计与实现 由于对传统的对话框风格不太满意,所以这次作业的图形界面 ...

随机推荐

  1. T-SQL 创建、修改、删除数据库,表语法

    CREATE 语句 CREATE语句的开头都是一样的,然后是特定的细节. CREATE <object type> <object name> 一.CREATE DATABAS ...

  2. 互斥体与互锁 <第五篇>

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码“临界区”.因此,在任意时刻,只有一个线程被允许进入这 ...

  3. SqlDataReader类

    一.常用属性 名称 说明 Depth 获取一个值,用于指示当前行的嵌套深度.  FieldCount 获取当前行中的列数. HasRows 获取一个值,该值指示 SqlDataReader 是否有行. ...

  4. 如何从Eclipse导入github上的项目源码

    1.首先在github.com上申请一个账号,比如笔者的账号为puma0072.Eclipse需要安装egit插件,在Eclipse中选择help->Marketplace,在search中输入 ...

  5. 2013第51周二eclipse启动优化

    2013第51周二eclipse启动优化 今天注意到了eclipse.ini配置文件中gc.log--在eclipse启动时清空,然后记录了eclipse每次运行过程中的gc分配情况,看到了一篇很好的 ...

  6. 基于 Bootstrap 的扁平化 UI 开发包

    Flat UI是一款基于Bootstrap的扁平化前端UI工具包,Flat UI的组件外观设计非常清新和漂亮,Flat UI的组件包含按钮,输入框,组合按钮,复选框,单选按钮,标签,菜单,进度条和滑块 ...

  7. iOS 之点击按钮改变状态的图片

    .h  文件中 @property (strong, nonatomic) IBOutletUIButton *publishBtton; @property (strong, nonatomic) ...

  8. hdu 1599 find the mincost route(flyod求最小环)

    Problem Description 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1, ...

  9. SQL递归查询实现跟帖盖楼效果

    网易新闻的盖楼乐趣多,某一天也想实现诸如网易新闻跟帖盖楼的功能,无奈技术不佳(基础不牢),网上搜索了资料才发现SQL查询方法有一种叫递归查询,整理如下: 一.查询出 id = 1 的所有子结点 wit ...

  10. STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)

    向量(vector) <vector> 连续存储的元素<vector> Vector<int>c; c.back()    传回最后一个数据,不检查这个数据是否存在 ...