[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);
hFont = CreateFont(-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, FF_DONTCARE, _T("Tahoma"));
/* Draw hbmColor */
hBmpOld = SelectObject(hdc, hbmColor);
SetDCBrushColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
FillRect(hdc, &rect, (HBRUSH)GetStockObject(DC_BRUSH));
hFontOld = SelectObject(hdc, hFont); hFontOld = SelectObject(hdc, hFont);
DrawText(hdc, _tcsupr(szBuf), 2, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
SelectObject(hdc, hBmpNew); SetBkMode(hdc, TRANSPARENT);
PatBlt(hdc, 0, 0, 16, 16, BLACKNESS); DrawText(hdc, szBuf, 2, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
SelectObject(hdc, hBmpOld);
SelectObject(hdc, hFontOld); SelectObject(hdc, hFontOld);
SelectObject(hdc, hBmpOld);
IconInfo.hbmColor = hBitmap; /* Fill hbmMono by black */
IconInfo.hbmMask = hBmpNew; hBmpOld = SelectObject(hdc, hbmMono);
PatBlt(hdc, 0, 0, CX_ICON, CY_ICON, BLACKNESS);
SelectObject(hdc, hBmpOld);
/* Create an icon from hbmColor and hbmMono */
IconInfo.hbmColor = hbmColor;
IconInfo.hbmMask = hbmMono;
IconInfo.fIcon = TRUE; IconInfo.fIcon = TRUE;
hIcon = CreateIconIndirect(&IconInfo); hIcon = CreateIconIndirect(&IconInfo);
DeleteObject(hBmpNew); /* Clean up */
DeleteObject(hBmpOld); DeleteObject(hbmColor);
DeleteObject(hbmMono);
DeleteObject(hFont); DeleteObject(hFont);
}
}
DeleteDC(hdc); DeleteDC(hdc);
DeleteObject(hBitmap);
return hIcon; return hIcon;
} }