由于需求,需要写个类似QQ迷你资讯首页的东西,就花了一点时间写了写,软件效果截图如下:

程序的主要核心代码如下:

程序的全部源代码下载地址http://download.csdn.net/download/jczmdeveloper/6953161

  1. void CMiniNewsDlg::DrawDialog()
  2. {
  3. m_nFrameCY = GetSystemMetrics(SM_CYFIXEDFRAME);//获取对话框边框的高度
  4. m_nFrameCX = GetSystemMetrics(SM_CXDLGFRAME);//获取对话边框的宽度
  5. if(GetStyle()&WS_BORDER)//获取对话框是否有边框
  6. {
  7. m_nBorderCY = GetSystemMetrics(SM_CYBORDER) + m_nFrameCY;
  8. m_nBorderCX = GetSystemMetrics(SM_CXBORDER) +m_nFrameCX;
  9. }
  10. else
  11. {
  12. m_nBorderCY = m_nFrameCY;
  13. m_nBorderCX = m_nFrameCX;
  14. }
  15. m_nTitleBarCY = GetSystemMetrics(SM_CYCAPTION) + m_nBorderCY;//计算标题栏高度
  16. m_nTitleBarCX =m_nBorderCX;
  17.  
  18. CRect winRect,factRect;
  19. GetWindowRect(&winRect);
  20. factRect.CopyRect(CRect(0,0,winRect.Width(),winRect.Height()));
  21. CWindowDC windowsDC(this);//获取窗口设备上下文
  22. //获取整个MFC窗口的高度和宽度
  23. m_nWinWidth = winRect.Width();
  24. m_nWinHeight = winRect.Height();
  25. //绘制对话框标题栏位图
  26. DisplayBmp(0,0,m_nWinWidth,m_nTitleBarCY,IDB_LEFTTITLE);
  27. //绘制对话框标题栏左端的logo图标
  28. DisplayBmp(3,0,26,m_nTitleBarCY,IDB_APPICON);
  29.  
  30. //绘制对话框左边框位图
  31. DisplayBmp(0,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_LEFTBAR);
  32. //绘制对话框底边框位图
  33. DisplayBmp(m_nBorderCX,m_nWinHeight-m_nBorderCX,m_nWinWidth-2*m_nBorderCX,m_nBorderCX,IDB_BOTTOMBAR);
  34. //绘制对话框左边框位图
  35. DisplayBmp(m_nWinWidth-m_nBorderCX,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_RIGHTBAR);
  36. //给对话框绘制最小化按钮
  37. DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN1);
  38. //给对话框绘制关闭按钮
  39. DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
  40.  
  41. DrawTitleText();
  42. ReleaseDC(&windowsDC);
  43. }
  44. //=====================在指定位置显示bmp位图图像
  45. void CMiniNewsDlg::DisplayBmp(int x,int y,int w,int h,int nID)
  46. {
  47. CRect winRC;
  48. CDC* pDC=GetWindowDC();
  49. CDC memDC;
  50. memDC.CreateCompatibleDC(pDC);
  51. BITMAPINFO bmpInfo;
  52. CBitmap bmp;
  53. GetWindowRect(&winRC);
  54. bmp.LoadBitmap(nID);
  55. bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);
  56. int nBmpCX = bmpInfo.bmiHeader.biWidth;
  57. int nBmpCY = bmpInfo.bmiHeader.biHeight;
  58. memDC.SelectObject(bmp);
  59. pDC->StretchBlt(x,y,w,h,
  60. &memDC,0,0,nBmpCX,nBmpCY,SRCCOPY);//在窗口中绘制位图
  61. bmp.DeleteObject();
  62. ReleaseDC(pDC);
  63. }
  64. void CMiniNewsDlg::SetTitleText(CString strTitle)
  65. {
  66. this->m_strTitle = strTitle + "-小蔡电脑助手";
  67. }
  68. //绘制标题栏标题文本内容
  69. void CMiniNewsDlg::DrawTitleText()
  70. {
  71.  
  72. CDC* pDC= GetWindowDC();
  73. pDC->SetBkMode(TRANSPARENT);
  74. pDC->SetTextColor(RGB(255,255,255));
  75. pDC->SetTextAlign(TA_CENTER);
  76. CRect rect;
  77. GetClientRect(&rect);
  78. CSize szText = pDC->GetTextExtent(m_strTitle);
  79. CFont* font,*fOldFont;
  80. font = new CFont;
  81. font->CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,
  82. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,_T("宋体"));
  83. fOldFont = pDC->SelectObject(font);
  84. CRect winRect;
  85. GetWindowRect(&winRect);
  86. pDC->TextOut(winRect.Width()/2,6.5,m_strTitle);
  87. pDC->SelectObject(fOldFont);
  88. ReleaseDC(pDC);
  89. }
  90.  
  91. void CMiniNewsDlg::OnNcPaint()
  92. {
  93. // TODO: 在此处添加消息处理程序代码
  94. DrawDialog();
  95. // 不为绘图消息调用 CDialog::OnNcPaint()
  96. }
  97.  
  98. void CMiniNewsDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  99. {
  100. CDialog::OnActivate(nState, pWndOther, bMinimized);
  101. OnNcPaint();
  102. // TODO: 在此处添加消息处理程序代码
  103. }
  104.  
  105. void CMiniNewsDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
  106. {
  107. // TODO: 在此添加消息处理程序代码和/或调用默认值
  108. CRect minRC,moreRC,closeRC,winRC,cleanRC,toolkitRC,shoppingRC;
  109. GetWindowRect(&winRC);
  110. closeRC.CopyRect(CRect(m_nWinWidth-26,0,m_nWinWidth-26+26,26));
  111. minRC.CopyRect(CRect(m_nWinWidth-26*2,0,m_nWinWidth-26*2+26,26));
  112.  
  113. point.Offset(-winRC.left,-winRC.top);//由于point为屏幕坐标,这里将其转换为窗口坐标
  114. if(closeRC.PtInRect(point))//鼠标在关闭按钮上时,更改按钮显示的位图
  115. {
  116. m_bMouseOnCloseBtn = TRUE;
  117. m_bMouseOnMinBtn =FALSE;
  118. m_bMouseOnMoreBtn = FALSE;
  119. DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN2);
  120. DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN1);
  121. }
  122. else if(minRC.PtInRect(point))//鼠标在最小化按钮上时,更改按钮显示的位图
  123. {
  124. m_bMouseOnMinBtn =TRUE;
  125. m_bMouseOnCloseBtn = FALSE;
  126. DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
  127. DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN2);
  128. }
  129. CDialog::OnNcMouseMove(nHitTest, point);
  130. }
  131. void CMiniNewsDlg::OnNcLButtonUp(UINT nHitTest, CPoint point)
  132. {
  133. // TODO: 在此添加消息处理程序代码和/或调用默认值
  134. if(m_bMouseOnCloseBtn)
  135. {
  136. this->SendMessage(WM_CLOSE);
  137. }
  138. if(m_bMouseOnMinBtn)
  139. {
  140. this->ShowWindow(SW_MINIMIZE);
  141. m_bMouseOnMinBtn = FALSE;
  142. }
  143. CDialog::OnNcLButtonUp(nHitTest, point);
  144. }
  145.  
  146. void CMiniNewsDlg::OnNcMouseLeave()
  147. {
  148. // 该功能要求使用 Windows 2000 或更高版本。
  149. // 符号 _WIN32_WINNT 和 WINVER 必须 >= 0x0500。
  150. // TODO: 在此添加消息处理程序代码和/或调用默认值
  151. DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MINBTN1);
  152. DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
  153. m_bMouseOnMinBtn =FALSE;
  154. m_bMouseOnCloseBtn = FALSE;
  155. CDialog::OnNcMouseLeave();
  156. }
  157.  
  158. void CMiniNewsDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
  159. {
  160. // TODO: 在此添加消息处理程序代码和/或调用默认值
  161. if(!(m_bMouseOnMinBtn||m_bMouseOnCloseBtn))
  162. CDialog::OnNcLButtonDown(nHitTest, point);
  163. }
  164.  
  165. HBRUSH CMiniNewsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  166. {
  167. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  168.  
  169. // TODO: 在此更改 DC 的任何属性
  170. HBRUSH brush=CreateSolidBrush(m_bkColor);
  171. switch(nCtlColor)
  172. {
  173. case CTLCOLOR_STATIC:
  174. pDC->SetBkMode(TRANSPARENT);
  175. //设置背景为透明
  176. pDC->SetTextColor(RGB(255,255,255)); //设置字体颜色
  177. pDC->SetBkColor(m_bkColor);
  178. //pWnd->SetFont(cFont); //设置字体
  179. hbr = (HBRUSH)brush;
  180. //创建画刷
  181. break;
  182. case CTLCOLOR_BTN:
  183. pDC->SetBkMode(TRANSPARENT);
  184. //设置背景为透明
  185. pDC->SetTextColor(RGB(255,255,255)); //设置字体颜色
  186. pDC->SetBkColor(m_bkColor);
  187. //pWnd->SetFont(cFont); //设置字体
  188. hbr = (HBRUSH)brush;
  189. //创建画刷
  190. break;
  191.  
  192. }
  193.  
  194. // TODO: 如果默认的不是所需画笔,则返回另一个画笔
  195. return hbr;
  196. }

  程序的完整源码下载地址http://www.demodashi.com/demo/14683.html

仿QQ迷你首页(VC++,MFC)(迷你资讯)的开发与实现(源代码)的更多相关文章

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

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

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

    技术:VC++,MFC,WTL,,C++,Windows   概述 之前由于需求和兴趣,需要实现类似QQ迷你资讯首页的东西,看起来很酷,于是就写了个实现方案,主要还是基于WIndows C++ 和MF ...

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

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

  4. Html - 仿QQ空间右下角工具浮动块

    仿QQ空间右下角工具浮动块 <style type="text/css"> .cy-tp-area>.cy-tp-fixbtn>.cy-tp-text { ...

  5. 基于jQuery仿QQ音乐播放器网页版代码

    基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m ...

  6. 继上一篇bootstrap框架(首页)弄的资讯页面

    还是和上一篇首页一样给出每一步的注解: 做的有点简单,但是,以后还是会加深的.毕竟是初学者嘛! <html lang="zh-cn">   <head>   ...

  7. 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口

    印象里仿QQ界面的程序应该有很多,搜了一下,虽然出来一大堆,排除了重复的,却只有两三个,没我想象的好.经常看到CSDN上有人问,QQ这个功能怎么实现,那个界面怎么实现,归纳了一下,决定写这么一个仿QQ ...

  8. iOS仿QQ侧滑菜单、登录按钮动画、仿斗鱼直播APP、城市选择器、自动布局等源码

    iOS精选源码 QQ侧滑菜单,右滑菜单,QQ展开菜单,QQ好友分组 登录按钮 3分钟快捷创建高性能轮播图 ScrollView嵌套ScrolloView(UITableView .UICollecti ...

  9. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  10. 仿QQ大战—界面篇

    之前在<仿QQ大战-服务器的搭建(ServerSocket)>中实现了服务器的搭建,以及一个简单地传递数据的实现,现在就是来实现类似与QQ聊天通信的功能.首先是界面的实现: 首先:服务器和 ...

随机推荐

  1. mytbatis配置多数据源

    http://blog.zous-windows.com/archives/207.html http://www.oschina.net/question/144055_141255?sort=ti ...

  2. Android UI:机智的远程动态更新策略

    问题描述 做过Android开发的人都遇到过这样的问题:随着需求的变化,某些入口界面通常会出现 UI的增加.减少.内容变化.以及跳转界面发生变化等问题.每次发生变化都要手动修改代码,而入口界面通常具有 ...

  3. java自定义接口

    compareTo:根据该数值是小于.等于.或大于 val 返回 -1.0 或 1:

  4. 17.1.1.2 Setting the Replication Slave Configuration

    17.1.1.2 Setting the Replication Slave Configuration 在一个复制slave, 你必须创建一个唯一的server ID,如果这个没有做,slave设置 ...

  5. ajax 初始化请求前携带参数

     $(function () {     function SetAjax(wxOpenId, departCode) {         $.ajaxSetup({             xhrF ...

  6. ExecutorService生命周期

    ExecutorService接口继承了Executor接口,定义了一些生命周期的方法 public interface ExecutorService extends Executor { void ...

  7. 利用if else来运行咱们结婚吧

    static void Main(string[] args)        {            while (true)            {                string ...

  8. POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)

    描述 http://poj.org/problem?id=1065 木棍有重量 w 和长度 l 两种属性,要使 l 和 w 同时单调不降,否则切割机器就要停一次,问最少停多少次(开始时停一次). Wo ...

  9. Web三维技术:Flash Builder+away3d平台搭建(含演示视频)

    转自:http://www.cnblogs.com/beer/archive/2011/07/08/2101492.html 前言:作为页面中实验设备的显示层,需要一个swf作为显示的UI.虽然可以用 ...

  10. HDU-3719 二叉搜索树

    http://acm.hdu.edu.cn/showproblem.php?pid=3791 用数组建立二叉树: 二叉搜索树 Time Limit: 2000/1000 MS (Java/Others ...