1. 程式人生 > 實用技巧 >產生半透明的對話方塊和視窗沒有閃爍

產生半透明的對話方塊和視窗沒有閃爍

問題 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