zoukankan      html  css  js  c++  java
  • Windows开发之VC++仿QQ迷你首页(迷你资讯)

    技术:VC++,MFC,WTL,,C++,Windows
     

    概述

    之前由于需求和兴趣,需要实现类似QQ迷你资讯首页的东西,看起来很酷,于是就写了个实现方案,主要还是基于WIndows C++ 和MFC技术开发实现,希望对大家有所帮助

    详细

    一、概述

    由于需求和个人兴趣,需要写个类似QQ迷你资讯首页的东西,觉得挺酷的,就花了一点时间写了写,

    主要还是基于WIndows C++ 和MFC技术开发实现

    二、演示效果图

    41.png

    三、核心实现方案及代码

    3.1 实现方案和流程:

    (1)首先确定窗体尺寸大小,以及边框等自定义绘制UI,包括标题栏等UI,Icon,

    以及windows的尺寸大小等

    (2)实现迷你资讯页面加载功能,资讯页面是个Html页面,通过webview技术加载html网页

    ,实现实时展现迷你资讯网页功能,当然这部分也可以做成版本控制,不同版本不同的

    迷你资讯,同时也可以做成推荐个性化的.这部分内容开发者自行补充.

    (3)事件Action的处理:主要包括键盘事件的监听处理以及鼠标事件的监听处理

    ,同时处理链接跳转功能,主要是基于webview自身的技术支持,实现窗体内自动跳转.

    (4)最后需要通过对用画刷对颜色背景进下处理,从而实现对UI的渲染和刷新处理

    3.2 主要核心代码:

    void CMiniNewsDlg::DrawDialog()
    {
        m_nFrameCY = GetSystemMetrics(SM_CYFIXEDFRAME);//获取对话框边框的高度
        m_nFrameCX = GetSystemMetrics(SM_CXDLGFRAME);//获取对话边框的宽度
        if(GetStyle()&WS_BORDER)//获取对话框是否有边框
        {
            m_nBorderCY = GetSystemMetrics(SM_CYBORDER) + m_nFrameCY;
            m_nBorderCX = GetSystemMetrics(SM_CXBORDER) +m_nFrameCX; 
        }
        else
        {       
            m_nBorderCY = m_nFrameCY;
            m_nBorderCX = m_nFrameCX;
        }
        m_nTitleBarCY = GetSystemMetrics(SM_CYCAPTION) + m_nBorderCY;//计算标题栏高度
        m_nTitleBarCX =m_nBorderCX;
     
        CRect winRect,factRect;
        GetWindowRect(&winRect);
        factRect.CopyRect(CRect(0,0,winRect.Width(),winRect.Height()));
        CWindowDC windowsDC(this);//获取窗口设备上下文
        //获取整个MFC窗口的高度和宽度
        m_nWinWidth = winRect.Width();
        m_nWinHeight = winRect.Height();
        //绘制对话框标题栏位图    
        DisplayBmp(0,0,m_nWinWidth,m_nTitleBarCY,IDB_LEFTTITLE);
        //绘制对话框标题栏左端的logo图标
        DisplayBmp(3,0,26,m_nTitleBarCY,IDB_APPICON);
     
        //绘制对话框左边框位图
        DisplayBmp(0,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_LEFTBAR);
        //绘制对话框底边框位图
        DisplayBmp(m_nBorderCX,m_nWinHeight-m_nBorderCX,m_nWinWidth-2*m_nBorderCX,m_nBorderCX,IDB_BOTTOMBAR);
        //绘制对话框左边框位图
        DisplayBmp(m_nWinWidth-m_nBorderCX,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_RIGHTBAR);
        //给对话框绘制最小化按钮
        DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN1);
        //给对话框绘制关闭按钮
        DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
     
        DrawTitleText();
        ReleaseDC(&windowsDC);
    }
    //=====================在指定位置显示bmp位图图像
    void CMiniNewsDlg::DisplayBmp(int x,int y,int w,int h,int nID)
    {
        CRect winRC;
        CDC* pDC=GetWindowDC();
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        BITMAPINFO bmpInfo;
        CBitmap bmp;    
        GetWindowRect(&winRC);
        bmp.LoadBitmap(nID);
        bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);
        int nBmpCX = bmpInfo.bmiHeader.biWidth;
        int nBmpCY = bmpInfo.bmiHeader.biHeight;
        memDC.SelectObject(bmp);
        pDC->StretchBlt(x,y,w,h,
            &memDC,0,0,nBmpCX,nBmpCY,SRCCOPY);//在窗口中绘制位图
        bmp.DeleteObject();
        ReleaseDC(pDC);
    }
    void CMiniNewsDlg::SetTitleText(CString strTitle)
    {
        this->m_strTitle = strTitle + "-迷你资讯网";
    }
    //绘制标题栏标题文本内容
    void CMiniNewsDlg::DrawTitleText()
    {
     
        CDC* pDC= GetWindowDC();
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetTextColor(RGB(255,255,255));
        pDC->SetTextAlign(TA_CENTER);
        CRect rect;
        GetClientRect(&rect);
        CSize szText = pDC->GetTextExtent(m_strTitle);
        CFont* font,*fOldFont;
        font = new CFont;
        font->CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,
            OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,_T("宋体"));
        fOldFont = pDC->SelectObject(font);
        CRect winRect;
        GetWindowRect(&winRect);
        pDC->TextOut(winRect.Width()/2,6.5,m_strTitle);
        pDC->SelectObject(fOldFont);
        ReleaseDC(pDC);
    }
     
    void CMiniNewsDlg::OnNcPaint()
    {
        // TODO: 在此处添加消息处理程序代码
        DrawDialog();
        // 不为绘图消息调用 CDialog::OnNcPaint()
    }
     
    void CMiniNewsDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
    {
        CDialog::OnActivate(nState, pWndOther, bMinimized);
        OnNcPaint();
        // TODO: 在此处添加消息处理程序代码
    }
     
    void CMiniNewsDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        CRect minRC,moreRC,closeRC,winRC,cleanRC,toolkitRC,shoppingRC;
        GetWindowRect(&winRC);
        closeRC.CopyRect(CRect(m_nWinWidth-26,0,m_nWinWidth-26+26,26));     
        minRC.CopyRect(CRect(m_nWinWidth-26*2,0,m_nWinWidth-26*2+26,26));
     
        point.Offset(-winRC.left,-winRC.top);//由于point为屏幕坐标,这里将其转换为窗口坐标
        if(closeRC.PtInRect(point))//鼠标在关闭按钮上时,更改按钮显示的位图
        {
            m_bMouseOnCloseBtn = TRUE;
            m_bMouseOnMinBtn =FALSE;
            m_bMouseOnMoreBtn = FALSE;
            DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN2);
            DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN1);
        }
        else if(minRC.PtInRect(point))//鼠标在最小化按钮上时,更改按钮显示的位图
        {
            m_bMouseOnMinBtn =TRUE; 
            m_bMouseOnCloseBtn = FALSE;
            DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
            DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN2);     
        }
        CDialog::OnNcMouseMove(nHitTest, point);
    }
    void CMiniNewsDlg::OnNcLButtonUp(UINT nHitTest, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        if(m_bMouseOnCloseBtn)
        {
            this->SendMessage(WM_CLOSE);
        }
        if(m_bMouseOnMinBtn)
        {
            this->ShowWindow(SW_MINIMIZE);
            m_bMouseOnMinBtn = FALSE;
        }
        CDialog::OnNcLButtonUp(nHitTest, point);
    }
     
    void CMiniNewsDlg::OnNcMouseLeave()
    {
        // 该功能要求使用 Windows 2000 或更高版本。
        // 符号 _WIN32_WINNT 和 WINVER 必须 >= 0x0500。
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN1);
        DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
        m_bMouseOnMinBtn =FALSE;    
        m_bMouseOnCloseBtn = FALSE;
        CDialog::OnNcMouseLeave();
    }
     
    void CMiniNewsDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        if(!(m_bMouseOnMinBtn||m_bMouseOnCloseBtn))
            CDialog::OnNcLButtonDown(nHitTest, point);
    }
     
    HBRUSH CMiniNewsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
     
        // TODO:  在此更改 DC 的任何属性
        HBRUSH brush=CreateSolidBrush(m_bkColor);
        switch(nCtlColor)
        {
        case CTLCOLOR_STATIC:
            pDC->SetBkMode(TRANSPARENT); 
            //设置背景为透明
            pDC->SetTextColor(RGB(255,255,255)); //设置字体颜色
            pDC->SetBkColor(m_bkColor);
            //pWnd->SetFont(cFont); //设置字体
            hbr = (HBRUSH)brush;
            //创建画刷
            break;
        case CTLCOLOR_BTN:
            pDC->SetBkMode(TRANSPARENT); 
            //设置背景为透明
            pDC->SetTextColor(RGB(255,255,255)); //设置字体颜色
            pDC->SetBkColor(m_bkColor);
            //pWnd->SetFont(cFont); //设置字体
            hbr = (HBRUSH)brush;
            //创建画刷
            break;
     
        }
     
        // TODO:  如果默认的不是所需画笔,则返回另一个画笔
        return hbr;
    }

    四、项目代码目录结构图

    42.jpg

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    PyQt(Python+Qt)学习随笔:QDial刻度盘部件功能简介
    PyQt(Python+Qt)学习随笔:QSlider滑动条部件功能简介
    PyQt(Python+Qt)学习随笔:QScrollBar以及QAbstractSlider滚动条部件功能详解
    第15.43节、PyQt输入部件:QAbstractSpinBox派生类QSpinBox、 QDoubleSpinBox、QDateTimeEdit、QDateEdit和QTimeEdit功能简介
    第三十六章、PyQt输入部件:QAbstractSpinBox派生类QSpinBox、 QDoubleSpinBox、QDateTimeEdit、QDateEdit和QTimeEdit
    PyQt(Python+Qt)学习随笔:QDateEdit日期编辑部件和QTimeEdit时间编辑部件
    程序员求职之道(《程序员面试笔试宝典》)之面试官箴言?
    程序员求职之道(《程序员面试笔试宝典》)之面试心得交流?
    程序员求职之道(《程序员面试笔试宝典》)之企业面试笔试攻略(互联网)?
    程序员求职之道(《程序员面试笔试宝典》)之面试笔试技巧?
  • 原文地址:https://www.cnblogs.com/demodashi/p/10503336.html
Copyright © 2011-2022 走看看