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

概述

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

详细

一、概述

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

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

二、演示效果图

三、核心实现方案及代码

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

四、项目代码目录结构图

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

Windows开发之VC++仿QQ迷你首页(迷你资讯)的更多相关文章

  1. Windows 开发之VC++垃圾清理程序软件

    概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...

  2. 自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页

    使用CoordinatorLayout打造各种炫酷的效果 自定义Behavior -- 仿知乎,FloatActionButton隐藏与展示 NestedScrolling 机制深入解析 一步步带你读 ...

  3. Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制)

    Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制) 首先贴上七个控制布局代码 1.title_text_sel.xml 字体颜色的切换 放到color文件夹下面 <?xm ...

  4. DarkStone - 跨平台移动应用开发之 Flex 的崛起

    我的好友Ds 发布一个flex的消息.我帮忙转发 DarkStone - 跨平台移动应用开发之 Flex 的崛起 (2013-08-20 22:28:32)     此文章由 周戈 (DarkSton ...

  5. 基于xmpp openfire smack开发之Android客户端开发[3]

    在上两篇文章中,我们依次介绍openfire部署以及smack常用API的使用,这一节中我们着力介绍如何基于asmack开发一个Android的客户端,本篇的重点在实践,讲解和原理环节,大家可以参考前 ...

  6. android软件开发之webView.addJavascriptInterface循环渐进【一】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  7. Mobile开发之meta篇

    Mobile开发之meta篇 <meta name="viewport" content="width=device-width, initial-scale=1, ...

  8. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  9. WPF仿QQ聊天框表情文字混排实现

    原文:WPF仿QQ聊天框表情文字混排实现 二话不说.先上图 图中分别有文件.文本+表情.纯文本的展示,对于同一个list不同的展示形式,很明显,应该用多个DataTemplate,那么也就需要Data ...

随机推荐

  1. Python调用C/C++程序

    编程中会遇到调用其他语言到库,这里记录一下Python调用C++. Python底层是C, 所以调用C还是比较方便.调用C++有些麻烦. Python提供了ctypes, 方便将Python类型转为C ...

  2. FastReport.Net 入门

    任何一门编程技术入门体验都是以“Hello World”开始的,但我想再复杂一点的“Hello World”,才能算真正的入门.   FastReport.Net V1.2.76 ,vs2008 在 ...

  3. LigerUi之Grid使用详解(二)——数据编辑

    一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.所以上一篇文章为大家介绍了LigerGrid的显 ...

  4. TSQL:判断某较短字符串在较长字符串中出现的次数。

    给定一个较短字符串shortStr='ab',和一个较长字符串longStr='adkdabkwelabwkereabrsdweo2342ablk234lksdfsdf1abe': 判断shortSt ...

  5. tail -f 然后grep,处理缓存的问题

    学习了:http://www.quwenqing.com/read-134.html 对日志记录做多次grep过滤输出,格式如下: tail -f log | grep xxx | grep yyy ...

  6. linux ps 命令的查看

    linux ps 命令的结果中VSZ,RSS,STAT的含义和大小 ps是linux系统的进程管理工具,相当于windows中的资源管理器的一部分功能. 一般来说,ps aux命令执行结果的几个列的信 ...

  7. 将iPhone投影到Mac上

    将iPhone投影到Mac上 有时候, 出于演示须要, 又或者嫌弃iPhone屏幕太小了, 我想把画面弄到mac上. 这时候, 就须要将iPhone投影到Mac上. 至于怎样做呢? 这就是本文要说明的 ...

  8. VC++ MFC应用程序项目文件2.cpp

    //GameServer.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "GameServer.h" #de ...

  9. SliTaz 从入门到精通

    slitaz中文化(linux-pe)项目地址: https://code.google.com/p/linux-pe/ http://bbs.wuyou.com/forum.php?mod=view ...

  10. 基于redis分布式缓存实现(新浪微博案例)转

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...