產生半透明的對話方塊和視窗沒有閃爍
阿新 • • 發佈:2020-08-11
問題 AnimateWindow () API AW_BLEND引數 應該消失在windows順利。基本上,它有兩個缺點: 文字和ListView控制元件(和其他)並沒有呈現 正確地在淡入。你不能指定一個半透明的視窗,即。後, 動畫,是不透明的視窗。 點選“不”在示例專案展示了這兩個問題。 解決方法? 似乎有一個簡單的解決方法:新增 WS_EX_LAYERED擴充套件風格的視窗和呼叫 與所需的alpha值,SetLayeredWindowAttributes () 描述在MSDN Library和各種各樣的其他來源。 不幸的是,這沒有奏效,至少在我的XP專業版系統。的程式碼 產生一個非常討厭的閃爍:視窗區域 最初的黑色。 解決方案 下面的程式碼展示瞭如何在一個對話方塊消失predefinded 沒有閃爍的半透明: 隱藏,收縮,複製Code
INT_PTR CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { RECT rcDesktop; RECT rcMe; BYTE bTranslucency; const DWORD ANIMATION_MILLIS = 200; const BYTE TRANSLUCENCY = 192; const BYTE TRANSLUCENCY_STEP = 16; const DWORD TRANSLUCENCY_TIMEOUT = TRANSLUCENCY_STEP * ANIMATION_MILLIS / TRANSLUCENCY; switch (uMsg) { case WM_INITDIALOG: // Make it a layered window. ::SetWindowLong(hwndDlg, GWL_EXSTYLE, ::GetWindowLong(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED); // Completely transparent window - note the third parameter ::SetLayeredWindowAttributes(hwndDlg, 0, 0, LWA_ALPHA); // Show it _first_ ::ShowWindow(hwndDlg, SW_SHOW); // Redraw contents NOW - no flickering since the window's not visible ::RedrawWindow(hwndDlg, NULL, NULL, RDW_UPDATENOW); // Normally, you would use a timer here... for (bTranslucency = 0; bTranslucency < TRANSLUCENCY; bTranslucency+=TRANSLUCENCY_STEP) { // Adjust the translucency ::SetLayeredWindowAttributes(hwndDlg, 0, bTranslucency, LWA_ALPHA); // Wait ::Sleep(TRANSLUCENCY_TIMEOUT); } // Set the final translucency ::SetLayeredWindowAttributes(hwndDlg, 0, bTranslucency, LWA_ALPHA); break; } return 0; }
注意,呼叫顯示視窗()通常是做的 CreateDialogXXX如果對話方塊模板()函式 WS_VISIBLE風格。對於我們的目的,我們要做的是對的 在應對WM_INITDIALOG訊息。 本文轉載於:http://www.diyabc.com/frontweb/news12415.html