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);
}

时间: 2024-10-02 13:07:08

MFC 随机矩形的相关文章

JS_生成随机矩形位置/矩形大小_面向对象_原型+构造函数模式

使用面向对象的方法进行矩形的随机生成.使用了原型和构造函数模式 随机生成矩形.矩形的位置是随机的,矩形的长宽(100-200)也是随机的. 贴上代码: html 1 <div class="content" id="content"> 2 <div class="controls"> 3 <label for="rec_num">请输入您要自动生成的矩形数量:</label> 4

windows 随机矩形绘制

代码如下 #include<windows.h> void DrawRect (HWND hwnd); int cxClient, cyClient; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdSh

随机色块

代码描述: <!doctype html><html lang="en"><head><meta charset="utf-8"><title>canvas运动</title><style> </style></head><body> <canvas width="500" height="300" s

第5章 绘图基础_5.6 矩形、区域和剪裁

5.6.1 处理矩形 (1)绘图函数 绘图函数 说明 FillRect(hdc,&rect,hBrush) 不用先将画刷选入设备环境 FrameRect(hdc,&rect,hBrush) 绘制边框,不填充(注意是用画刷,而不是画笔) InvertRect(hdc,&rect) 像素反转,由1变0,0变1. (2)操纵RECT结构的函数 操作矩形 函数 1.设置RECT字段 SetRect(&rect,xLeft,yTop,xRight,yBottom); 2.沿x和y移动

Win32消息循环机制等【转载】http://blog.csdn.net/u013777351/article/details/49522219

Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序.虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构. 而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程

第19章 多文档界面

19.1 概述——MDI层次结构 ①框架窗口 A.本身是一个普通的主窗口,其客户区被特殊的窗口覆盖,并不直接显示程序的输出.其客户区也被称为“工作区” B.默认的消息处理函数是DefFrameProc,而不是DefWindowProc. ②客户窗口: A.系统预定义的窗口类,类名“MDICLIENT”,负责各个MDI子窗口的管理. B.窗口过程系统己经预先注册,用户程序不需要窗口过程. ③文档窗口:也称为子窗口,用于显示一个文档. 19.2 窗口的建立 (1)框架窗口:先注册一个MDI框架窗口类

图形基础

图形基础 壹佰软件开发小组  整理编译   图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形.正如您所认为的那样,GDI是Windows非常重要的部分.不只您为Windows编写的应用系统在显示视觉信息时使用GDI,就连Windows本身也使用GDI来显示使用者接口对象,诸如菜单.滚动条.图标和鼠标光标. 不幸的是,如果要对GDI进行全面的讲述,将需要一整本书-当然不是这本书.在本章中,我只是想向您提供画线和

PeekMessage

BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); 前面的四个参数(一个指向MSG结构的指标.一个视窗代号.两个值指示消息范围)与GetMessage的参数相同.将第二.三.四个参数设定为NULL或0时,表明我们想让PeekMessage传回程式中所有视窗的所有消息.如果要将消息从消息伫列中删除,则将PeekMessage的最後一个参数设定为PM_RE

MFC 直线 虚线 折线 圆 椭圆 矩形 弧形

****Dlg.h头文件添加: //为工程添加画笔.点变量数组 public: CPen m_pen[5]; CPoint m_point[5]; public: void DrawLine(CDC *pDC); void DrawPolyline(CDC *pDC); void DrawPolygon(CDC *pDC); void DrawRect(CDC *pDC); void DrawRoundRect(CDC *pDC); void DrawEllipse(CDC *pDC); voi