先画一个无填充的矩形或圆,请问怎么实现用鼠标点一下它就可以给它填充颜色
举报
如何实现 画了一个无填充的矩形或圆,用鼠标点一下它就可以给它填充颜色
举报
我用按钮函数给你改了一个,点击圆,用随机填充这个圆的颜色,效果还不错,你参考参考
#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;
}