mirror of
https://github.com/glfw/glfw.git
synced 2024-11-22 13:04:35 +00:00
Win32: Implemented run-time badge generator
This commit is contained in:
parent
7793239932
commit
582f7ff70b
@ -36,6 +36,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
// Returns the window style for the specified window
|
// Returns the window style for the specified window
|
||||||
//
|
//
|
||||||
@ -1643,9 +1644,90 @@ void _glfwSetWindowTaskbarProgressWin32(_GLFWwindow* window, int progressState,
|
|||||||
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to set taskbar progress state");
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to set taskbar progress state");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HICON GenerateBadgeIcon(HWND hWnd, int count)
|
||||||
|
{
|
||||||
|
HDC hdc = NULL, hdcMem = NULL;
|
||||||
|
HBITMAP hBitmap = NULL;
|
||||||
|
HBITMAP hOldBitmap = NULL;
|
||||||
|
HBITMAP hBitmapMask = NULL;
|
||||||
|
ICONINFO iconInfo;
|
||||||
|
HICON hIcon = NULL;
|
||||||
|
char countStr[3];
|
||||||
|
|
||||||
|
//Convert count to string (is guaranteed to be at max 2 digits)
|
||||||
|
countStr[2] = '\0';
|
||||||
|
sprintf(countStr, "%d", count);
|
||||||
|
WCHAR* countWStr = _glfwCreateWideStringFromUTF8Win32(countStr);
|
||||||
|
if (!countWStr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hdc = GetDC(hWnd);
|
||||||
|
hdcMem = CreateCompatibleDC(hdc);
|
||||||
|
hBitmap = CreateCompatibleBitmap(hdc, 16, 16);
|
||||||
|
hBitmapMask = CreateCompatibleBitmap(hdc, 16, 16);
|
||||||
|
ReleaseDC(hWnd, hdc);
|
||||||
|
hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);
|
||||||
|
|
||||||
|
SetTextColor(hdcMem, RGB(255, 255, 255)); //Use white text color
|
||||||
|
SetBkMode(hdcMem, TRANSPARENT); //Make font background transparent
|
||||||
|
|
||||||
|
//Draw numbers
|
||||||
|
TextOut(hdcMem, 0, 0, countWStr, lstrlen(countWStr));
|
||||||
|
|
||||||
|
SelectObject(hdc, hOldBitmap);
|
||||||
|
hOldBitmap = NULL;
|
||||||
|
|
||||||
|
iconInfo.fIcon = TRUE;
|
||||||
|
iconInfo.xHotspot = 0;
|
||||||
|
iconInfo.yHotspot = 0;
|
||||||
|
iconInfo.hbmMask = hBitmapMask;
|
||||||
|
iconInfo.hbmColor = hBitmap;
|
||||||
|
|
||||||
|
hIcon = CreateIconIndirect(&iconInfo);
|
||||||
|
|
||||||
|
DeleteDC(hdcMem);
|
||||||
|
DeleteObject(hBitmap);
|
||||||
|
DeleteObject(hBitmapMask);
|
||||||
|
|
||||||
|
_glfw_free(countWStr);
|
||||||
|
|
||||||
|
return hIcon;
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwSetWindowTaskbarBadgeWin32(_GLFWwindow* window, int count)
|
void _glfwSetWindowTaskbarBadgeWin32(_GLFWwindow* window, int count)
|
||||||
{
|
{
|
||||||
//TODO
|
HRESULT res = S_OK;
|
||||||
|
HICON icon = NULL;
|
||||||
|
|
||||||
|
if (!IsWindows7OrGreater())
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_FEATURE_UNAVAILABLE, "Win32: Taskbar badge is only supported on Windows 7 or newer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!window->win32.taskbarList)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (count != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
icon = GenerateBadgeIcon(window->win32.handle, count);
|
||||||
|
if (!icon)
|
||||||
|
{
|
||||||
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to set taskbar badge count");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = window->win32.taskbarList->lpVtbl->SetOverlayIcon(window->win32.taskbarList, window->win32.handle, icon, TEXT(""));
|
||||||
|
|
||||||
|
if(icon)
|
||||||
|
DestroyIcon(icon);
|
||||||
|
|
||||||
|
if (res != S_OK)
|
||||||
|
{
|
||||||
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to set taskbar badge count");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwGetWindowPosWin32(_GLFWwindow* window, int* xpos, int* ypos)
|
void _glfwGetWindowPosWin32(_GLFWwindow* window, int* xpos, int* ypos)
|
||||||
|
Loading…
Reference in New Issue
Block a user