天天看點

透明窗體-slider控件

參考文章:http://www.vckbase.com/document/viewdoc/?id=333

一些常量:

WS_EX_LAYERED = 0x80000;

LWA_ALPHA = 0x2;

LWA_COLORKEY=0x1

其中dwFlags有LWA_ALPHA和LWA_COLORKEY

LWA_ALPHA被設定的話,通過bAlpha決定透明度.

LWA_COLORKEY被設定的話,則指定被透明掉的顔色為crKey,其他顔色則正常顯示.

注:要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴充屬性(舊sdk也沒有的).

1、首先設定透明視窗屬性(在OnInitDialog函數中):

//加入WS_EX_LAYERED擴充屬性

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);//設定背景透明屬性

2、添加實作透明度函數:

參數 transparency):透明度值

void CTestDlg::SetLayeredWindow(int transparency)

{

 HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));

 if(hInst)

 {

  typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);

  MYFUNC fun = NULL;

  //取得SetLayeredWindowAttributes函數指針

  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");

  if(fun)fun(this->GetSafeHwnd(),0,(BYTE)transparency,2);

  //如果設定為1,那麼将設定RGB(0,0,0)顔色的透明度:220

  //if(fun)fun(this->GetSafeHwnd(),RGB(0,0,0),220,1);

  FreeLibrary(hInst);

 }

}

3、添加Slider控件及綁定變量m_Slider

   在OnInitDialog,設定範圍:15-255(因為透明度的值範圍為:0-255,而0的話,到時對話框将會失去焦點而消失)

   同時設定透明度初始值,代碼如下:

   m_Slider.SetRange(15,255);//設定滑動範圍

   m_Slider.SetPos(255);//設定滑動初始位置

   SetLayeredWindow(255);//初始為正常視窗(透明度值:255)

4、添加slider控件的消息響應函數:

   首先了解下如下兩個消息差別:

NM_CUSTOMDRAW,是子控件通知其父控件它已經完成重畫功能,對Slider來說也就是我們每次滑鼠按

住滑塊移動一下就能使滑塊向擁有該滑塊的Slider産生一個NM_CUSTOMDRAW消息,以便使用者實時獲得

移動滑塊時的是實時值。

NM_RELEASEDCAPTURE,是子控件被滑鼠按住拖動到适當位置以後滑鼠釋放時子控件向父控件産發送的

消息,對于Slider來說就是每次滑塊被滑鼠拖曳完滑鼠釋放的時候滑塊給Slider發送的消息。

是以我們選擇NM_CUSTOMDRAW,消息響應函數OnCustomdrawSlider1代碼如下:

void CTestDlg::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)

{

 // TODO: Add your control notification handler code here

 CSliderCtrl   *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);

 int iPos = pSlidCtrl->GetPos();//取得目前位置值 

 SetLayeredWindow(iPos);

 CString strPos;

 strPos.Format(_T("%d"),iPos);

        //這個CStatic控件是設定顯示滑塊值的,可自行添加

 GetDlgItem(IDC_STATIC_INFO)->SetWindowText(strPos);

 *pResult = 0;

}

或者可在對話框的ON_WM_HSCROLL消息響應函數OnHScroll中添加為:

//水準滾動條

void CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

 // TODO: Add your message handler code here and/or call default

 switch(nSBCode)  

 {  

 case SB_THUMBTRACK: //拖動滾動滑塊時  

  if(pScrollBar->m_hWnd==m_Slider.m_hWnd) //根據pScrollBar确定是那個滾動條  

  {  

   int iPos = m_Slider.GetPos();//取得目前位置值 

   SetLayeredWindow(iPos);

   CString strPos;

   strPos.Format(_T("%d"),iPos);

   GetDlgItem(IDC_STATIC_INFO)->SetWindowText(strPos); 

  }  

  break;  

 default:

  break;

 }

 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}