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

小结
程序先是触发鼠标左键点击事件,保存鼠标点击的坐标,并生成随机数,保存为对角的坐标,由wm_paint先画出矩形边框,再将矩形区域进行填充即可。这次实验主要遇到了两个问题,第一个是如何画矩形。我通过百度发现可以用rectangle进行绘图,就参考模板填写参数即可。第二个是产生随机数遇到问题。开始我将srand(time(null))函数放在case内,我发现每次点击产生的矩形面积是逐渐增大,大到一定值后又从最小值开始递增。于是我把srand(time(null))放在WndProc函数内、switch外仍然有这个问题。最后我将这个函数放在WinMain内便可以了。我思考发生这个的原因,如果在WndProc内设置种子,每当鼠标点击一次,会运行一次WndProc,种子便设置为当前时间,因为时间差距不大,导致随机数初始值相近并递增。因此需要将种子设置在WinMain下,避免重复设置。
代码
// sy1v2.cpp : Defines the entry point for the application.
//
#include<windows.h>
#include <MMSYSTEM.H>
#include <iostream>
#pragma comment(lib,"winmm.lib")
#include <time.h>
#include <stdlib.h>
using namespace std;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM) ;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
srand(time(0));
static TCHAR lpszClassName[]=TEXT("窗口");//窗口类名
static TCHAR lpszTitle[]=TEXT("win窗口");//窗口标题名
//窗口类定义
//窗口类定义了窗口的形式与功能 窗口类定义通过给窗口类数据结构WNDCLASS赋值完成
//该数据结构中包含窗口类的各种属性
wndclass.style =CS_HREDRAW | CS_VREDRAW; // 窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //定义窗口处理函数
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); // 窗口采用箭头光标
wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景为白色
wndclass.lpszMenuName=NULL; //窗口无菜单
wndclass.lpszClassName=lpszClassName; //窗口类名为“窗口”
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows XP!"),
lpszClassName, MB_ICONERROR) ;
return 0 ;
}//注册窗口类
hwnd = CreateWindow(
lpszClassName, //{窗口类的名字}
lpszTitle, //{窗口标题}
WS_OVERLAPPEDWINDOW, //{窗口样式, 参加下表}
CW_USEDEFAULT,CW_USEDEFAULT, //{位置; 默认的X,Y可以指定为: Integer(CW_USEDEFAULT)}
CW_USEDEFAULT,CW_USEDEFAULT,//{大小; 默认的宽度、高度可以指定为: Integer(CW_USEDEFAULT)}}
NULL, //{父窗口句柄}
NULL, //{主菜单句柄}
hInstance, //{模块实例句柄, 也就是当前 exe 的句柄}
NULL //{附加参数, 创建多文档界面时才用到, 一般设为 nil}
); //{返回所创建的窗口的句柄}
ShowWindow (hwnd, nCmdShow) ;//
//消息循环
while(GetMessage(&Msg,NULL,0,0)) //GetMessage()函数是从调用线程的消息队列中取出一条消息;对于每一个应用程序窗口线程,操作系统都会为其建立一个消息队列,当我们的窗口有消息时(即所有与这个窗口线程相关的消息),操纵系统会把这个消息放到该线程的消息队列当中,我们的窗口程序就通过这个GetMessage()函数从自己的消息队列中取出一条一条具体的消息并进行响应操作。
{
TranslateMessage(&Msg);//对"消息对"的转化,如对键盘的WM_KEYDOWN和WM_KEYUP消息对转化为WM_CHAR消息,并且将转换后的新消息投递到我们的消息队列中去,这个转化操作不会影响原来的消息,只会产生一个新的消息。
DispatchMessage(&Msg);//DispatchMessage()函数是将我们取出的消息传到窗口的回调函数去处理;可以理解为该函数将取出的消息路由给操作系统,然后操作系统去调用我们的窗口回调函数对这个消息进行处理。}
//return Msg.wParam; //消息循环结束 即程序结束时 将信息返回系统
}//
return Msg.wParam;//
}//
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
PAINTSTRUCT ps;//
HDC hdc;//
RECT rect;//
HPEN hPen;
LOGBRUSH logbrush;
HBRUSH hBrush;
int d = 0;
static POINT pt[2];
switch(message){//
case WM_CREATE://
return 0;//
case WM_PAINT:///
hdc = BeginPaint(hwnd, &ps);
hPen = CreatePen(PS_SOLID, 4, RGB(255, 255, 0));
SelectObject(hdc, hPen);
//使用纯画刷
logbrush.lbStyle = BS_SOLID;
//使用阴影画刷
//logbrush.lbStyle = BS_HATCHED;
logbrush.lbHatch = HS_CROSS;
logbrush.lbColor = RGB(238, 0, 0);
hBrush = CreateBrushIndirect(&logbrush);
//画矩形
Rectangle(hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
//设置填充区域
SetRect(&rect, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
//填充颜色
FillRect(hdc, &rect, hBrush);
EndPaint(hwnd, &ps);
DeleteObject(hPen);
return 0;//
case WM_LBUTTONDOWN:
pt[0].x=LOWORD(lParam);
pt[0].y=HIWORD(lParam);
//srand(time(0));
d = rand() % 100 + 1;
pt[1].x=pt[0].x+d;
pt[1].y=pt[0].y+d;
InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_DESTROY://
PostQuitMessage (0) ;//
return 0 ;//
}//
return DefWindowProc(hwnd,message,wParam,lParam);//
}//
Windows API窗口绘图程序设计的更多相关文章
- windows多线程窗口程序设计
掌握windows基于消息驱动的窗口应用程序设计的基本方法,掌握窗口程序资源的概念与设计,掌握常用的消息的程序处理方法,掌握文字图形输出相关函数编程.掌握设计的基本方法(选项),掌握时钟消息设计动画程 ...
- 【转】用C#调用Windows API向指定窗口发送
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- C# windows GDI+仿画图 绘图程序设计
C# windows GDI+仿画图 绘图程序设计 1.介绍 这里分享一个简单的画图程序 原作者:author: ping3108@163.com 2.程序主窗体设计 3.程序设计 本程序工程使用VS ...
- 用C#调用Windows API向指定窗口发送按键消息 z
用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.Interop ...
- Windows API 搭建OpenGL窗口
步骤: 1.创建windows窗口,得到窗口句柄hwnd 2.获取该窗口的设备环境hDC(当然也可以获取其他的设备环境,但我们一般是在创建的窗口上绘制) 3.创建OpenGL绘制环境RC,这个只能从h ...
- 用C#调用Windows API向指定窗口发送按键消息
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- 在VBA中使用Windows API
VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个 ...
- Cocos2dx集成于windows桌面窗口程序的步骤
2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...
随机推荐
- Spring核心-IOC-AOP-模版
1. POM- 1.1 中央仓库 1.2 各包作用 spring-core.jar 核心工具类 spring-beans.jar 是所有应用都要用到的,它包含访问配置文件.创建和管理bean 以及进行 ...
- 通过一个例子,总结下检测数组属性的N种方法
判断arr数组里是否含有a,有a返回1;没有返回2var arr = [{a:1,b:2,c:3},{q:1,w:2,e:3},{s:4,g:5,i:9},{b:2,v:3,u:4}]; 检测属性的3 ...
- $.ajax、$.post
jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...
- ADO.NET的主要对象
ADO.NET主要分为五个对象: 1)Connection对象:用来连接程序与数据库.没有利用连接对象将数据库打开,是无法从数据库中取得数据的.Close和Dispose的区别,Close之后还可以用 ...
- centos7服务器搭建javaweb运行环境及代码部署
之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...
- 工作中遇到的vscode配合eslint完成保存为eslint格式
vscode个人设置 // vscode的个人设置配置 { "workbench.iconTheme": "vscode-icons", "workb ...
- ICCV 2017 Best Paper Awards
[ICCV 2017 Best Paper Awards]今年的ICCV不久前公布了Best Paper得主,來自Facebook AI Research的Mask R-CNN[1],與RetineN ...
- *15. 3Sum (three pointers to two pointers), hashset
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...
- java中string类型转换成map
背景:有时候string类型的数据取出来是个很标准的key.value形式,通过Gson的可以直接转成map 使用方式: Gson gson = new Gson(); Map<String, ...
- segment and section for c++ elf
http://blog.csdn.net/jiafu1115/article/details/12992497 写一个汇编程序保存成文本文件max.s. 汇编器读取这个文本文件转换成目标文件max.o ...