MFC 透明窗口两种代码对比
两种方法都用到
BOOL SetLayeredWindowAttributes1(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
第一种:
VideoMark.h
1 #if !defined(AFX_VIDEOMARK_H__7BDB9F62_B2C1_4634_89E4_1FE739829730__INCLUDED_) 2 #define AFX_VIDEOMARK_H__7BDB9F62_B2C1_4634_89E4_1FE739829730__INCLUDED_ 3 4 #if _MSC_VER > 1000 5 #pragma once 6 #endif // _MSC_VER > 1000 7 // VideoMark.h : header file 8 // 9 10 ///////////////////////////////////////////////////////////////////////////// 11 // CVideoMark window 12 #include "resource.h" 13 class CVideoMark : public CDialog 14 { 15 DECLARE_DYNAMIC(CVideoMark) 16 17 public: 18 CVideoMark(CWnd* pParent = NULL); // standard constructor 19 virtual ~CVideoMark(); 20 21 // Dialog Data 22 enum { IDD = IDD_MARKDIALOG }; 23 24 protected: 25 CFont m_font; 26 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 27 void DrawMark(CDC *pDC,CRect rt); 28 29 30 DECLARE_MESSAGE_MAP() 31 public: 32 virtual BOOL OnInitDialog(); 33 afx_msg void OnPaint(); 34 afx_msg BOOL OnEraseBkgnd(CDC* pDC); 35 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 36 afx_msg LRESULT OnUpdateGrData(WPARAM wParam,LPARAM lParam); 37 private: 38 int m_lightval; 39 40 }; 41 ///////////////////////////////////////////////////////////////////////////// 42 //{{AFX_INSERT_LOCATION}} 43 // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 44 45 #endif // !defined(AFX_VIDEOMARK_H__7BDB9F62_B2C1_4634_89E4_1FE739829730__INCLUDED_)
VideoMark.cpp
1 // VideoMark.cpp : implementation file 2 // 3 4 #include "stdafx.h" 5 #include "VideoMark.h" 6 #ifdef _DEBUG 7 #define new DEBUG_NEW 8 #undef THIS_FILE 9 static char THIS_FILE[] = __FILE__; 10 #endif 11 12 ///////////////////////////////////////////////////////////////////////////// 13 // CVideoMark 14 #define LWA_COLORKEY 0x00000001 15 #define LWA_ALPHA 0x00000002 16 17 IMPLEMENT_DYNAMIC(CVideoMark, CDialog) 18 19 CVideoMark::CVideoMark(CWnd* pParent /*=NULL*/) 20 : CDialog(CVideoMark::IDD, pParent) 21 { 22 // m_HoverWnd=NULL; 23 m_lightval=-1; 24 25 m_font.CreateFont(16, 26 0, 0, 0, 27 FW_NORMAL, 28 0, 0, 0, 0, 29 0, 0, 0, 0, 30 _T("幼圆")); 31 32 } 33 34 CVideoMark::~CVideoMark() 35 { 36 } 37 38 void CVideoMark::DoDataExchange(CDataExchange* pDX) 39 { 40 CDialog::DoDataExchange(pDX); 41 } 42 43 44 BEGIN_MESSAGE_MAP(CVideoMark, CDialog) 45 46 ON_WM_PAINT() 47 ON_WM_ERASEBKGND() 48 ON_WM_LBUTTONDOWN() 49 ON_MESSAGE(WM_UPDATA_GR_DATA,OnUpdateGrData) 50 END_MESSAGE_MAP() 51 52 53 // CVideoMark message handlers 54 55 BOOL CVideoMark::OnInitDialog() 56 { 57 CDialog::OnInitDialog(); 58 59 // TODO: Add extra initialization here 60 //return TRUE; 61 ::SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); 62 COLORREF maskColor = RGB(255,255,255); 63 HINSTANCE hInst=LoadLibrary("User32.DLL"); 64 if(hInst) 65 { 66 typedef BOOL (WINAPI * MYFUNC)(HWND,COLORREF,BYTE,DWORD); 67 MYFUNC fun=NULL; 68 //取得SetLayeredWindowAttributes函数指针 69 fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes"); 70 if(fun) 71 fun(this->GetSafeHwnd(),maskColor,255,LWA_COLORKEY); 72 FreeLibrary(hInst); 73 } 74 75 return TRUE; // return TRUE unless you set the focus to a control 76 // EXCEPTION: OCX Property Pages should return FALSE 77 } 78 79 void CVideoMark::OnPaint() 80 { 81 CPaintDC dc(this); // device context for painting 82 CDC *pdc=&dc; 83 CRect rcBounds; 84 this->GetClientRect(&rcBounds); 85 86 DrawMark(pdc,rcBounds); 87 } 88 89 void CVideoMark::DrawMark(CDC *pDC,CRect rt) 90 { 91 92 int width=rt.Width(); 93 int height=rt.Height(); 94 if(width&&height) 95 { 96 CBrush br(RGB(255,255,255)); 97 pDC->FillRect(&rt,&br); 98 int w=width*0.2; 99 int h=height*0.2; 100 int x0=(width-w)/2; 101 int x1=(width+w)/2; 102 103 int y0=(height-h)/2; 104 int y1=(height+h)/2; 105 CRect rt1; 106 int delta=5; 107 CBrush br1(RGB(255,0,0)); 108 rt1.SetRect(x0,y0,x1,y0+delta); 109 pDC->FillRect(&rt1,&br1); 110 111 rt1.SetRect(x0,y1-delta,x1,y1); 112 pDC->FillRect(&rt1,&br1); 113 114 115 rt1.SetRect(x0,y0,x0+delta,y1); 116 pDC->FillRect(&rt1,&br1); 117 118 rt1.SetRect(x1-delta,y0,x1,y1); 119 pDC->FillRect(&rt1,&br1); 120 121 122 if(m_lightval>=0) 123 { 124 CString str; 125 str.Format("Current Green value %d",m_lightval); 126 CFont *pOld; 127 128 129 pDC->SetBkMode(TRANSPARENT); 130 pOld=pDC->SelectObject(&m_font); 131 pDC->SetTextColor(RGB(0,255,0)); 132 pDC->TextOut(x0+25,(y0+y1)/2,str); 133 pDC->SelectObject(pOld); 134 } 135 136 } 137 138 139 } 140 141 142 BOOL CVideoMark::OnEraseBkgnd(CDC* pDC) 143 { 144 // TODO: Add your message handler code here and/or call default 145 return TRUE; 146 //return CDialog::OnEraseBkgnd(pDC); 147 } 148 149 void CVideoMark::OnLButtonDown(UINT nFlags, CPoint point) 150 { 151 // TODO: Add your message handler code here and/or call default 152 153 CDialog::OnLButtonDown(nFlags, point); 154 } 155 156 LRESULT CVideoMark::OnUpdateGrData(WPARAM wParam,LPARAM lParam) 157 { 158 m_lightval=wParam; 159 this->Invalidate(1); 160 return 0; 161 }
第二种,用到 afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
MaskDlgPlot.h
1 #if !defined(AFX_MASKDLGPLOT_H__3B74D89E_AC85_46C7_BE96_597884E58BD9__INCLUDED_) 2 #define AFX_MASKDLGPLOT_H__3B74D89E_AC85_46C7_BE96_597884E58BD9__INCLUDED_ 3 4 #if _MSC_VER > 1000 5 #pragma once 6 #endif // _MSC_VER > 1000 7 // MaskDlgPlot.h : header file 8 // 9 10 11 ///////////////////////////////////////////////////////////////////////////// 12 // CMaskDlgPlot dialog 13 #include "LAKitDlg.h" 14 class CLAKitDlg; 15 class CMaskDlgPlot : public CDialog 16 { 17 // Construction 18 public: 19 CMaskDlgPlot(CWnd* pParent = NULL); // standard constructor 20 ~CMaskDlgPlot(); 21 CLAKitDlg * m_pVideo; 22 // Dialog Data 23 //{{AFX_DATA(CMaskDlgPlot) 24 enum { IDD = IDD_MaskDlgPlot }; 25 // NOTE: the ClassWizard will add data members here 26 //}}AFX_DATA 27 28 CBrush *m_brush; 29 // Overrides 30 // ClassWizard generated virtual function overrides 31 //{{AFX_VIRTUAL(CMaskDlgPlot) 32 protected: 33 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 34 virtual void PostNcDestroy(); 35 //}}AFX_VIRTUAL 36 37 // Implementation 38 protected: 39 40 // Generated message map functions 41 //{{AFX_MSG(CMaskDlgPlot) 42 afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 43 virtual BOOL OnInitDialog(); 44 virtual void OnOK(); 45 //}}AFX_MSG 46 DECLARE_MESSAGE_MAP() 47 }; 48 49 //{{AFX_INSERT_LOCATION}} 50 // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 51 52 #endif // !defined(AFX_MASKDLGPLOT_H__3B74D89E_AC85_46C7_BE96_597884E58BD9__INCLUDED_)
MaskDlgPlot.cpp
1 // MaskDlgPlot.cpp : implementation file 2 // 3 4 #include "stdafx.h" 5 #include "MaskDlgPlot.h" 6 7 #ifdef _DEBUG 8 #define new DEBUG_NEW 9 #undef THIS_FILE 10 static char THIS_FILE[] = __FILE__; 11 #endif 12 13 ///////////////////////////////////////////////////////////////////////////// 14 // CMaskDlgPlot dialog 15 16 17 CMaskDlgPlot::CMaskDlgPlot(CWnd* pParent /*=NULL*/) 18 : CDialog(CMaskDlgPlot::IDD, pParent) 19 { 20 //{{AFX_DATA_INIT(CMaskDlgPlot) 21 // NOTE: the ClassWizard will add member initialization here 22 //}}AFX_DATA_INIT 23 m_pVideo=(CLAKitDlg*)pParent; 24 m_brush=NULL; 25 } 26 27 CMaskDlgPlot::~CMaskDlgPlot() 28 { 29 TRACE("~CMaskDlgPlot()\n"); 30 if(m_brush) delete m_brush;m_brush=NULL; 31 } 32 void CMaskDlgPlot::DoDataExchange(CDataExchange* pDX) 33 { 34 CDialog::DoDataExchange(pDX); 35 //{{AFX_DATA_MAP(CMaskDlgPlot) 36 // NOTE: the ClassWizard will add DDX and DDV calls here 37 //}}AFX_DATA_MAP 38 } 39 40 41 BEGIN_MESSAGE_MAP(CMaskDlgPlot, CDialog) 42 //{{AFX_MSG_MAP(CMaskDlgPlot) 43 ON_WM_CTLCOLOR() 44 //}}AFX_MSG_MAP 45 END_MESSAGE_MAP() 46 47 ///////////////////////////////////////////////////////////////////////////// 48 // CMaskDlgPlot message handlers 49 50 HBRUSH CMaskDlgPlot::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 51 { 52 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 53 54 // TODO: Change any attributes of the DC here 55 if(nCtlColor == CTLCOLOR_DLG) //此处设置为窗体透明,CTLCOLOR_DLG表示对话框 56 { 57 TRACE("brush = new CBrush(RGB(255,255,255));\n"); 58 if(m_brush==NULL) 59 { 60 m_brush = new CBrush(RGB(255,255,255)); 61 } 62 return (HBRUSH)(m_brush->m_hObject); 63 } 64 /* 65 switch(pWnd->GetDlgCtrlID()) //此处为设置Static Text文本透明。 66 { 67 case IDC_STATIC1: 68 pDC->SetBkMode(TRANSPARENT); 69 pDC->SetTextColor(RGB(255,0,0)); 70 return (HBRUSH)GetStockObject(HOLLOW_BRUSH); 71 default: break; 72 } 73 */ 74 75 // TODO: Return a different brush if the default is not desired 76 return hbr; 77 } 78 79 BOOL CMaskDlgPlot::OnInitDialog() 80 { 81 CDialog::OnInitDialog(); 82 83 // TODO: Add extra initialization here 84 RECT myVideoRect; 85 m_pVideo->GetClientRect(&myVideoRect); 86 m_pVideo->ClientToScreen(&myVideoRect); 87 RECT myShowVideoRect; 88 m_pVideo->GetDlgItem(IDC_VIDEO)->GetClientRect(&myShowVideoRect); 89 m_pVideo->GetDlgItem(IDC_VIDEO)->ClientToScreen(&myShowVideoRect); 90 91 92 int myInfoCx=myVideoRect.right-myVideoRect.left; 93 int myinfoStartx=myVideoRect.left; 94 95 int myinfoStarty=myShowVideoRect.top; 96 int myinfoCy=myShowVideoRect.bottom; 97 98 99 this->SetWindowPos(NULL, myinfoStartx, myinfoStarty, myInfoCx, myinfoCy, SWP_NOZORDER | SWP_SHOWWINDOW); 100 101 102 // ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//TopMost 103 104 SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 105 GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE) | 0x80000); 106 HINSTANCE hInst = LoadLibrary("User32.DLL"); 107 if(hInst) 108 { 109 typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 110 MYFUNC fun = NULL; 111 112 COLORREF maskColor = RGB(255,255,255); //掩码颜色 113 //取得SetLayeredWindowAttributes函数指针 114 fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 115 if(fun)fun(this->GetSafeHwnd(),maskColor,255,1); 116 FreeLibrary(hInst); 117 } 118 return TRUE; // return TRUE unless you set the focus to a control 119 // EXCEPTION: OCX Property Pages should return FALSE 120 } 121 122 void CMaskDlgPlot::OnOK() 123 { 124 // TODO: Add extra validation here 125 126 CDialog::OnOK(); 127 } 128 129 void CMaskDlgPlot::PostNcDestroy() 130 { 131 // TODO: Add your specialized code here and/or call the base class 132 delete this; 133 CDialog::PostNcDestroy(); 134 }
完。