前言:
此时你们对“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宏
);
*/
运行结果:
总结
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函数