1.将菜单栏归零,工具栏放在窗口低部,加载自己新建的工具栏

CMainFrame::OnCreate()函数中 this->SetMenu(0);

2.将窗口初始化为最大化

APP类中:m_pMainWnd->ShowWindow(SW_MAXIMIZE);

3.去掉边框

CMainFrame::PreCreateWindow()函数中 cs.style = WS_POPUP;
4.在FRAME类中添加工具栏命令消息,关闭

通过ON_COMMAND(ToolBar下的图片ID,实现的函数)  this->PostMessage(WM_CLOSE);

5.在VIEW类中添加系统消息keydown

void CDRAWView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

  if(nChar == VK_ESCAPE)

  {

    AfxGetMainWnd()->PostMessage(WM_CLOSE);

  }  

  CView::OnKeyDown(nChar, nRepCnt, nFlags);

}

6.将桌面背景贴到窗口上
在Frame.h中添加成员变量和成员函数

  1. class CMainFrame : public CFrameWnd
  2. {
  3. public:
  4. int m_ScreenX;
  5. int m_ScreenY;
  6. stack<CBitmap*> stk;//保存图片,实现撤销操作
  7. }

Frame.cpp的构造函数和析构函数

  1. CMainFrame::CMainFrame()
  2. {
  3. m_ScreenX = GetSystemMetrics(SM_CXSCREEN);//屏幕长(调用函数为获取屏幕分辨率)
  4. m_ScreenY = GetSystemMetrics(SM_CYSCREEN);//屏幕宽
  5. CWindowDC dc(GetDesktopWindow());//获取桌面屏幕
  6. CDC cdc;
  7. cdc.CreateCompatibleDC(&dc);//兼容性DC相当于没有画纸的DC
  8. CBitmap* bitmap = new CBitmap;
  9. bitmap->CreateCompatibleBitmap(&dc,m_ScreenX,m_ScreenY);//创建一个兼容性位图,第一个参数
  10. cdc.SelectObject(bitmap);//将画纸放在DC上(只有兼容性DC才可以放画纸)
  11. cdc.BitBlt(,,m_ScreenX,m_ScreenY,&dc,,,SRCCOPY);
  12. stk.push(bitmap);
  13. }
  14.  
  15. CMainFrame::~CMainFrame()
  16. {
  17. if(stk.empty() == false)
  18. {
  19. delete(stk.top());
  20. stk.pop();
  21. }
  22. }

VIEW.cpp

  1. void CDRAWView::OnDraw(CDC* /*pDC*/)
  2. {
  3. CDRAWDoc* pDoc = GetDocument();
  4. ASSERT_VALID(pDoc);
  5. if (!pDoc)
  6. return;
  7.  
  8. CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();//父类指针强转为子类,才可使用子类特有变量
  9. CClientDC dc(this);
  10. CDC cdc;
  11. cdc.CreateCompatibleDC(&dc);
  12. cdc.SelectObject(pFrame->stk.top());
  13. dc.BitBlt(,,pFrame->m_ScreenX,pFrame->m_ScreenY,&cdc,,,SRCCOPY);
  14.  
  15. }

7.添加工具栏

在资源视图中Toolbar下自行绘制,更改对应ID;

在resource.h中将宏改为连续数字

ON_COMMAND_RANGE(ID_PEN,ID_ELLIPSE,&CDRAWView::ONChangeDrawStyle)//连续宏可使用

声明枚举类型    enum{PEN,LINE,RECTANGLE,TRIANGLE,ELLIPSE};(铅笔,直线,长方形,三角形,椭圆形)与resource.h中的顺序对应

  1. View.h
  1. class CDRAWView : public CView
  2. {
  3. public:
  4. int m_DrawStyle;
  5. void ONChangeDrawStyle(UINT uid);
  6. bool m_blsFlag;
  7. CPoint PointMouseDown;
  8. };

在View.cpp中

  1. void CDRAWView::ONChangeDrawStyle(UINT uid)
  2. {
  3. m_DrawStyle = uid - ID_PEN;
  4. }
  5. CDRAWView::CDRAWView()
  6. {
  7. m_DrawStyle = ID_PEN;
  8. m_blsFlag = false;
  9. }
  10. void CDRAWView::OnLButtonDown(UINT nFlags, CPoint point)
  11. {
  12. m_blsFlag = true;
  13. PointMouseDown = point;
  14. CView::OnLButtonDown(nFlags, point);
  15. }
  16.  
  17. void CDRAWView::OnLButtonUp(UINT nFlags, CPoint point)
  18. {
  19. m_blsFlag = false;
  20.  
  21. CView::OnLButtonUp(nFlags, point);
  22. }
  23.  
  24. void CDRAWView::OnMouseMove(UINT nFlags, CPoint point)
  25. {
  26. CClientDC dc(this);
  27. CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
  28. if(m_blsFlag)
  29. {
  30. if(m_DrawStyle == PEN)
  31. {
  32. dc.MoveTo(PointMouseDown.x,PointMouseDown.y);
  33. dc.LineTo(point.x,point.y);
  34. PointMouseDown = point;
  35. return ;
  36. }
  37. else
  38. {
  39. //======================================解决闪屏========================================
  40. CDC MemDC;
  41. MemDC.CreateCompatibleDC(&dc);
  42. CBitmap* bitmap = new CBitmap;
  43. bitmap->CreateCompatibleBitmap(&dc,pFrame->m_ScreenX,pFrame->m_ScreenY);
  44. MemDC.SelectObject(bitmap);
  45. //-------------------------------------栈顶图片贴图擦除痕迹------------------------------------------------
  46. CDC cdc;
  47. cdc.CreateCompatibleDC(&dc);
  48. cdc.SelectObject(pFrame->stk.top());
  49. MemDC.BitBlt(,,pFrame->m_ScreenX,pFrame->m_ScreenY,&cdc,,,SRCCOPY);
           //-------------------------------------------------------------------------------------------------------
  50. switch(m_DrawStyle)
  51. {
  52. case LINE:
  53. MemDC.MoveTo(PointMouseDown.x,PointMouseDown.y);
  54. MemDC.LineTo(point.x,point.y);
  55. break;
  56. case TRIANGLE:
  57. {
  58. POINT points[] = {{(PointMouseDown.x+point.x)/,PointMouseDown.y},{PointMouseDown.x,point.y},{point.x,point.y}};
  59. MemDC.Polygon(points,);
  60. }
  61. break;
  62. case ELLIPSE:
  63. MemDC.Ellipse(PointMouseDown.x,PointMouseDown.y,point.x,point.y);
  64. break;
  65. case RECTANGLE:
  66. MemDC.Rectangle(PointMouseDown.x,PointMouseDown.y,point.x,point.y);
  67. break;
  68. }
  69. dc.BitBlt(,,pFrame->m_ScreenX,pFrame->m_ScreenY,&MemDC,,,SRCCOPY);
  70. //===================================================================================================
  71. }
  72. }
  73.  
  74. CView::OnMouseMove(nFlags, point);
  75. }

MFC小程序的更多相关文章

  1. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  2. MFC小程序------01 代码管理器

    1.代码入库: 2.代码查找: 3.查看全部代码: 4.程序设置: 自己学习MFC写的一个小程序,当中还有很多功能还待完好,比方数据库的导入功能还没有写,但导出功能是能够用的,查找算法也不是非常好,还 ...

  3. MFC小程序02————— 不规则窗体小应用程序

    什么不说了.先上程序截图: 执行结果是有一棵有星星在闪烁的圣诞树.还会循环播放背景音乐. 之前也是在网上看到类似的一个程序.然后自己近期也在学MFC.所以就模仿着写了一个, 当中使用的是GDI+来显示 ...

  4. mfc 小程序---在系统菜单中添加菜单项

    1建立一个对话框工程:在dlg类里定义一个菜单指针m_pMenu,在对话框OnInitDialog函数里添加代码: m_pMenu=GetSystemMenu(FALSE);//获取系统菜单的指针 m ...

  5. MFC入门(二)-- 提取输入框的字符串(定时关机的小程序)

    上篇文章已经让我们有了对于MFC最简单直观的认识,但貌似并无太大的交互性可言,而且其实也没有涉及到数据的交互,所以本文通过做一个时间可以调节的定时关机的Demo来演示. MFC入门(一)地址:http ...

  6. MFC入门(一)-- 第一个简单的windows图形化界面小程序(打开计算器,记事本,查IP)

    ////////////////////////////////序//////////////////////////////// 大约三年前,学过一些简单的编程语言之后其实一直挺苦恼于所写的程序总是 ...

  7. vb小程序浅析

    系统 : Windows xp 程序 : BJCM10B 程序下载地址 :http://pan.baidu.com/s/1dFyXe29 要求 : 编写注册机 使用工具 : OD 可在看雪论坛中查找关 ...

  8. MFC应用程序框架(转)

    对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便.其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用 ...

  9. VC++6.0和VS2005在编写MFC应用程序时,操作方面的差异

    VC++6.0和VS2005在编写MFC应用程序时,操作方面的差异 一直用VC++6.0,对VS2005不太了解,下面简单的熟悉一下VS2005的一下功能,总结一下VS2005在编写MFC时候的应用. ...

随机推荐

  1. 自己如何获取ADO连接字符串

    自己如何获取ADO连接字符串 摘自:http://blog.csdn.net/zyq5945/article/details/5586423 有时候我们参考网上的ADO连接字符串写未必就能连接上数据库 ...

  2. 【转】C# Socket编程(4)初识Socket和数据流

    [转自:https://www.cnblogs.com/IPrograming/archive/2012/10/15/CSharp_Socket_4.html] 经过前面基础知识作为背景,现在对Soc ...

  3. C#网络编程(同步传输字符串) - Part.2

    服务端客户端通信 在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据.端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可以在客户端与服务端之间 ...

  4. Collections排序

    0.前言 ThreeSet的底层实现是红黑树,它在创建set的过程中实现排序.Collections.sort是在对整个集合进行排序,按道理来说使用TreeSet插入集合元素直至建立整个TreeSet ...

  5. 在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解决,谢谢!

    在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解 ...

  6. loadsh学习

    由Underscore与Lodash的差异引发的思考:http://ju.outofmemory.cn/entry/106512 JavaScript工具库之Lodash Underscore和Lod ...

  7. FIREDAC的心得

    FIREDAC与UNIDAC有些不同 但大体上是相同的 以下是一些随手笔记: FieldCount是当前FDQuery2所在行里面有多少列 一般用FieldList[X]来代表第几列 str:=FDQ ...

  8. 在window下 进入系统盘命令

    示例: cd C:\work 查看文件夹直接在当前路径下输入 dir 在当前路径下输入 dir/? 查看帮助

  9. Linux增加Swap分区

    Linux增加Swap分区 dd if=/dev/zero of=/data/swap/swapfile1 bs=4096 count=2097152 mkswap /data/swap/swapfi ...

  10. 将java程序打包成exe文件

    一. 1. 项目右击,导出 jar文件 2. 下一步,选择 3. 完成 二. 1. 下载exe4j,并破解 2. 其他的步骤都好说,我主说这个步骤,一定要讲所有引用的jar包放到里面否则会报找不到文件 ...