龙空技术网

【新书推荐】4.6.2 第28练:绘制随机矩形

爱达人编程达人 72

前言:

此时你们对“c语言rectangle函数”大约比较重视,兄弟们都想要分析一些“c语言rectangle函数”的相关文章。那么小编在网络上汇集了一些关于“c语言rectangle函数””的相关知识,希望小伙伴们能喜欢,小伙伴们快快来了解一下吧!

/*---------------------------

028 WIN32 API 每日一练

第28个例子RANDRECT.C:绘制随机矩形

PeekMessage函数

SetRect函数

CreateSolidBrush函数

FillRect函数

(c) , 2020

---------------------------------*/

#include <windows.h>

#include <stdlib.h>

//int cxClient,cyClient;

void DrawRectangle(HWND hwnd);

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

//static int cxClient, cyClient;//不可以,改为全局变量

static TCHAR szAppName[] = TEXT ("RandRect.C") ;

…(略)

ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;

//消息循环

while (TRUE)

{

if (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))//消息队列不为空

{

if (msg.message == WM_QUIT)//如果是WM_QUIT消息退出循环

break;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

else//消息队列为空

{

DrawRectangle(hwnd);//绘制随机矩形

}

}

return msg.wParam ;

}

//绘制随机矩形

void DrawRectangle(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(lParam);

return 0 ;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd, message, wParam, lParam);

}

/******************************

PeekMessage函数:调度传入的已发送消息,检查线程消息队列中是否有已发布消息,并检索消息(如果存在)。

BOOL PeekMessageA(

LPMSG lpMsg, //指向接收消息信息的MSG结构的指针

HWND hWnd, //要获取其消息的窗口的句柄。该窗口必须属于当前线程

UINT wMsgFilterMin, //在要检查的消息范围内的第一条消息的值

UINT wMsgFilterMax, //在要检查的消息范围内的最后一条消息的值

UINT wRemoveMsg //指定如何处理消息。此参数可以是以下一个或多个值

//PM_REMOVE允许一个程序检查程序队列中的下一个消息,而不是真实地获得并删除它看到的消息。

);

****************************

SetRect函数:设置指定矩形的坐标。这等效于将left,top,right和bottom参数分配给RECT结构的适当成员。

BOOL SetRect(

LPRECT lprc, //指向包含要设置的矩形的RECT结构的指针

int xLeft,

int yTop,

int xRight,

int yBottom

);

**********************

FillRect函数:通过使用指定的刷子填充的矩形。此功能包括左侧和顶部边框,但不包括矩形的右侧和底部边框

int FillRect(

HDC hDC,

const RECT *lprc, //指向RECT结构的指针,该结构包含要填充的矩形的逻辑坐标。

HBRUSH hbr //画刷句柄

);

**************************

CreateSolidBrush函数:创建具有指定的纯色的逻辑刷

HBRUSH CreateSolidBrush(

COLORREF color //要创建COLORREF颜色值,请使用RGB宏

);

*/

运行结果:

图4-16 绘制随机矩形

总结

1.上述实例的核心是PeekMessage函数,Peek是窥探的意思,该函数用于从消息队列中检索并移除一个消息(如果存在)。函数返回一个布尔值,表示是否成功检索到消息。如果存在消息并成功检索到,返回TRUE;否则,返回FALSE。

我们将消息循环中的GetMessage函数替换为PeekMessage函数,如果窥探到消息队列中有消息,且不是WM_QUIT消息则翻译和转发消息,是WM_QUIT消息则退出消息循环。如果消息队列中没有消息,则绘制随机矩形。

GetMessage与PeekMesssage的区别:

GetMessage

PeekMessage

作用

获取一条消息,并从消息队列里删掉除该消息(除WM_PAINT外)。

检查消息队列的消息,是否删除,取决于最后一个参数是PM_REMOVE或PM_NOREMOVE。

控制权

获得消息,才返回。

立即返回,不管是否有消息

返回值

获得非WM_QUIT消息时,返回非零

获得WM_QUIT时,返回0

TRUE表示有消息,FALSE表示没有消息。

2.随机矩形的绘制方法:

调用SetRect函数设置随机大小的矩形;

调用CreateSolidBrus函数生成随机颜色的画刷;

调用GetDC获取设备环境句柄;

调用FillRect函数填充随机矩形;

最后调用ReleaseDC函数是释放设备环境句柄,调用DeleteObject函数删除创建的GDI对象画刷。

3.动手实验:假如将变量int cxClient, cyClient设置为static变量,将无法通过编译。需要将其定义为全局变量。

本文摘自编程达人系列教材《Windows API每日一练》Windows程序设计基础篇。

标签: #c语言rectangle函数