Power Mode Activated

Atom 上曾经出现过一个非常著名的插件,名字叫 Activate Power Mode ,这个插件出现之后迅速引爆了一股热潮,程序员们也纷纷将插件移植到各个编辑器上去。

然而 Sublime Text 由于开放给插件的 API 太少而且都是关于文本编辑之类的操作,直到我写这篇文章的时候,一直都没有人能将这个插件移植到 Sublime Text 上面去。

本文通过添加辅助程序程序的方式在 Sublime Text 上实现了类似 Activate Power Mode 的效果。

粒子发射器

init_count = 5 + (rand() % 10);
m_velocity_y += Gdiplus::REAL(0.075); // 模拟重力使其加速
m_x += m_velocity_x;
m_y += m_velocity_y;
m_alpha *= 0.96; // 增加透明度,减淡颜色
is_alive = m_alpha > 0.1 * 255 ? true : false;

初始化 GDI+

ULONG_PTR m_gdiplusToken;
Gdiplus::GdiplusStartupInput m_gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, nullptr);
Gdiplus::GdiplusShutdown(m_gdiplusToken);

绘图

HDC hdc = GetDC()->m_hDC;
HDC hdc_memory = CreateCompatibleDC(hdc); // 内存DC
HBITMAP hbitmap = CreateCompatibleBitmap(hdc, window_x, window_y); // 位图
SelectObject(hdc_memory, hbitmap);
Gdiplus::Graphics graphics(hdc_memory);
Gdiplus::GraphicsPath path;
path.AddEllipse(m_x, m_y, m_size, m_size); // 画圆
Gdiplus::PathGradientBrush brush(&path);
brush.SetCenterColor(Gdiplus::Color(alpha,
    m_color.GetRed(), m_color.GetGreen(), m_color.GetBlue())); // 设置画刷颜色
Gdiplus::Color colors[] = { Gdiplus::Color::AlphaShift };
int count = 1;
brush.SetSurroundColors(colors, &count); // 设置画刷渐变效果
graphics.FillEllipse(&brush, m_x, m_y, m_size, m_size);

显示

假设我们已经获得了绘图的坐标以及颜色,而且创建好了一个分层窗口,接下来就可以用 UpdateLayeredWindow 来将绘图的结果显示在屏幕上了。

::UpdateLayeredWindow(m_hWnd, hdc_screen, &m_position, &m_size,
    hdc_memory, &m_point, 0, &m_blend, ULW_ALPHA);

效果如图所示:

Hanabi Preview