📄 taskbarnotifier.cpp
字号:
{
// remove transparent color from region
hTmpRgn = CreateRectRgn(x,y,x+1,y+1);
CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR);
DeleteObject(hTmpRgn);
}
// next pixel
p+=3;
}
}
// release pixels
delete pPixels;
// return the region
return hRgn;
}
BYTE* CTaskbarNotifier::Get24BitPixels(HBITMAP pBitmap, WORD *pwWidth, WORD *pwHeight)
{
BITMAP bmpBmp;
LPBITMAPINFO pbmiInfo;
BITMAPINFO bmiInfo;
WORD wBmpWidth, wBmpHeight;
GetObject(pBitmap, sizeof(bmpBmp),&bmpBmp);
pbmiInfo = (LPBITMAPINFO)&bmpBmp;
wBmpWidth = (WORD)pbmiInfo->bmiHeader.biWidth;
wBmpWidth -= (wBmpWidth%4);
wBmpHeight = (WORD)pbmiInfo->bmiHeader.biHeight;
*pwWidth = wBmpWidth;
*pwHeight = wBmpHeight;
BYTE *pPixels = new BYTE[wBmpWidth*wBmpHeight*3];
if (!pPixels) return NULL;
HDC hDC =::GetWindowDC(NULL);
bmiInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiInfo.bmiHeader.biWidth = wBmpWidth;
bmiInfo.bmiHeader.biHeight = -wBmpHeight;
bmiInfo.bmiHeader.biPlanes = 1;
bmiInfo.bmiHeader.biBitCount = 24;
bmiInfo.bmiHeader.biCompression = BI_RGB;
bmiInfo.bmiHeader.biSizeImage = wBmpWidth*wBmpHeight*3;
bmiInfo.bmiHeader.biXPelsPerMeter = 0;
bmiInfo.bmiHeader.biYPelsPerMeter = 0;
bmiInfo.bmiHeader.biClrUsed = 0;
bmiInfo.bmiHeader.biClrImportant = 0;
// get pixels from the original bitmap converted to 24bits
int iRes = GetDIBits(hDC,pBitmap,0,wBmpHeight,(LPVOID)pPixels,&bmiInfo,DIB_RGB_COLORS);
// release the device context
::ReleaseDC(NULL,hDC);
// if failed, cancel the operation.
if (!iRes)
{
delete pPixels;
return NULL;
};
// return the pixel array
return pPixels;
}
BEGIN_MESSAGE_MAP(CTaskbarNotifier, CWnd)
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_SETCURSOR()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
// CTaskbarNotifier message handlers
int CTaskbarNotifier::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649));
return 0;
}
void CTaskbarNotifier::OnDestroy()
{
CWnd::OnDestroy();
// TODO: Add your message handler code here
}
void CTaskbarNotifier::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT t_MouseEvent;
t_MouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
t_MouseEvent.dwFlags = TME_LEAVE | TME_HOVER;
t_MouseEvent.hwndTrack = m_hWnd;
t_MouseEvent.dwHoverTime = 1;
::_TrackMouseEvent(&t_MouseEvent);
CWnd::OnMouseMove(nFlags, point);
}
void CTaskbarNotifier::OnLButtonUp(UINT nFlags, CPoint point)
{
m_pWndParent->PostMessage(WM_TASKBARNOTIFIERCLICKED,0,0);
CWnd::OnLButtonUp(nFlags, point);
}
LRESULT CTaskbarNotifier::OnMouseHover(WPARAM w, LPARAM l)
{
if (m_bMouseIsOver==FALSE)
{
m_bMouseIsOver=TRUE;
RedrawWindow();
}
return 0;
}
LRESULT CTaskbarNotifier::OnMouseLeave(WPARAM w, LPARAM l)
{
if (m_bMouseIsOver==TRUE)
{
m_bMouseIsOver=FALSE;
RedrawWindow();
}
return 0;
}
BOOL CTaskbarNotifier::OnEraseBkgnd(CDC* pDC)
{
CDC memDC;
CBitmap *pOldBitmap;
BITMAP bm;
memDC.CreateCompatibleDC(pDC);
GetObject(m_biSkinBackground.GetSafeHandle(), sizeof(bm), &bm);
pOldBitmap=memDC.SelectObject(&m_biSkinBackground);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBitmap);
return TRUE;
}
void CTaskbarNotifier::OnPaint()
{
CPaintDC dc(this);
CRect rcClient;
CFont *pOldFont;
char *szBuffer;
if (m_bMouseIsOver)
{
dc.SetTextColor(m_crSelectedTextColor);
pOldFont=dc.SelectObject(&m_mySelectedFont);
}
else
{
dc.SetTextColor(m_crNormalTextColor);
pOldFont=dc.SelectObject(&m_myNormalFont);
}
szBuffer=new char[m_strCaption.GetLength()+10];
strcpy(szBuffer,m_strCaption);
dc.SetBkMode(TRANSPARENT);
rcClient.DeflateRect(10,20,10,20);
dc.DrawText(szBuffer,-1,m_rcText,DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_END_ELLIPSIS);
delete[] szBuffer;
dc.SelectObject(pOldFont);
}
BOOL CTaskbarNotifier::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTCLIENT)
{
::SetCursor(m_hCursor);
return TRUE;
}
return CWnd::OnSetCursor(pWnd, nHitTest, message);
}
void CTaskbarNotifier::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case IDT_APPEARING:
m_nAnimStatus=IDT_APPEARING;
switch(m_nTaskbarPlacement)
{
case TASKBAR_ON_BOTTOM:
if (m_nCurrentPosY>(m_nStartPosY-m_nSkinHeight))
m_nCurrentPosY-=m_nIncrement;
else
{
KillTimer(IDT_APPEARING);
SetTimer(IDT_WAITING,m_dwTimeToLive,NULL);
m_nAnimStatus=IDT_WAITING;
}
break;
case TASKBAR_ON_TOP:
if ((m_nCurrentPosY-m_nStartPosY)<m_nSkinHeight)
m_nCurrentPosY+=m_nIncrement;
else
{
KillTimer(IDT_APPEARING);
SetTimer(IDT_WAITING,m_dwTimeToLive,NULL);
m_nAnimStatus=IDT_WAITING;
}
break;
case TASKBAR_ON_LEFT:
if ((m_nCurrentPosX-m_nStartPosX)<m_nSkinWidth)
m_nCurrentPosX+=m_nIncrement;
else
{
KillTimer(IDT_APPEARING);
SetTimer(IDT_WAITING,m_dwTimeToLive,NULL);
m_nAnimStatus=IDT_WAITING;
}
break;
case TASKBAR_ON_RIGHT:
if (m_nCurrentPosX>(m_nStartPosX-m_nSkinWidth))
m_nCurrentPosX-=m_nIncrement;
else
{
KillTimer(IDT_APPEARING);
SetTimer(IDT_WAITING,m_dwTimeToLive,NULL);
m_nAnimStatus=IDT_WAITING;
}
break;
}
SetWindowPos(NULL,m_nCurrentPosX,m_nCurrentPosY,m_nSkinWidth,m_nSkinHeight,SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
//RedrawWindow();
break;
case IDT_WAITING:
KillTimer(IDT_WAITING);
SetTimer(IDT_DISAPPEARING,m_dwDelayBetweenHideEvents,NULL);
break;
case IDT_DISAPPEARING:
m_nAnimStatus=IDT_DISAPPEARING;
switch(m_nTaskbarPlacement)
{
case TASKBAR_ON_BOTTOM:
if (m_nCurrentPosY<m_nStartPosY)
m_nCurrentPosY+=m_nIncrement;
else
{
KillTimer(IDT_DISAPPEARING);
Hide();
}
break;
case TASKBAR_ON_TOP:
if (m_nCurrentPosY>m_nStartPosY)
m_nCurrentPosY-=m_nIncrement;
else
{
KillTimer(IDT_DISAPPEARING);
Hide();
}
break;
case TASKBAR_ON_LEFT:
if (m_nCurrentPosX>m_nStartPosX)
m_nCurrentPosX-=m_nIncrement;
else
{
KillTimer(IDT_DISAPPEARING);
Hide();
}
break;
case TASKBAR_ON_RIGHT:
if (m_nCurrentPosX<m_nStartPosX)
m_nCurrentPosX+=m_nIncrement;
else
{
KillTimer(IDT_DISAPPEARING);
Hide();
}
break;
}
SetWindowPos(NULL,m_nCurrentPosX,m_nCurrentPosY,m_nSkinWidth,m_nSkinHeight,SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
//RedrawWindow();
break;
}
CWnd::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -