如何实现 画了一个无填充的矩形或圆,用鼠标点一下它就可以给它填充颜色

0

先画一个无填充的矩形或圆,请问怎么实现用鼠标点一下它就可以给它填充颜色

ava
白瓷梅子汤

2022-11-6

0

我用按钮函数给你改了一个,点击圆,用随机填充这个圆的颜色,效果还不错,你参考参考


#include <graphics.h>				// 绘图库头文件。
#include <conio.h>					// 函数 _getch 的所在库。
#include <windows.h>				// 系统库。
#include <stdio.h>					// 标准库。
#include <string.h>					// 字集处理库。
#include <ShlObj.h>					// 获取桌面壁纸的函数的头文件。
#include<mmsystem.h>				// 音乐播放 API 函数所在库。
#pragma comment(lib,"winmm.lib")	// 音乐播放相关。

#define width 250					// 程序宽。
#define high 350					// 程序高。

//  声明颜色 RGB 变量,可以修改这个改变按钮颜色,并可以初始化颜色。
int button_rgb1[3][1] = { 19, 113, 171 };
int button_rgb2[3][1] = { 201, 222, 245 };
int p = 20;

// 三维数组的巧妙应用于,鼠标移动到按钮位置发生不一样选择。
TCHAR button_string[2][22][50] =
{

};

/// @brief 修改按钮字体大小函数
/// @param zise	字体大小数值
void button_textzise(int zise)
{
	LOGFONT f;
	gettextstyle(&f);									// 获取当前字体设置。
	f.lfHeight = zise;									// 设置字体高度为 48 。

	_tcscpy_s(f.lfFaceName, _T("宋体"));
	f.lfQuality = ANTIALIASED_QUALITY;					// 设置输出效果为抗锯齿。

	settextstyle(&f);
	setbkmode(TRANSPARENT);								// 设置透明的背景。
}

/// @brief 按钮创建函数
/// @param x1		按钮左上角 x 坐标
/// @param y1		按钮左上角 y 坐标
/// @param x2		按钮右下角 x 坐标
/// @param y2		按钮右下角 y 坐标
/// @param mouse_x	鼠标 x 座标
/// @param mouse_y	鼠标 y 座标
/// @param textsize1	鼠标没选中按钮时字体大小
/// @param textsize2	鼠标选中按钮时字体大小
/// @param button_string1	鼠标没选中按钮时显示的文本
/// @param button_string2	鼠标选中按钮时显示的文本 
/// @param click_1		按钮点击特效参数: 1.启动 0.不启动
/// @return 返回一个判断按钮是否点击的参数:被点击返回 1 没有被点击返回 0 
int button(int x1, int y1, int x2, int y2, int mouse_x, int mouse_y, int textsize1, int textsize2, TCHAR button_string1[], TCHAR button_string2[], int click_1)
{
	
	setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2);
	RECT buttonXY_1 = { x1, y1, x2, y2 };				// 创建对接按钮坐标。
	button_textzise(textsize1);							// 设置字体大小函数。

	setlinecolor(RED);								// 设置按钮黑色的外框线体函数。
	settextcolor(WHITE);								// 设置按钮白色的字体函数。
	setfillcolor(RGB(button_rgb1[0][0], button_rgb1[1][0], button_rgb1[2][0]));				// 使用修改颜色的 RGB 数组,可改变数组从而来自由改变颜色。

//fillroundrect(x1, y1, x2, y2, 20, 20);													// 画按钮矩形,有圆角 20 ,对接按钮的前四个坐标数组。
	//drawtext(button_string1, &buttonXY_1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);			// 设置居中显示按钮的文字。
	circle((x1 + (x2 - x1)/2 ), y1 + ((y2 - y1) / 2), (x2 - x1) / 2);
	if (mouse_x > x1 && mouse_y > y1 && mouse_x < x2 && mouse_y < y2)						// 判断鼠标是否在按钮内部,如果是就执行高亮按钮代码。
	{
		RECT buttonXY_2 = { x1, y1, x2, y2 };
		button_textzise(textsize2);							// 设置选中的按钮字体大小,产生选中字体的视觉差。

		setlinecolor(BLUE);									// 选中按钮后把线条变成蓝色。
		settextcolor(BLUE);									// 选中按钮后,把文字变成蓝色。
		setfillcolor(RGB(button_rgb2[0][0], button_rgb2[1][0], button_rgb2[2][0]));			// 使用修改颜色的 RGB 数组,可改变数组从而来自由改变颜色。
		setbkmode(TRANSPARENT);								// 把文字背景设置成透明的。

		//fillroundrect(x1, y1, x2, y2, 20, 20);				// 填充的矩形,画选中的,按钮的意思。
		//drawtext(button_string2, &buttonXY_2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);		// 在填充的矩形显示居中的高亮放大的文字。
		circle((x1 + (x2 - x1)/2), y1 + ((y2 - y1) / 2), (x2 - x1) / 2);
		if (click_1 == 1)									//如果点击等于 1 就启动点击按钮特效。
		{
			settextcolor(BLUE);								// 选中按钮后,把文字变成蓝色。
			button_textzise(textsize2 - 3);
			//fillroundrect(x1, y1, x2, y2, 20, 20);			// 填充的矩形,画选中的,按钮的意思。
			//drawtext(button_string2, &buttonXY_2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

			Sleep(100);										//显示按钮被点击的效果。
			settextcolor(BLUE);								// 选中按钮后,把文字变成蓝色。
			button_textzise(textsize2);
			//	fillroundrect(x1, y1, x2, y2, 20, 20);			// 填充的矩形,画选中的,按钮的意思。
	//drawtext(button_string2, &buttonXY_2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
			setfillcolor(RGB(rand(), rand(), rand()));
			fillcircle((x1+(x2 - x1)/2), y1 + ((y2 - y1) / 2), (x2 - x1)/2);
		}
		return 1;												// 返回 1 说明,鼠标点到了该按钮,可以通过 if 函数来判断返回值 1 要干什么。
	}
	return 0;													// 如果按钮没有被鼠标选中就返回 0 。
}

/// @brief	按钮传输参数函数
/// @param mouse_x	传入鼠标 x 坐标
/// @param mouse_y	传入鼠标 y 坐标
/// @param click		选择功能参数:1.启用鼠标点击功能 33.单纯的按钮功能
/// @param click_1		按钮点击特效参数: 1.启动 0.不启动
/// @return			可以通过 if 来返回其他参数来帮助程序退出
int buttonparm(int mouse_x, int mouse_y, int click, int click_1)
{
	FlushBatchDraw();// 批量绘图的开始处。

	if (button(70, 10 + 23, 70 + 20+p, 10 + 23 + 20 + p, mouse_x, mouse_y, 18, 21, button_string[0][0], button_string[1][0], click_1) == click)
	{
		//system("mspaint");				// 创建按钮,判断鼠标移动到这按钮启动高亮,且点击该按钮打开画图板。
	}
	if (button(70, 55 + 23, 70 + 20 + p, 55 + 23 + 20 + p, mouse_x, mouse_y, 18, 21, button_string[0][1], button_string[1][1], click_1) == click)
	{
		//system("start calc");			// 创建按钮,判断鼠标移动到这按钮启动高亮,且点击该按钮打开计算器。
	}
	if (button(70, 100 + 23, 70 + 20 + p, 100 + 23 + 20 + p, mouse_x, mouse_y, 18, 21, button_string[0][2], button_string[1][2], click_1) == click)
	{
		//system("start taskmgr");	// 创建按钮,判断鼠标移动到这按钮启动高亮,且点击该按钮打开电脑任务管理器
	}


	EndBatchDraw();// 批量绘图的结束处。
	return 0;
}

// GUI图形界面的初始化。
void lnitial_drawing()
{
	initgraph(width, high);													// 软件界面的大小定义。

	HWND hWnd = GetHWnd();													// 获得窗口句柄。
	SetWindowText(hWnd, _T("GUI 按钮实例"));									// 使用 Windows API 修改窗口名称。

	setbkcolor(WHITE);														// 设置背景为白色。
	cleardevice();															// 刷新白色背景的清屏函数。

	setfillcolor(BLUE);
	fillroundrect(0, 0, width - 1, high - 1, 20, 20);						// 上边是设置蓝色镇充,并画钜形为 20 大小的函数。

	setfillcolor(WHITE);
	fillroundrect(width - (width - 5), width - (width - 5), width - 5, high - 5, 20, 20);	// 是设置白色镇充,并画钜形为 20 大小的函数,设置白色镇充的函数。

	wcsncat_s(button_string[0][14], button_string[0][15], 30);				// 拼接官网网址的字符串,目的是成功让代码发布在绘图库官网上。

	buttonparm(NULL, NULL, 33, NULL);										// 调用按钮基本绘制函数,如没有这个,鼠标没有移动到软件里,那么按钮全都是一片空白。

	settextcolor(BLACK);													// 设置传入坐标 0 即不启动点击功能,也不启动启动点击判断高亮功能,就是显示所以显示在软件内,而且也只执行一次。
	button_textzise(15);

	button_textzise(5);
}
// 主函数,目的第二个参数藏有本程序运行的当前路径。
int main()
{
	// 初始化函数用于绘制底界面,及设置程序标题。
	lnitial_drawing();
	// 声明鼠标类型的变量。
	ExMessage mouse;
	// 嵌入式死循环。
	HWND wnd = GetHWnd();
	while (true)
	{
		FlushBatchDraw();// 批量绘图的开始处。

		mouse = getmessage(EM_MOUSE | EM_KEY);


		if (mouse.message == WM_MOUSEMOVE)
		{
			// 创建高亮按钮,只要鼠标移动到按钮上就会高亮
			button(70, 10 + 23, 70 + 20 + p, 10 + 23 + 20 + p, mouse.x, mouse.y, 18, 21, button_string[0][0], button_string[1][0], 0);
			button(70, 55 + 23, 70 + 20 + p, 55 + 23 + 20 + p, mouse.x, mouse.y, 18, 21, button_string[0][1], button_string[1][1], 0);
			button(70, 100 + 23, 70 + 20 + p, 100 + 23 + 20 + p, mouse.x, mouse.y, 18, 21, button_string[0][2], button_string[1][2], 0);

		}

		if (mouse.message == WM_LBUTTONDOWN)
		{

			// 创建点击按钮,只要鼠标点击到按钮上就发声对应功能
			if (button(70, 10 + 23, 70 + 20 + p, 10 + 23 + 20 + p, mouse.x, mouse.y, 18, 21, button_string[0][0], button_string[1][0], 1) == 1)
			{

				MessageBox(wnd, L"随机填充圆", L"提示", MB_OK | MB_ICONWARNING);			// 创建按钮,判断鼠标移动到这按钮启动高亮,且点击该按钮打开画图板。
			}
			if (button(70, 55 + 23, 70 + 20 + p, 55 + 23 + 20 + p, mouse.x, mouse.y, 18, 21, button_string[0][1], button_string[1][1], 1) == 1)
			{

				MessageBox(wnd, L"随机填充圆", L"提示", MB_OK | MB_ICONWARNING);			// 创建按钮,判断鼠标移动到这按钮启动高亮,且点击该按钮打开画图板。
			}
			if (button(70, 100 + 23, 70 + 20 + p, 100 + 23 + 20 + p, mouse.x, mouse.y, 18, 21, button_string[0][2], button_string[1][2], 1) == 1)
			{

				MessageBox(wnd, L"随机填充圆", L"提示", MB_OK | MB_ICONWARNING);			// 创建按钮,判断鼠标移动到这按钮启动高亮,且点击该按钮打开画图板。
			}

			flushmessage(EM_MOUSE);

		}
		EndBatchDraw();// 批量绘图的结束处。

	}
	FlushBatchDraw();// 批量绘图的结束处。
	// 关闭绘图库。
	closegraph();
	// 退出程序并返回零。
	return 0;
}
ava
舞乐耶

2022-11-8

技术讨论社区