MFC 随机矩形
时间:2022-04-22
本文章向大家介绍MFC 随机矩形,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述:
简单地使用随即的尺寸和颜色不停的绘制一系列的图像。
一种古老的方式:
设置一个向窗口函数发送WM_TIMER消息的windows计时器。
对每个WM_TIMER消息,调用GetDC函数获取设备环境,然后绘制一个随机矩形,接着调用ReleaseDC函数释放设备环境。
方法弊端:
程序不能很快的绘制随机矩形,必须等待每个WM_TIMER消息,会依赖于系统时钟的精度
新函数:
PeekMessage(&msg,NULL,0,0,PM_REMOVE);这个函数允许一个程序检查程序队列中的下一个消息,而不是真实的获取并删除它看到的消息。
正常的循环消息:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
替换后的循环消息:
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
DrawRctangle(hWnd);
}
在这里,必须明确检查WM_QUIT消息。在一个正常的消息循环中,不需要这样做。
因为正常的GetMessage返回值是false(0),但是PeekMessage的返回值是队列中有没有消息,因此检查wm_quit是必要的。
源文件代码:
// peekmessage.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "peekmessage.h"
#include <Windows.h>
#include <stdlib.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DrawRctangle(HWND);
int cxClient,cyClient;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: 在此放置代码。
HWND hWnd;
static TCHAR szAppName[] = TEXT("RandRect");
MSG msg;
WNDCLASS wcex;
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PEEKMESSAGE));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szAppName;
if (!RegisterClass(&wcex))
{
MessageBox(NULL,TEXT("this program requires Windows ",szAppName,MB_ICONERROR);
return 0;
}
hWnd = CreateWindow(szAppName,TEXT("Random Rectangles"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
DrawRctangle(hWnd);
}
return (int) msg.wParam;
}
void DrawRctangle(HWND hWnd)
{
HBRUSH hBrush;
HDC hdc;
RECT rect;
if(cxClient == 0 || cyClient == 0)
return;
SetRect(&rect,rand()%cxClient,rand()%cyClient,rand()%cxClient,rand()%cyClient);
hBrush = CreateSolidBrush(
RGB(rand()%256,rand()%256,rand()%256)
);
hdc = GetDC(hWnd);
FillRect(hdc,&rect,hBrush);
ReleaseDC(hWnd,hdc);
DeleteObject(hBrush);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(wParam);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript原型与继承
- 当TKE遇上Coding, 业务如何实现快速迭
- cocos creator 1.x透明渐变效果实现
- Cocos Creator 2.x透明渐变效果实现
- Themeleaf通过ajax局部更新
- ubuntu下利用expect实现screen多窗口开机运行
- hetzner服务器购买和安装debian系统
- 安全通告 | Apache SkyWalking SQL注入漏洞安全风险公告(CVE-2020-13921)
- Cmd Markdown 迁移备份的流程
- PyTorch3:计算图torch.autograph
- spark shell 配置 Kryo 序列化
- Mac里捣腾Kerberos(一)
- Spark on K8S 访问 Kerberized HDFS
- Apache Beam的Docker Demo
- docker login 报错了...