From 04f6baa4298bd5e01d039a326e9f8927c5ff696e Mon Sep 17 00:00:00 2001 From: ALTaleX <2368730049@qq.com> Date: Thu, 28 Jul 2022 18:23:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG=E5=B9=B6=E6=94=B9?= =?UTF-8?q?=E5=96=84=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TranslucentFlyouts/ThemeHelper.h | 7 +- TranslucentFlyouts/Win32HookHelper.cpp | 192 +++++++++++++++--- TranslucentFlyouts/tflapi.cpp | 18 +- .../TranslucentFlyoutsGUI.cpp | 12 +- .../TranslucentFlyoutsGUI.rc | Bin 32370 -> 32218 bytes TranslucentFlyoutsGUI/resource.h | 3 + 6 files changed, 179 insertions(+), 53 deletions(-) diff --git a/TranslucentFlyouts/ThemeHelper.h b/TranslucentFlyouts/ThemeHelper.h index 8c59e22..a6abe8a 100644 --- a/TranslucentFlyouts/ThemeHelper.h +++ b/TranslucentFlyouts/ThemeHelper.h @@ -230,12 +230,13 @@ namespace TranslucentFlyoutsLib T&& t, BYTE dwOpacity = 255, DWORD dwFlag = BPPF_ERASE, - BOOL bUpdateTarget = TRUE + BOOL bUpdateTarget = TRUE, + BOOL bUseBlendFunction = TRUE ) { HDC hMemDC = nullptr; BLENDFUNCTION BlendFunction = {AC_SRC_OVER, 0, dwOpacity, AC_SRC_ALPHA}; - BP_PAINTPARAMS PaintParams = {sizeof(BP_PAINTPARAMS), dwFlag, nullptr, &BlendFunction}; + BP_PAINTPARAMS PaintParams = {sizeof(BP_PAINTPARAMS), dwFlag, nullptr, bUseBlendFunction ? &BlendFunction : nullptr}; HPAINTBUFFER hPaintBuffer = BeginBufferedPaint(hdc, Rect, BPBF_TOPDOWNDIB, &PaintParams, &hMemDC); if (hPaintBuffer and hMemDC) { @@ -246,7 +247,7 @@ namespace TranslucentFlyoutsLib SetTextAlign(hMemDC, GetTextAlign(hdc)); t(hMemDC, hPaintBuffer); - EndBufferedPaint(hPaintBuffer, TRUE); + EndBufferedPaint(hPaintBuffer, bUpdateTarget); } else { diff --git a/TranslucentFlyouts/Win32HookHelper.cpp b/TranslucentFlyouts/Win32HookHelper.cpp index 85552de..02fddfc 100644 --- a/TranslucentFlyouts/Win32HookHelper.cpp +++ b/TranslucentFlyouts/Win32HookHelper.cpp @@ -90,19 +90,18 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( { RECT Rect = {0, 0, 1, 1}; bool bResult = false; - - auto verify = [&](int y, int x, RGBQUAD * pRGBAInfo) + auto f = [&](HDC hMemDC, HPAINTBUFFER hPaintBuffer) { - if (pRGBAInfo->rgbReserved != 0xFF) + auto verify = [&](int y, int x, RGBQUAD * pRGBAInfo) { - bResult = true; - return false; - } - return true; - }; + if (pRGBAInfo->rgbReserved != 0xFF) + { + bResult = true; + return false; + } + return true; + }; - auto f = [&](HDC hMemDC, HPAINTBUFFER hPaintBuffer) - { HRESULT hr = DrawThemeBackgroundHook.OldFunction( hTheme, hMemDC, @@ -118,7 +117,13 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( } }; - DoBufferedPaint(hdc, &Rect, f, 0xFF, BPPF_ERASE | BPPF_NOCLIP, FALSE); + MARGINS mr = {}; + if (SUCCEEDED(GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, nullptr, &mr))) + { + Rect.right = max(mr.cxLeftWidth + mr.cxRightWidth, 1); + Rect.bottom = max(mr.cyTopHeight + mr.cyBottomHeight, 1); + } + DoBufferedPaint(hdc, &Rect, f, 0xFF, BPPF_ERASE | BPPF_NOCLIP, FALSE, FALSE); return bResult; }; @@ -131,6 +136,7 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( ::IntersectRect(&Rect, pRect, pClipRect); } + // 通用绘制函数 auto f = [&](HDC hMemDC, HPAINTBUFFER hPaintBuffer) { Clear(hdc, &Rect); @@ -144,7 +150,123 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( pClipRect ); - BufferedPaintSetAlpha(hPaintBuffer, &Rect, 0xFF); + // 为Windows 11准备的特化实现 + COLORREF Color = 0; + if ( + SUCCEEDED(hr) and + SUCCEEDED(GetThemeColor(hTheme, iPartId, iStateId, TMT_FILLCOLOR, &Color)) + ) + { + // 修复Windows 11以来的FILLCOLOR的丑陋边框 + bool bHasOpaqueBorder = false; + if (iPartId == MENU_POPUPITEM or iPartId == MENU_INTERNAL_POPUPITEM) + { + BYTE r = 0; + BYTE g = 0; + BYTE b = 0; + BYTE a = 0; + auto remove_opaque_border = [&](int y, int x, RGBQUAD * pRGBAInfo) + { + // 初始化要过滤的颜色 + if (x == 0 and y == 0) + { + RECT rect = {0, 0, 1, 1}; + auto f = [&](HDC hMemDC, HPAINTBUFFER hPaintBuffer) + { + HRESULT hr = S_OK; + auto initialize = [&](int y, int x, RGBQUAD * pRGBAInfo) + { + r = pRGBAInfo->rgbRed; + g = pRGBAInfo->rgbGreen; + b = pRGBAInfo->rgbBlue; + a = pRGBAInfo->rgbReserved; + return false; + }; + + if (iPartId == MENU_POPUPITEM) + { + hr = DrawThemeBackgroundHook.OldFunction( + hTheme, + hMemDC, + MENU_POPUPBACKGROUND, + 0, + &rect, + nullptr + ); + hr = DrawThemeBackgroundHook.OldFunction( + hTheme, + hMemDC, + MENU_POPUPITEM, + MPI_NORMAL, + &rect, + nullptr + ); + } + if (iPartId == MENU_INTERNAL_POPUPITEM) + { + hr = DrawThemeBackgroundHook.OldFunction( + hTheme, + hMemDC, + MENU_INTERNAL_POPUPBACKGROUND, + 0, + &rect, + nullptr + ); + hr = DrawThemeBackgroundHook.OldFunction( + hTheme, + hMemDC, + MENU_INTERNAL_POPUPITEM, + MPI_NORMAL, + &rect, + nullptr + ); + } + if (SUCCEEDED(hr)) + { + BufferedPaintWalkBits(hPaintBuffer, initialize); + } + }; + DoBufferedPaint(hdc, &rect, f, 0xFF, BPPF_ERASE | BPPF_NOCLIP, FALSE); + + // 没有边框,是完全透明的 + if (r == 0 and g == 0 and b == 0 and a == 0) + { + return false; + } + else + { + bHasOpaqueBorder = true; + } + } + + if ( + pRGBAInfo->rgbRed == r and + pRGBAInfo->rgbGreen == g and + pRGBAInfo->rgbBlue == b and + pRGBAInfo->rgbReserved == a + ) + { + pRGBAInfo->rgbRed = 0; + pRGBAInfo->rgbGreen = 0; + pRGBAInfo->rgbBlue = 0; + pRGBAInfo->rgbReserved = 0; + } + return true; + }; + // Windows 11聚焦的菜单项会有纯色Alpha为255的边框,之前我们抠掉了这层边框,这里我们与不透明度做一次运算再画到HDC + if (BufferedPaintWalkBits(hPaintBuffer, remove_opaque_border) and bHasOpaqueBorder) + { + auto partimage_background = [&](HDC hMemDC, HPAINTBUFFER hPaintBuffer) + { + HBRUSH hBrush = CreateSolidBrush(RGB(r, g, b)); + FillRect(hMemDC, &Rect, hBrush); + DeleteObject(hBrush); + BufferedPaintSetAlpha(hPaintBuffer, &Rect, a); + }; + DoBufferedPaint(hdc, &Rect, partimage_background, (BYTE)GetCurrentFlyoutOpacity(), BPPF_ERASE, TRUE); + } + } + } }; // 工具提示 @@ -244,6 +366,7 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( iPartId == MENU_POPUPBORDERS ) { + // 完全不透明的位图 if ( ( iPartId == MENU_POPUPBACKGROUND or @@ -280,6 +403,7 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( } } else + // 主题位图有透明部分 { // 对Windows 11 22H2的支持 // 先检查是否定义了MENU_INTERNAL_POPUPITEM和MENU_INTERNAL_POPUPBACKGROUND @@ -288,15 +412,18 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( IsThemePartDefined(hTheme, MENU_INTERNAL_POPUPITEM, 0) ) { - MyDrawThemeBackground( - hTheme, - hdc, - MENU_INTERNAL_POPUPBACKGROUND, - 0, - pRect, - pClipRect - ); - if (iPartId != MENU_INTERNAL_POPUPITEM or (iPartId == MENU_INTERNAL_POPUPITEM and iStateId != MPI_NORMAL)) + if (iPartId != MENU_INTERNAL_POPUPBACKGROUND) + { + MyDrawThemeBackground( + hTheme, + hdc, + MENU_INTERNAL_POPUPBACKGROUND, + 0, + pRect, + pClipRect + ); + } + if (!(iPartId == MENU_INTERNAL_POPUPITEM and iStateId == MPI_NORMAL)) { MyDrawThemeBackground( hTheme, @@ -308,17 +435,21 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( ); } } + else { - MyDrawThemeBackground( - hTheme, - hdc, - MENU_POPUPBACKGROUND, - 0, - pRect, - pClipRect - ); - if (iPartId != MENU_POPUPITEM or (iPartId == MENU_POPUPITEM and iStateId != MPI_NORMAL)) + if (iPartId != MENU_POPUPBACKGROUND) + { + MyDrawThemeBackground( + hTheme, + hdc, + MENU_POPUPBACKGROUND, + 0, + pRect, + pClipRect + ); + } + if (!(iPartId == MENU_POPUPITEM and iStateId == MPI_NORMAL)) { MyDrawThemeBackground( hTheme, @@ -330,7 +461,6 @@ HRESULT WINAPI TranslucentFlyoutsLib::MyDrawThemeBackground( ); } } - // 对Windows 11 22H2的支持 goto Default; } } diff --git a/TranslucentFlyouts/tflapi.cpp b/TranslucentFlyouts/tflapi.cpp index 98130bd..0e3b019 100644 --- a/TranslucentFlyouts/tflapi.cpp +++ b/TranslucentFlyouts/tflapi.cpp @@ -232,26 +232,10 @@ extern "C" VOID WINAPI GetVersionString(LPWSTR pszClassName, const int cchClassName) { - wcscpy_s(pszClassName, cchClassName, L"1.0.2"); + wcscpy_s(pszClassName, cchClassName, L"1.0.3"); } VOID WINAPI FlushSettingsCache() { - /*TCHAR pszMutexName[] = TEXT("Local\\FlushSettingsCache"); - HANDLE hMutex = OpenMutex(SYNCHRONIZE, FALSE, pszMutexName); - if (!hMutex) - { - hMutex = CreateMutex(nullptr, TRUE, pszMutexName); - } - else - { - WaitForSingleObject(hMutex, INFINITE); - } - if (hMutex) - { - g_settings.Update(); - ReleaseMutex(hMutex); - CloseHandle(hMutex); - }*/ } } \ No newline at end of file diff --git a/TranslucentFlyoutsGUI/TranslucentFlyoutsGUI.cpp b/TranslucentFlyoutsGUI/TranslucentFlyoutsGUI.cpp index 5f197d4..4523c29 100644 --- a/TranslucentFlyoutsGUI/TranslucentFlyoutsGUI.cpp +++ b/TranslucentFlyoutsGUI/TranslucentFlyoutsGUI.cpp @@ -428,7 +428,7 @@ INT_PTR CALLBACK DialogProc2(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPar SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon); DestroyIcon(hIcon); GetVersionString(pszLibVersion, MAX_PATH); - _stprintf_s(pszVersionInfo, TEXT("TranslucentFlyoutsLib v%s\nTranslucentFlyoutsGUI v1.0.2"), pszLibVersion); + _stprintf_s(pszVersionInfo, TEXT("TranslucentFlyoutsLib v%s\nTranslucentFlyoutsGUI v1.0.3"), pszLibVersion); SetWindowText(GetDlgItem(hWnd, IDC_STATIC4), pszVersionInfo); break; } @@ -521,7 +521,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPara TCHAR pszOpacityTip[512] = TEXT("褰撳墠涓嶉忔槑搴︼細"); TCHAR pszOpacity2Tip[512] = TEXT("姝ゅ弬鏁板喅瀹氬脊鍑虹獥鍙g殑涓嶉忔槑搴n姝ゅ艰秺楂橈紝瓒婁笉閫忔槑(Opaque)锛岀獥鍙h儗鍚庣殑鍐呭鍙搴﹁秺浣庯紝鍙嶄箣浜︾劧\n鍙湁娓叉煋瀹屽叏涓嶉忔槑鐨勪富棰樹綅鍥句細鍙楁褰卞搷锛屾甯告儏鍐典笅涓嶅簲涔熶笉闇瑕佽缃负255鎴0"); TCHAR pszBorderTip[512] = TEXT("姝ゅ弬鏁板喅瀹氬脊鍑虹獥鍙f槸鍚﹀叿鏈変竴涓澶栫殑杈规鎴栨槸闃村奖\n褰撶獥鍙h璁剧疆鐗规晥鏃讹紝杈规涔熶細琚悓姝ユ坊鍔犲埌绐楀彛\n褰撲娇鐢ㄩ珮閫忔槑搴﹁缃椂锛岃繖瀵逛簬澧炲己瑙嗚瀵规瘮搴﹀崄鍒嗘湁鐢╘n"); - TCHAR pszColorizeOptionTip[512] = TEXT("姝ゅ弬鏁板喅瀹氬脊鍑鸿彍鍗曢紶鏍囨偓鍋滈」鐨勪富棰樹綅鍥続lphaBlend娣峰悎鏂瑰紡锛屽嵆涓嶉忔槑搴﹂夋嫨鏂规\n閫氬父鎯呭喌涓嬮夋嫨<涓嶉忔槑>澧炲姞瀵规瘮搴︼紝浣哤indows 11榛樿涓婚榛戞殫妯″紡涓嬪叿鏈夌己闄穃n鍏跺湪杈冮珮閫忔槑搴︿笅鑿滃崟椤逛細鍙堜竴灞傞粦杈癸紝鎵浠ユ帹鑽愪娇鐢<璺熼殢閫忔槑搴>璁剧疆\n浣嗘槸濡傛灉浣犱粈涔堥兘涓嶇煡閬擄紝灏遍夋嫨<鑷姩璁$畻(Auto)>"); + TCHAR pszColorizeOptionTip[512] = TEXT("姝ゅ弬鏁板喅瀹氬脊鍑鸿彍鍗曢紶鏍囨偓鍋滈」鐨勪富棰樹綅鍥続lphaBlend娣峰悎鏂瑰紡锛屽嵆涓嶉忔槑搴﹂夋嫨鏂规\n閫氬父鎯呭喌涓嬮夋嫨<涓嶉忔槑>澧炲姞瀵规瘮搴︼紝浣哤indows 11 22H2涔嬪墠榛樿涓婚榛戞殫妯″紡涓嬪叿鏈夌己闄穃n鍏跺湪杈冮珮閫忔槑搴︿笅鑿滃崟椤逛細鍙堜竴灞傞粦杈癸紝鎵浠ユ帹鑽愪娇鐢<璺熼殢閫忔槑搴>璁剧疆\n浣嗘槸濡傛灉浣犱粈涔堥兘涓嶇煡閬擄紝灏遍夋嫨<鑷姩璁$畻>"); TCHAR pszResetTip[512] = TEXT("娉ㄦ剰姝ら夐」浼氬垹闄ら粯璁ょ殑閰嶇疆淇℃伅锛屾竻闄や綘瀵规搴旂敤鐨勬巿鏉僜n浣嗘槸涓嶅奖鍝嶇敤鎴风晫闈㈤夐」鐨勮缃紝鍗充笉浼氬奖鍝嶈嚜鍚姩\n濡傛灉浣犳兂鍋滅敤姝ゅ簲鐢ㄤ笖涓嶆畫鐣欎俊鎭紝鐐瑰嚮瀹冩垜浼氳嚜鍔ㄥ府浣犳竻鐞嗘帀"); TCHAR pszAutoRunTip[512] = TEXT("璇ラ夐」浼氳浣犲紑鏈烘椂杩愯姝ょ▼搴廫n浣嗗鏋滀綘闇瑕佷互绠$悊鍛樻潈闄愯嚜鍚姩锛岃鍦ㄨ鍒掍换鍔″娣诲姞鑷惎鍔ㄤ换鍔n鑰屼笉鏄湪姝ゅ璁剧疆鑷惎鍔紝璇ュ璁剧疆涓庤鍒掍换鍔′繚鎸佺嫭绔"); if (GetUserDefaultUILanguage() != MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)) @@ -654,6 +654,14 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPara } if (!_tcsicmp(szBuffer, pszFollow)) { + TCHAR pszText[MAX_PATH + 1] = _T("娉ㄦ剰锛岃嚜1.0.3寮濮<璺熼殢閫忔槑搴>宸茶寮冪敤銆傚叾渚濇棫鍙互姝e父宸ヤ綔锛屼絾鐢ㄦ埛娌℃湁鐞嗙敱涔熶笉闇瑕佺户缁娇鐢ㄨ鍊"); + TCHAR pszCaption[MAX_PATH + 1] = _T("琚純鐢ㄧ殑鍊"); + if (GetUserDefaultUILanguage() != MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)) + { + LoadString(g_hInst, IDS_DEPRECATED, pszCaption, MAX_PATH); + LoadString(g_hInst, IDS_DEPRECATEDTEXT, pszText, MAX_PATH); + } + ShowBalloonTip(g_mainWindow, pszText, pszCaption, 3000, NIIF_INFO); dwColorizeOption = 1; } if (!_tcsicmp(szBuffer, pszAuto)) diff --git a/TranslucentFlyoutsGUI/TranslucentFlyoutsGUI.rc b/TranslucentFlyoutsGUI/TranslucentFlyoutsGUI.rc index c06ea99de9c7fd65af545fce4d62a3e8013a52a2..1cc7a8279e8d85332287b1c3ca968b99dcecbf4a 100644 GIT binary patch delta 502 zcmZutJxc>Y6r5Ewh)4vH!^%Yq5ha+5VkZO>Fjf4B0lOr37xS&&U6i0;VQ;g4LnLz8 z`a^6i?JR7yaCR@)Xt8&*Z{N(DH=p0)^-B!zE9&E57(F_b@#O+~2oR#mzXJ~vS#;nN zRpDa5dp=5^J_}Kd-WwT_JYr4vd+745q*hxe;yAi%4W`yyQhc;o?&6GOEf%6-S~ac_ z)%ikkH61P_Y}nX?9c_hHLY3Xwxg7G?$05JFbW!3zr^J%Am?QDrcyc&G&vq$SChnk5 zv7&4J%YACit5kh*Ml)h7WUFL<xvOOSE&dIram8lWlYW delta 196 zcmcchoAJ{h#tnT5lMRfdCO@eiF>SvaGT)3Ssi1E@3?tPy0C0z)_hh)!Y1XDA06tiWIhgbEBUK;w!SvVkmL ZpiBzT(CdZb?34FY>A+klv#I(P695V@IaUAw diff --git a/TranslucentFlyoutsGUI/resource.h b/TranslucentFlyoutsGUI/resource.h index a77c4d1..5f9a2af 100644 --- a/TranslucentFlyoutsGUI/resource.h +++ b/TranslucentFlyoutsGUI/resource.h @@ -32,6 +32,9 @@ #define IDS_FO 160 #define IDS_AC 161 #define IDS_OPAC 162 +#define IDS_DEPRECATED 163 +#define IDS_DC_V_T 164 +#define IDS_DEPRECATEDTEXT 164 #define IDC_COMBO1 1001 #define IDC_COMBO2 1002 #define IDC_SLIDER1 1003