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

概述

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

详细

代码下载:http://www.demodashi.com/demo/14683.html

一、概述

由于需求和个人兴趣,需要写个类似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;
}

四、项目代码目录结构图

代码下载:http://www.demodashi.com/demo/14683.html

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

转载于:https://www.cnblogs.com/demodashi/p/10503336.html

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

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

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

  2. Android开发之PopupWindow仿QQ自定义弹窗

    截图图 1.自定义弹窗布局confirm_dialog.xml <?xml version="1.0" encoding="utf-8"?> < ...

  3. VC 仿QQ窗口靠边自动收缩隐藏效果

    一.观察 模仿前最重要的一步就是观察,经过半天对QQ的摆弄和摸索,总结出了以下一些特点: 1.窗口开始粘附时,检测的是鼠标坐标与桌面边界的距离,特别地,粘附在下面的时候,检测的是与任务栏的距离: 2. ...

  4. 背景固定,内容滑动效果 - 仿QQ下载首页

    效果 今天看了 IAM QQ 的首页感觉非常漂亮,所以模仿着去实现下效果. 其实最重要的一个属性就是background-attachment. 废话少说,贴图贴代码. 源码下载 代码 <!DO ...

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

    前言 记得两年前的时候,曾写过自定义 behavior 的文章 自定义 Behavior -仿新浪微博发现页的实现,到现在差不多有一万多的阅读量吧. image 今天,对该 behavior 进行升级 ...

  6. VC++仿QQ自动伸缩窗口

    某天在论坛上看到有人发帖询问QQ自动伸缩窗口是怎么实现的,我也好想知道,于是到百度一搜索,结果不多,来来去去都是那几篇,下载那些demo运行一下,发觉效果与QQ相差很大,于是决定自己动手做个,要求要近 ...

  7. android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id(修改版)

    首先注明该文章是借签别人的博客,原文博文地址点击打开链接 android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id 这个需求来源:本人做集成环信聊天时,项目需要@功能 ...

  8. C++实现聊天程序(仿QQ程序)工具源代码!

    这是一个VC++仿QQ.MSN界面控件的Demo源码,窗体很漂亮,不过现在控件是DLL文件,还没有开源,本程序主要是以本控件展开编程,主要演示控件所能实现的界面效果,仅供参考. 项目展示: 代码展示: ...

  9. Android开发之仿QQ表情实现(上)

    大家晚上好,,小鹿又来了..最近小鹿特别忙,忙到没时间发表博客了(注:以下内容过于简单请大家不要喷,仅提供初学者学习) 今天发表两篇文章,分别是讲解模拟QQ表情的实现,先给大家看效果图,,,, 开始了 ...

  10. 安卓开发之用RecyclerView做陈列式布局(仿小红书首页/淘宝商品浏览)

    安卓开发之用RecyclerView做陈列式布局 一.使用RecyclerView要先导入recyclerview-v7库 二.在layout文件夹内,新建一个xml文件,编写你要展示的item的样式 ...

最新文章

  1. python中的数据包处理模块scapy调研笔记
  2. Linux下安装rabbitmq3.7.8
  3. CDQZ集训DAY8 日记
  4. opendolphin_使用DolphinDB进行机器学习
  5. OpenGL 几何着色器细分的实例
  6. try catch对异常进行输出到日志、_java安全编码指南之:异常处理
  7. model模型php,thinkphp的model模型的设计经验总结
  8. Asp.Net MVC4入门指南(5):从控制器访问数据模型
  9. udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?
  10. 写给学弟们编程入门时必须掌握的HTTP基础知识总结
  11. 学习哪一款EDA软件画PCB电路板比较好?AD、PADS与Allegro的比较
  12. 2021年中国茶叶电商发展现状及未来发展趋势分析[图]
  13. Java如何避免空指针异常?
  14. Designing Network Design Spaces
  15. 2006-09-28 墨子的双眼皮
  16. 逻辑的计算进路--从莱布尼茨到图灵的逻辑发展
  17. C陷阱篇之char的默认符号
  18. 上三角的输出 方阵的主对角线之上称为“上三角”。
  19. 医学主题词表(Medical Subject Headings, MeSH)
  20. windows和linux服务器哪个好?有哪些区别?

热门文章

  1. 往年计算机二级在线查询,2012年计算机二级查询
  2. git小乌龟的安装和使用教程
  3. noob的第一步——基于51单片机的指纹密码锁
  4. 【参会指南】PPP全球数字资产投资峰会之金融科技区块链支持可持续发展
  5. 2019海康威视内推
  6. 人工智能在药物不良反应预测中的应用
  7. 刷题一个半月,一口气拿下腾讯、华为、Oppo 、微软7个大厂offer,字节跳动薪资涨幅60%!...
  8. Serial Scope——基于QCustomPlot的串口虚拟示波器开发过程
  9. 怎么用matlab画误差椭圆,基于MATLAB的导线网平差软件设计及误差椭圆的绘制.docx...
  10. Codeforces Round #545 (Div. 2) C. Skyscrapers