任务目标

设计一个简单的Windows 窗口程序,在程序窗口内任意位置按下鼠标左键,可绘制范围在10-100之间随机大小的正方形。并且显示的正方形用红色填充。

效果图

小结

程序先是触发鼠标左键点击事件,保存鼠标点击的坐标,并生成随机数,保存为对角的坐标,由wm_paint先画出矩形边框,再将矩形区域进行填充即可。这次实验主要遇到了两个问题,第一个是如何画矩形。我通过百度发现可以用rectangle进行绘图,就参考模板填写参数即可。第二个是产生随机数遇到问题。开始我将srand(time(null))函数放在case内,我发现每次点击产生的矩形面积是逐渐增大,大到一定值后又从最小值开始递增。于是我把srand(time(null))放在WndProc函数内、switch外仍然有这个问题。最后我将这个函数放在WinMain内便可以了。我思考发生这个的原因,如果在WndProc内设置种子,每当鼠标点击一次,会运行一次WndProc,种子便设置为当前时间,因为时间差距不大,导致随机数初始值相近并递增。因此需要将种子设置在WinMain下,避免重复设置。

代码

  1. // sy1v2.cpp : Defines the entry point for the application.
  2. //
  3. #include<windows.h>
  4. #include <MMSYSTEM.H>
  5. #include <iostream>
  6. #pragma comment(lib,"winmm.lib")
  7. #include <time.h>
  8. #include <stdlib.h>
  9. using namespace std;
  10. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM) ;
  11. int WINAPI WinMain(HINSTANCE hInstance,
  12. HINSTANCE hPrevInstance,
  13. LPSTR lpCmdLine,
  14. int nCmdShow)
  15. {
  16. // TODO: Place code here.
  17. HWND hwnd;
  18. MSG Msg;
  19. WNDCLASS wndclass;
  20. srand(time(0));
  21. static TCHAR lpszClassName[]=TEXT("窗口");//窗口类名
  22. static TCHAR lpszTitle[]=TEXT("win窗口");//窗口标题名
  23. //窗口类定义
  24. //窗口类定义了窗口的形式与功能 窗口类定义通过给窗口类数据结构WNDCLASS赋值完成
  25. //该数据结构中包含窗口类的各种属性
  26. wndclass.style =CS_HREDRAW | CS_VREDRAW; // 窗口类型为缺省类型
  27. wndclass.lpfnWndProc=WndProc; //定义窗口处理函数
  28. wndclass.cbClsExtra=0; //窗口类无扩展
  29. wndclass.cbWndExtra=0; //窗口实例无扩展
  30. wndclass.hInstance=hInstance; //当前实例句柄
  31. wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标
  32. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); // 窗口采用箭头光标
  33. wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景为白色
  34. wndclass.lpszMenuName=NULL; //窗口无菜单
  35. wndclass.lpszClassName=lpszClassName; //窗口类名为“窗口”
  36. if (!RegisterClass (&wndclass))
  37. {
  38. MessageBox (NULL, TEXT ("This program requires Windows XP!"),
  39. lpszClassName, MB_ICONERROR) ;
  40. return 0 ;
  41. }//注册窗口类
  42. hwnd = CreateWindow(
  43. lpszClassName, //{窗口类的名字}
  44. lpszTitle, //{窗口标题}
  45. WS_OVERLAPPEDWINDOW, //{窗口样式, 参加下表}
  46. CW_USEDEFAULT,CW_USEDEFAULT, //{位置; 默认的X,Y可以指定为: Integer(CW_USEDEFAULT)}
  47. CW_USEDEFAULT,CW_USEDEFAULT,//{大小; 默认的宽度、高度可以指定为: Integer(CW_USEDEFAULT)}}
  48. NULL, //{父窗口句柄}
  49. NULL, //{主菜单句柄}
  50. hInstance, //{模块实例句柄, 也就是当前 exe 的句柄}
  51. NULL //{附加参数, 创建多文档界面时才用到, 一般设为 nil}
  52. ); //{返回所创建的窗口的句柄}
  53. ShowWindow (hwnd, nCmdShow) ;//
  54. //消息循环
  55. while(GetMessage(&Msg,NULL,0,0)) //GetMessage()函数是从调用线程的消息队列中取出一条消息;对于每一个应用程序窗口线程,操作系统都会为其建立一个消息队列,当我们的窗口有消息时(即所有与这个窗口线程相关的消息),操纵系统会把这个消息放到该线程的消息队列当中,我们的窗口程序就通过这个GetMessage()函数从自己的消息队列中取出一条一条具体的消息并进行响应操作。
  56. {
  57. TranslateMessage(&Msg);//对"消息对"的转化,如对键盘的WM_KEYDOWN和WM_KEYUP消息对转化为WM_CHAR消息,并且将转换后的新消息投递到我们的消息队列中去,这个转化操作不会影响原来的消息,只会产生一个新的消息。
  58. DispatchMessage(&Msg);//DispatchMessage()函数是将我们取出的消息传到窗口的回调函数去处理;可以理解为该函数将取出的消息路由给操作系统,然后操作系统去调用我们的窗口回调函数对这个消息进行处理。}
  59. //return Msg.wParam; //消息循环结束 即程序结束时 将信息返回系统
  60. }//
  61. return Msg.wParam;//
  62. }//
  63. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
  64. PAINTSTRUCT ps;//
  65. HDC hdc;//
  66. RECT rect;//
  67. HPEN hPen;
  68. LOGBRUSH logbrush;
  69. HBRUSH hBrush;
  70. int d = 0;
  71. static POINT pt[2];
  72. switch(message){//
  73. case WM_CREATE://
  74. return 0;//
  75. case WM_PAINT:///
  76. hdc = BeginPaint(hwnd, &ps);
  77. hPen = CreatePen(PS_SOLID, 4, RGB(255, 255, 0));
  78. SelectObject(hdc, hPen);
  79. //使用纯画刷
  80. logbrush.lbStyle = BS_SOLID;
  81. //使用阴影画刷
  82. //logbrush.lbStyle = BS_HATCHED;
  83. logbrush.lbHatch = HS_CROSS;
  84. logbrush.lbColor = RGB(238, 0, 0);
  85. hBrush = CreateBrushIndirect(&logbrush);
  86. //画矩形
  87. Rectangle(hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
  88. //设置填充区域
  89. SetRect(&rect, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
  90. //填充颜色
  91. FillRect(hdc, &rect, hBrush);
  92. EndPaint(hwnd, &ps);
  93. DeleteObject(hPen);
  94. return 0;//
  95. case WM_LBUTTONDOWN:
  96. pt[0].x=LOWORD(lParam);
  97. pt[0].y=HIWORD(lParam);
  98. //srand(time(0));
  99. d = rand() % 100 + 1;
  100. pt[1].x=pt[0].x+d;
  101. pt[1].y=pt[0].y+d;
  102. InvalidateRect(hwnd,NULL,TRUE);
  103. return 0;
  104. case WM_DESTROY://
  105. PostQuitMessage (0) ;//
  106. return 0 ;//
  107. }//
  108. return DefWindowProc(hwnd,message,wParam,lParam);//
  109. }//

Windows API窗口绘图程序设计的更多相关文章

  1. windows多线程窗口程序设计

    掌握windows基于消息驱动的窗口应用程序设计的基本方法,掌握窗口程序资源的概念与设计,掌握常用的消息的程序处理方法,掌握文字图形输出相关函数编程.掌握设计的基本方法(选项),掌握时钟消息设计动画程 ...

  2. 【转】用C#调用Windows API向指定窗口发送

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

  3. C# windows GDI+仿画图 绘图程序设计

    C# windows GDI+仿画图 绘图程序设计 1.介绍 这里分享一个简单的画图程序 原作者:author: ping3108@163.com 2.程序主窗体设计 3.程序设计 本程序工程使用VS ...

  4. 用C#调用Windows API向指定窗口发送按键消息 z

    用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.Interop ...

  5. Windows API 搭建OpenGL窗口

    步骤: 1.创建windows窗口,得到窗口句柄hwnd 2.获取该窗口的设备环境hDC(当然也可以获取其他的设备环境,但我们一般是在创建的窗口上绘制) 3.创建OpenGL绘制环境RC,这个只能从h ...

  6. 用C#调用Windows API向指定窗口发送按键消息

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

  7. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  8. 在VBA中使用Windows API

    VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个 ...

  9. Cocos2dx集成于windows桌面窗口程序的步骤

    2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...

随机推荐

  1. Hack Knowledges

    XSS(Cross-Site Scripting) Hacker PC -- upload XSS script to Web Server --> User PC Request for th ...

  2. Aspose.Cells导入导出execl

    插件:Aspose.Cells 没有安装office插件也能使用: 导出:不能使用ajax异步· /// <summary> /// 导出试题 /// </summary> / ...

  3. sqlserverToXML

    --raw模式 以属性的形式展示select * from goods for xml rawselect *from goods for xml raw('goods') --修改节点名称selec ...

  4. jsp---》》》新闻发布系统的项目跟踪+++++++文件上传

    先来一个分层架构图: WeebRoot目录下的页面: 现在,此项目以实现登录,注销,新闻列表,编辑主题>>>> 先来登录部分的关键代码 index.jsp中的代码 userIn ...

  5. psd图片不能在网页上显示

    原因:web上不支持psd图片,web支持JPG,PNG等. 解决:打开ps点击文件--储存为web所用格式(选择转换成哪种格式).

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  7. 如何解决ArcGIS Runtime SDK for Android中文标注无法显示的问题

    自10.2版本开始,我就一直被ArcGIS Runtime SDK for Android的中文标注无限困扰.无论是驻留于内存中的Graphic 的文本符号TextSymbol,还是新增的离线geod ...

  8. 我的Android开发之路——百度地图开源工具获取定位信息

    定位技术在现在的移动设备上是必不可少的,许多app都会使用定位功能. 通常定位方式有两种:GPS定位:网络定位. Android系统对这两种定位方式都提供了相应的API支持,但是因为google的网络 ...

  9. selenium server在页面加载超时浏览器与driver通信失败时的妙用

    事实上,WebDriver有两种方式“驱动”浏览器的方式.1. Selenium Server:和Selenium RC一样的,通过指定远端服务器IP地址和端口号,由这个远端服务器来驱动浏览器.2. ...

  10. ASP.NET设置母版页

    母版页允许开发人员创建具有指定的可编辑区域的站点级模板.随后,此模板可应用到网站中的 ASP.NET 页面上.这些 ASP.NET 页面只需为母版页中指定的可编辑区域提供相应内容 – 在使用母版页的所 ...