目录
文章目录
先看一下效果图
#实现要关注以下几点
- WindowsAPI——如何获取桌面图标个数
- WindowsAPI——如何获取桌面分辨率
- WindowsAPI——如何设置每个图标的位置
- WindowsAPI——如何更新所有图标的信息
- Qt——定时器如何使用
- Qt——容器如何使用
- 算法——如何控制图标跑起来
WindowsAPI——如何获取桌面图标个数
注意:这里要引用的文件有:
#include "Windows.h"
#include "CommCtrl.h" // ListView_GetItemCount
#pragma comment(lib, "User32.lib")
代码如下:
HWND m_hDestTop;
m_hDestTop = ::FindWindow(L"progman", NULL);
m_hDestTop = ::FindWindowEx(m_hDestTop, 0, L"shelldll_defview", NULL);
m_hDestTop = ::FindWindowEx(m_hDestTop, 0, L"syslistview32", NULL);
int Nm=(int)::SendMessage( m_hDestTop, LVM_GETITEMCOUNT, 0, 0);
return Nm;
WindowsAPI——如何获取桌面分辨率*
代码如下:
int width = GetSystemMetrics ( SM_CXSCREEN );
int height= GetSystemMetrics ( SM_CYSCREEN );
WindowsAPI——如何设置每个图标的位置
::SendMessage( m_hDestTop, LVM_SETITEMPOSITION, index, MAKELPARAM( x, y ));
WindowsAPI——如何更新所有图标的信息
ListView_RedrawItems(m_hDestTop, 0, LVM_GETITEMCOUNT- 1);
::UpdateWindow(m_hDestTop);
Qt——定时器如何使用
先引用头文件
#include <QTimer>
如何使用定时器:
QTimer *m_timer = Q_NULLPTR;
m_timer = new QTimer(this);
//在槽里面控制移动
connect(m_timer, &QTimer::timeout, this, &MainWindow::onDoRunning);
//控制定时器的开关,注意start里面是指定定时器的时间间隔
if(m_timer->isActive()) {
m_timer->stop();
} else {
m_timer->start(100);
}
Qt——容器如何使用
如何使用List容器:
QList <QPoint> m_list;
//用QList来装每个图标的点信息
m_list << QPoint(x, y);
//打印容器内某个图标的点信息
qDebug() << m_list.at(i);
//删除最后一个图标点信息
m_list.removeLast();
//插入一个坐标到第一个点
m_list.insert(0, QPoint(x, y));
C++——如何控制坐标到指定位置转弯
算法——如何控制图标跑起来
1、初始化各个图标位置
2、让各个图标按照我们想要的顺序排列
3、把各个图标位置装到QList容器中
4、调用WinAPI把图标移动到指定位置
5、每次跑动时,删除QList最后一项,然后在QList首项前插入我们算好的预跑坐标
6、按照QList中的数据更新所有图标位置。
#仍然存在的问题
系统不会按照预期的图标位置移动图标。比如说:(10,10),系统并不会移动图标到这个位置,而是移动图标到最近的网格布局的位置中。
~~ 如有更好的办法,欢迎提出来,大家一起讨论 ~~