Windows开发之VC++仿QQ迷你首页(迷你资讯)

发布时间:2018-12-18
技术: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


本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码