drawerror是怎么实现的?

鼠标后面跟着出现错误图标,这种效果叫drawerror。今天就来讲讲drawerror是如何实现的。

drawerror其实调用了一个WindowsAPI——drawicon,它的效果是在指定位置画出一个图标。drawicon有4个参数,第一个我们先不管他,填NULL就行了。第二第三个参数是xy坐标。第四个参数是图标,一个HICON变量。

现在的问题是:我们该如何获取鼠标指针的xy坐标呢?这里我们可以用GetCursorPos配合POINT类型的变量。首先定义POINT变量p,然后再把p的指针传给GetCursorPos,大概是这样:

// C++
POINT p;
GetCursorPos(&p);

现在p.x就是鼠标的x坐标,p.y就是鼠标的y坐标了。

第二个问题:error图标去哪里找呢?

Windows预定义了一些图标供我们开发者使用,分别是:

IDI_ERROR          错误图标

IDI_WARNING       感叹号

IDI_QUESTION      问号

IDI_INFORMATION       信息图标

IDI_APPLICATION        默认应用程序图标

IDI_SHIELD                  安全防护罩图标(这个图标有亿些奇怪,DEV-C++直接使用这个会报错,可以写      MAKEINTRESOURCE(32518)          )

加载图标就是LoadIcon(0,/*图标的名字*/);

好了,可以开始敲代码了:

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

signed main()
{
	ShowWindow(GetConsoleWindow(),SW_HIDE); // 这个函数没讲过,反正就是隐藏自己的控制台窗口
   POINT p;
	while (1)
	{
		GetCursorPos(&p);
		DrawIcon(GetDC(0),p.x,p.y,LoadIcon(0,IDI_ERROR)); // 这里也可以改成其他图标,不过得改个名字,比如drawinformation之类的
		Sleep(10);
	}
    return 0;
}

当然啦,6个图标肯定不够我们玩,那么还有其他图标吗?

答案是:有,在shell32.dll里!

那如何调用呢?

这里笔者写了一段drawshell32的代码:

// 加载shell32.dll,随机获取一种图标,然后画出来
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

signed main()
{
	srand(time(0));
	HINSTANCE hShell = LoadLibrary("shell32.dll");
	ShowWindow(GetConsoleWindow(),SW_HIDE);
    POINT p;
	while (1)
	{
		GetCursorPos(&p);
		DrawIcon(GetWindowDC(GetDesktopWindow()),p.x,p.y,LoadIcon(hShell,MAKEINTRESOURCE(rand() % 256)));
		Sleep(10);
	}
    return 0;
}

好啦,我们下期再见!

2022.8.12 更新:

在这里补充一下:如果要加载自己的图标可以使用LoadImage

可以参考:https://blog.csdn.net/hisinwang/article/details/45752089

2025.5.18 更新:

这是我三年级在B站上发布的专栏呢,最近突然看到了,就在博客上也发一下吧~希望你们喜欢!


drawerror是怎么实现的?
https://www.leonxie.cn/archives/drawerror
作者
LeonXie
发布于
2025年05月18日
更新于
2025年05月18日
许可协议