📄 transparentwnd.cpp
字号:
//********************************************************************************
//* TransparentWindow.CPP
//*
//* A transparent window class.
//*
//* Based on the idea of Jason Wylie
//*
//* (C) 1998 by Franz Polzer
//*
//* Visit me at: stud1.tuwien.ac.at/~e9225140
//* Write to me: e9225140@student.tuwien.ac.at
//********************************************************************************
#include "stdafx.h"
#include "TransparentWnd.h"
#include <assert.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#define WM_NCLBUTTONDOWN 0x00A1
//********************************************************************************
//* Constructor
//********************************************************************************
CTransparentWnd::CTransparentWnd()
{
}
//********************************************************************************
//* Destructor
//********************************************************************************
CTransparentWnd::~CTransparentWnd()
{
}
BEGIN_MESSAGE_MAP(CTransparentWnd, CWnd)
//{{AFX_MSG_MAP(CTransparentWnd)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//********************************************************************************
//* CreateTransparent()
//*
//* Creates the main application window transparent
//********************************************************************************
void CTransparentWnd::CreateTransparent(CTransparentWnd *pParent,LPCTSTR pTitle, RECT &rect, unsigned short MaskID, unsigned short BitmapID)
{
CreateEx( pParent?0:WS_EX_TOPMOST,
AfxRegisterWndClass(0),
pTitle,
WS_POPUP | WS_SYSMENU ,
rect,
pParent?pParent:NULL,
NULL,
NULL );
SetupRegion(GetWindowDC(), MaskID);
m_BitmapID = BitmapID;
SetTimer(1,1000,NULL);
}
//********************************************************************************
//* SetupRegion()
//*
//* Set the Window Region for transparancy outside the mask region
//********************************************************************************
int vol = 3;
void CTransparentWnd::SetupRegion(CDC *pDC, unsigned short MaskID)
{
CRect cRect;
int x, y;
CRgn wndRgn, rgnTemp;
GetWindowRect(&cRect);
RECT rc = {0,0,20,30};
wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());
{
rc.top = 1;
rc.bottom = 29;
for(int i = vol;i<10;i++)
{
rc.left = 30*i+1;
rc.right = rc.left + 17;
rgnTemp.CreateRectRgnIndirect(&rc);
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
rgnTemp.DeleteObject();
}
rc.top = 0;
rc.bottom = 30;
for(i = 0;i<10;i++)
{
rc.left = 30*i+19;
rc.right = rc.left + 11;
rgnTemp.CreateRectRgnIndirect(&rc);
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
rgnTemp.DeleteObject();
}
}
SetWindowRgn((HRGN)wndRgn, TRUE);
}
//********************************************************************************
//* CTransparentWnd message handlers
//********************************************************************************
void CTransparentWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd::OnLButtonDown(nFlags, point);
// PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
}
BOOL CTransparentWnd::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetWindowRect(&rect);
CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;
cBitmap.LoadBitmap(m_BitmapID);
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );
return TRUE;
}
void CTransparentWnd::OnPaint()
{
CPaintDC dc(this);
CBrush brush;
int i;
RECT rc = {0,0,20,30};
// CWnd *pParent = GetParent();
// OnEraseBkgnd(&dc);
// if(!m_MaskID)
// {
brush.CreateSolidBrush(RGB(0,255,50));
for(i=0;i<vol;i++)
{
rc.left = 30*i;
rc.right = rc.left + 18;
dc.FillRect(&rc,&brush);
}
/* for(i = vol;i<10;i++)
{
rc.left = 30*i;
rc.right = rc.left + 18;
dc.Draw3dRect(&rc,RGB(50,255,50),RGB(0,210,50));
}
*/
// }
// else
// OnEraseBkgnd(&dc);
// Add your drawing code here!
}
int incr = 1;
void CTransparentWnd::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
{
HRGN hRgn;
//CRgn *wndRgn;
GetWindowRgn(hRgn);
DeleteObject(hRgn);
//wndRgn = (CRgn*)hRgn;
//wndRgn->DeleteObject();
vol=vol+incr;
if(vol == 10)
incr = -1;
if(vol == 0)
incr = 1;
SetupRegion(GetWindowDC(), 0);
}
CWnd::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -