[KBSWITCH] Refactor CreateTrayIcon

This commit is contained in:
Katayama Hirofumi MZ 2022-08-24 10:21:50 +09:00
parent f974f02881
commit 0991cedca7

View file

@ -10,6 +10,8 @@
#include "kbswitch.h" #include "kbswitch.h"
#define WM_NOTIFYICONMSG (WM_USER + 248) #define WM_NOTIFYICONMSG (WM_USER + 248)
#define CX_ICON 16
#define CY_ICON 16
PKBSWITCHSETHOOKS KbSwitchSetHooks = NULL; PKBSWITCHSETHOOKS KbSwitchSetHooks = NULL;
PKBSWITCHDELETEHOOKS KbSwitchDeleteHooks = NULL; PKBSWITCHDELETEHOOKS KbSwitchDeleteHooks = NULL;
@ -30,70 +32,65 @@ ULONG ulCurrentLayoutNum = 1;
static HICON static HICON
CreateTrayIcon(LPTSTR szLCID) CreateTrayIcon(LPTSTR szLCID)
{ {
LANGID lId; LANGID LangID;
TCHAR szBuf[3]; TCHAR szBuf[3];
HDC hdc, hdcsrc; HDC hdc;
HBITMAP hBitmap, hBmpNew, hBmpOld; HBITMAP hbmColor, hbmMono, hBmpOld;
RECT rect; RECT rect;
HFONT hFontOld, hFont = NULL; HFONT hFontOld, hFont = NULL;
ICONINFO IconInfo; ICONINFO IconInfo;
HICON hIcon = NULL; HICON hIcon = NULL;
LOGFONT lf;
lId = (LANGID)_tcstoul(szLCID, NULL, 16); /* Getting "EN", "FR", etc. from English, French, ... */
if (GetLocaleInfo(lId, LangID = (LANGID)_tcstoul(szLCID, NULL, 16);
LOCALE_SISO639LANGNAME, if (!GetLocaleInfo(LangID, LOCALE_SISO639LANGNAME, szBuf, ARRAYSIZE(szBuf)))
szBuf,
ARRAYSIZE(szBuf)) == 0)
{ {
StringCchCopy(szBuf, ARRAYSIZE(szBuf), _T("??")); StringCchCopy(szBuf, ARRAYSIZE(szBuf), _T("??"));
} }
CharUpper(szBuf);
hdcsrc = GetDC(NULL); /* Create hdc, hbmColor and hbmMono */
hdc = CreateCompatibleDC(hdcsrc); hdc = CreateCompatibleDC(NULL);
hBitmap = CreateCompatibleBitmap(hdcsrc, 16, 16); hbmColor = CreateCompatibleBitmap(hdc, CX_ICON, CY_ICON);
ReleaseDC(NULL, hdcsrc); hbmMono = CreateBitmap(CX_ICON, CY_ICON, 1, 1, NULL);
if (hdc && hBitmap) /* Create a font */
{ ZeroMemory(&lf, sizeof(lf));
hBmpNew = CreateBitmap(16, 16, 1, 1, NULL); lf.lfHeight = -11;
if (hBmpNew) lf.lfCharSet = ANSI_CHARSET;
{ lstrcpyn(lf.lfFaceName, _T("Tahoma"), ARRAYSIZE(lf.lfFaceName));
hBmpOld = SelectObject(hdc, hBitmap); hFont = CreateFontIndirect(&lf);
rect.right = 16;
rect.left = 0;
rect.bottom = 16;
rect.top = 0;
SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT)); SetRect(&rect, 0, 0, CX_ICON, CY_ICON);
SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
ExtTextOut(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, _T(""), 0, NULL); /* Draw hbmColor */
hBmpOld = SelectObject(hdc, hbmColor);
SetDCBrushColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
FillRect(hdc, &rect, (HBRUSH)GetStockObject(DC_BRUSH));
hFontOld = SelectObject(hdc, hFont);
SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, szBuf, 2, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
SelectObject(hdc, hFontOld);
SelectObject(hdc, hBmpOld);
hFont = CreateFont(-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, /* Fill hbmMono by black */
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, hBmpOld = SelectObject(hdc, hbmMono);
DEFAULT_QUALITY, FF_DONTCARE, _T("Tahoma")); PatBlt(hdc, 0, 0, CX_ICON, CY_ICON, BLACKNESS);
SelectObject(hdc, hBmpOld);
hFontOld = SelectObject(hdc, hFont); /* Create an icon from hbmColor and hbmMono */
DrawText(hdc, _tcsupr(szBuf), 2, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); IconInfo.hbmColor = hbmColor;
SelectObject(hdc, hBmpNew); IconInfo.hbmMask = hbmMono;
PatBlt(hdc, 0, 0, 16, 16, BLACKNESS); IconInfo.fIcon = TRUE;
SelectObject(hdc, hBmpOld); hIcon = CreateIconIndirect(&IconInfo);
SelectObject(hdc, hFontOld);
IconInfo.hbmColor = hBitmap;
IconInfo.hbmMask = hBmpNew;
IconInfo.fIcon = TRUE;
hIcon = CreateIconIndirect(&IconInfo);
DeleteObject(hBmpNew);
DeleteObject(hBmpOld);
DeleteObject(hFont);
}
}
/* Clean up */
DeleteObject(hbmColor);
DeleteObject(hbmMono);
DeleteObject(hFont);
DeleteDC(hdc); DeleteDC(hdc);
DeleteObject(hBitmap);
return hIcon; return hIcon;
} }