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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Spring实战】—— 1 入门讲解

    这个系列是学习spring实战的总结,一方面总结书中所写的精髓,另一方面总结一下自己的感想。   基础部分讲解了spring最为熟知的几个功能:依赖注入/...

    用户1154259
  • 20120919-二叉树 数据结构《数据结构与算法分析》

    又是一次的毕业季,羡慕嫉妒啊.... 二叉查找树类的框架: 1 template <typename Comparable> 2 class BinaryS...

    用户1154259
  • 使用计时器-方法1

    Windows将WM_TIMER消息发送到应用程序的窗口过程。相应SetTimer的调用方法: SetTimer(hwnd,1,uiMsecInterval,N...

    用户1154259
  • 转: Oracle正在招Linux OS Architect,技术挑战和薪酬都相当的给力!

    (信息来源:https://oracle.taleo.net, JOB ID: 16000P1S, 160017NU)

    王录华
  • 大咖丨每年都立下新年Flag的小扎,今年又留给自己什么样的挑战?

    大数据文摘
  • 在Python中进行机器学习,随机数生成器的使用

    随机性一直是机器学习的重中之重。随机性一直作为工具或特征,出现在数据准备和学习算法中,将输入数据映射到输出数据以作出预测。为了理解机器学习中的统计方法,你必须了...

    AiTechYun
  • 【02】从零开始学Python—Anaconda下载与安装

    本文记录Anaconda完整的下载与安装过程,环境变量的配置,以及如何启动Jupyter notebook并编写第一句代码。以上三项是每一个Python初学者必...

    1480
  • 数据团队思考:数据驱动业务,比技术更重要的是思维的转变

    如果你也遇到了类似场景,那我们就可以继续今天的话题,讨论一下在数据团队中,该如何去做到数据驱动业务。如果没有遇到类似的场景,那也欢迎分享一下你们数据团队是对于数...

    数据处理与分析
  • geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

    在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据...

    魏守峰
  • ATT计划推出6万台dNOS支持的白盒设备以实现5G

    SDNLAB

扫码关注云+社区

领取腾讯云代金券