MSN 式样通知窗口的 WTL 实现

源码:
- // CTaskbarNotifier Header file
- #pragma once
- #define WM_TASKBARNOTIFIERCLICKED WM_USER+123
- #define TN_TEXT_NORMAL 0x0000
- #define TN_TEXT_BOLD 0x0001
- #define TN_TEXT_ITALIC 0x0002
- #define TN_TEXT_UNDERLINE 0x0004
- #define IDT_HIDDEN 0
- #define IDT_APPEARING 1
- #define IDT_WAITING 2
- #define IDT_DISAPPEARING 3
- #define TASKBAR_ON_TOP 1
- #define TASKBAR_ON_LEFT 2
- #define TASKBAR_ON_RIGHT 3
- #define TASKBAR_ON_BOTTOM 4
- #define DEFAULT_INCREMENT 2
- // CTaskbarNotifier
- template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CFrameWinTraits>
- class CTaskbarNotifierT
- : public CWindowImpl<T, TBase, TWinTraits >
- , public CMessageFilter
- {
- typedef CWindowImpl<T, TBase, TWinTraits> baseClass;
- typedef CTaskbarNotifierT<T, TBase, TWinTraits> thisClass;
- public:
- DECLARE_WND_CLASS(_T("CTaskbarNotifierT"))
- CTaskbarNotifierT();
- virtual ~CTaskbarNotifierT();
- BOOL PreTranslateMessage(MSG* pMsg);
- HWND Create(HWND pWndParent);
- void Show(LPCTSTR szCaption,
- DWORD dwTimeToShow=500,DWORD dwTimeToStay=3000,
- DWORD dwTimeToHide=500,int nIncrement=DEFAULT_INCREMENT);
- void Hide();
- BOOL SetSkin(UINT nBitmapID,short red=-1,short green=-1,short blue=-1);
- BOOL SetSkin(LPCTSTR szFileName,short red=-1,short green=-1,short blue=-1);
- void SetTextFont(LPCTSTR szFont,int nSize,int nNormalStyle,int nSelectedStyle);
- void SetTextColor(COLORREF crNormalTextColor,COLORREF crSelectedTextColor);
- void SetTextRect(RECT rcText);
- BEGIN_MSG_MAP( thisClass )
- MESSAGE_HANDLER(WM_CREATE, OnCreate)
- MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
- MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
- MESSAGE_HANDLER(WM_PAINT, OnPaint)
- MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
- MESSAGE_HANDLER(WM_MOUSEHOVER, OnMouseHover)
- MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
- MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
- MESSAGE_HANDLER(WM_TIMER, OnTimer)
- END_MSG_MAP()
- HWND m_pWndParent;
- CFont m_myNormalFont;
- CFont m_mySelectedFont;
- COLORREF m_crNormalTextColor;
- COLORREF m_crSelectedTextColor;
- HCURSOR m_hCursor;
- CBitmap m_biSkinBackground;
- HRGN m_hSkinRegion;
- CRect m_rcText;
- int m_nSkinWidth;
- int m_nSkinHeight;
- CString m_strCaption;
- BOOL m_bMouseIsOver;
- int m_nAnimStatus;
- DWORD m_dwTimeToShow;
- DWORD m_dwTimeToLive;
- DWORD m_dwTimeToHide;
- DWORD m_dwDelayBetweenShowEvents;
- DWORD m_dwDelayBetweenHideEvents;
- int m_nStartPosX;
- int m_nStartPosY;
- int m_nCurrentPosX;
- int m_nCurrentPosY;
- int m_nTaskbarPlacement;
- int m_nIncrement;
- protected:
- BYTE * Get24BitPixels(HBITMAP pBitmap, WORD *pwWidth, WORD *pwHeight);
- HRGN GenerateRegion(HBITMAP hBitmap, BYTE red, BYTE green, BYTE blue);
- POINT m_ptBase;
- public:
- LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
- };
- template <class T, class TBase, class TWinTraits>
- CTaskbarNotifierT<T, TBase, TWinTraits>::CTaskbarNotifierT()
- {
- m_strCaption=_T("");
- m_pWndParent=NULL;
- m_bMouseIsOver=FALSE;
- m_hSkinRegion=NULL;
- m_hCursor=NULL;
- m_crNormalTextColor=RGB(133,146,181);
- m_crSelectedTextColor=RGB(10,36,106);
- m_nSkinHeight=0;
- m_nSkinWidth=0;
- m_dwTimeToShow=0;
- m_dwTimeToLive=0;
- m_dwTimeToHide=0;
- m_dwDelayBetweenShowEvents=0;
- m_dwDelayBetweenHideEvents=0;
- m_nStartPosX=0;
- m_nStartPosY=0;
- m_nCurrentPosX=0;
- m_nCurrentPosY=0;
- m_nIncrement=DEFAULT_INCREMENT;
- m_nTaskbarPlacement=0;
- m_nAnimStatus=IDT_HIDDEN;
- m_rcText.SetRect(0,0,0,0);
- }
- template <class T, class TBase, class TWinTraits>
- CTaskbarNotifierT<T, TBase, TWinTraits>::~CTaskbarNotifierT()
- {
- }
- template <class T, class TBase, class TWinTraits>
- BOOL CTaskbarNotifierT<T, TBase, TWinTraits>::PreTranslateMessage(MSG* pMsg)
- {
- return FALSE;
- }
- template <class T, class TBase, class TWinTraits>
- HWND CTaskbarNotifierT<T, TBase, TWinTraits>::Create(HWND pWndParent)
- {
- HWND bResult = NULL;
- m_pWndParent=pWndParent;
- bResult = baseClass::Create(pWndParent, rcDefault, NULL, WS_POPUP);
- ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
- return bResult;
- }
- template <class T, class TBase, class TWinTraits>
- void CTaskbarNotifierT<T, TBase, TWinTraits>::SetTextFont(LPCTSTR szFont,int nSize,int nNormalStyle,int nSelectedStyle)
- {
- LOGFONT lf = { 0 };
- if (m_myNormalFont.m_hFont) {
- m_myNormalFont.DeleteObject();
- }
- m_myNormalFont.CreatePointFont(nSize,szFont);
- m_myNormalFont.GetLogFont(&lf);
- // We set the Font of the unselected ITEM
- if (nNormalStyle & TN_TEXT_BOLD)
- lf.lfWeight = FW_BOLD;
- else
- lf.lfWeight = FW_NORMAL;
- if (nNormalStyle & TN_TEXT_ITALIC)
- lf.lfItalic=TRUE;
- else
- lf.lfItalic=FALSE;
- if (nNormalStyle & TN_TEXT_UNDERLINE)
- lf.lfUnderline=TRUE;
- else
- lf.lfUnderline=FALSE;
- m_myNormalFont.DeleteObject();
- m_myNormalFont.CreateFontIndirect(&lf);
- // We set the Font of the selected ITEM
- if (nSelectedStyle & TN_TEXT_BOLD)
- lf.lfWeight = FW_BOLD;
- else
- lf.lfWeight = FW_NORMAL;
- if (nSelectedStyle & TN_TEXT_ITALIC)
- lf.lfItalic=TRUE;
- else
- lf.lfItalic=FALSE;
- if (nSelectedStyle & TN_TEXT_UNDERLINE)
- lf.lfUnderline=TRUE;
- else
- lf.lfUnderline=FALSE;
- if (m_mySelectedFont.m_hFont) {
- m_mySelectedFont.DeleteObject();
- }
- m_mySelectedFont.CreateFontIndirect(&lf);
- }
- template <class T, class TBase, class TWinTraits>
- void CTaskbarNotifierT<T, TBase, TWinTraits>::SetTextColor(COLORREF crNormalTextColor,COLORREF crSelectedTextColor)
- {
- m_crNormalTextColor=crNormalTextColor;
- m_crSelectedTextColor=crSelectedTextColor;
- RedrawWindow();
- }
- template <class T, class TBase, class TWinTraits>
- void CTaskbarNotifierT<T, TBase, TWinTraits>::SetTextRect(RECT rcText)
- {
- m_rcText=rcText;
- }
- template <class T, class TBase, class TWinTraits>
- BOOL CTaskbarNotifierT<T, TBase, TWinTraits>::SetSkin(UINT nBitmapID,short red,short green,short blue)
- {
- BITMAP bm = { 0 };
- if (m_biSkinBackground.m_hBitmap)
- {
- m_biSkinBackground.DeleteObject();
- }
- if (!m_biSkinBackground.LoadBitmap(nBitmapID)) {
- return FALSE;
- }
- GetObject(m_biSkinBackground.m_hBitmap, sizeof(bm), &bm);
- m_nSkinWidth=bm.bmWidth;
- m_nSkinHeight=bm.bmHeight;
- m_rcText.SetRect(0,0,bm.bmWidth,bm.bmHeight);
- if (red!=-1 && green!=-1 && blue!=-1)
- {
- // No need to delete the HRGN, SetWindowRgn() owns it after being called
- m_hSkinRegion=GenerateRegion((HBITMAP)m_biSkinBackground.m_hBitmap,
- (BYTE) red,(BYTE) green,(BYTE) blue);
- SetWindowRgn(m_hSkinRegion, true);
- }
- return TRUE;
- }
- template <class T, class TBase, class TWinTraits>
- BOOL CTaskbarNotifierT<T, TBase, TWinTraits>::SetSkin(LPCTSTR szFileName,short red,short green,short blue)
- {
- BITMAP bm = { 0 };
- HBITMAP hBmp = NULL;
- hBmp=(HBITMAP) ::LoadImage(ModuleHelper::GetResourceInstance(),
- szFileName,IMAGE_BITMAP,0,0, LR_LOADFROMFILE);
- if (!hBmp) {
- return FALSE;
- }
- m_biSkinBackground.DeleteObject();
- m_biSkinBackground.Attach(hBmp);
- GetObject(m_biSkinBackground.m_hBitmap, sizeof(bm), &bm);
- m_nSkinWidth=bm.bmWidth;
- m_nSkinHeight=bm.bmHeight;
- m_rcText.SetRect(0,0,bm.bmWidth,bm.bmHeight);
- if (red!=-1 && green!=-1 && blue!=-1)
- {
- // No need to delete the HRGN, SetWindowRgn() owns it after being called
- m_hSkinRegion=GenerateRegion((HBITMAP)m_biSkinBackground.m_hBitmap,
- (BYTE) red,(BYTE) green,(BYTE) blue);
- SetWindowRgn(m_hSkinRegion, true);
- }
- return TRUE;
- }
- template <class T, class TBase, class TWinTraits>
- void CTaskbarNotifierT<T, TBase, TWinTraits>::Show(LPCTSTR szCaption,DWORD dwTimeToShow,
- DWORD dwTimeToLive,DWORD dwTimeToHide,
- int nIncrement)
- {
- unsigned int nDesktopHeight;
- unsigned int nDesktopWidth;
- unsigned int nScreenWidth;
- unsigned int nScreenHeight;
- CRect rcDesktop;
- m_strCaption=szCaption;
- m_dwTimeToShow=dwTimeToShow;
- m_dwTimeToLive=dwTimeToLive;
- m_dwTimeToHide=dwTimeToHide;
- m_nIncrement = nIncrement;
- ::SystemParametersInfo(SPI_GETWORKAREA,0,&rcDesktop,0);
- nDesktopWidth=rcDesktop.right-rcDesktop.left;
- nDesktopHeight=rcDesktop.bottom-rcDesktop.top;
- nScreenWidth=::GetSystemMetrics(SM_CXSCREEN);
- nScreenHeight=::GetSystemMetrics(SM_CYSCREEN);
- BOOL bTaskbarOnRight=nDesktopWidth<nScreenWidth && rcDesktop.left==0;
- BOOL bTaskbarOnLeft=nDesktopWidth<nScreenWidth && rcDesktop.left!=0;
- BOOL bTaskBarOnTop=nDesktopHeight<nScreenHeight && rcDesktop.top!=0;
- // BOOL bTaskbarOnBottom=nDesktopHeight<nScreenHeight && rcDesktop.top==0;
- switch (m_nAnimStatus)
- {
- case IDT_HIDDEN:
- if (bTaskbarOnRight)
- {
- m_dwDelayBetweenShowEvents=m_dwTimeToShow/(m_nSkinWidth/m_nIncrement);
- m_dwDelayBetweenHideEvents=m_dwTimeToHide/(m_nSkinWidth/m_nIncrement);
- m_nStartPosX=rcDesktop.right;
- m_nStartPosY=rcDesktop.bottom-m_nSkinHeight;
- m_nTaskbarPlacement=TASKBAR_ON_RIGHT;
- m_ptBase.x = rcDesktop.right;
- m_ptBase.y = nScreenHeight;
- }
- else if (bTaskbarOnLeft)
- {
- m_dwDelayBetweenShowEvents=m_dwTimeToShow/(m_nSkinWidth/m_nIncrement);
- m_dwDelayBetweenHideEvents=m_dwTimeToHide/(m_nSkinWidth/m_nIncrement);
- m_nStartPosX=rcDesktop.left-m_nSkinWidth;
- m_nStartPosY=rcDesktop.bottom-m_nSkinHeight;
- m_nTaskbarPlacement=TASKBAR_ON_LEFT;
- m_ptBase.x = rcDesktop.left;
- m_ptBase.y = nScreenHeight;
- }
- else if (bTaskBarOnTop)
- {
- m_dwDelayBetweenShowEvents=m_dwTimeToShow/(m_nSkinHeight/m_nIncrement);
- m_dwDelayBetweenHideEvents=m_dwTimeToHide/(m_nSkinHeight/m_nIncrement);
- m_nStartPosX=rcDesktop.right-m_nSkinWidth;
- m_nStartPosY=rcDesktop.top-m_nSkinHeight;
- m_nTaskbarPlacement=TASKBAR_ON_TOP;
- m_ptBase.x = nScreenWidth;
- m_ptBase.y = rcDesktop.top;
- }
- else //if (bTaskbarOnBottom)
- {
- // Taskbar is on the bottom or Invisible
- m_dwDelayBetweenShowEvents=m_dwTimeToShow/(m_nSkinHeight/m_nIncrement);
- m_dwDelayBetweenHideEvents=m_dwTimeToHide/(m_nSkinHeight/m_nIncrement);
- m_nStartPosX=rcDesktop.right-m_nSkinWidth;
- m_nStartPosY=rcDesktop.bottom;
- m_nTaskbarPlacement=TASKBAR_ON_BOTTOM;
- m_ptBase.x = nScreenWidth;
- m_ptBase.y = rcDesktop.bottom;
- }
- m_nCurrentPosX=m_nStartPosX;
- m_nCurrentPosY=m_nStartPosY;
- SetWindowPos(NULL,m_nCurrentPosX,m_nCurrentPosY,0,0,
- SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
- ShowWindow(SW_SHOW);
- SetTimer(IDT_APPEARING,m_dwDelayBetweenShowEvents);
- break;
- case IDT_WAITING:
- RedrawWindow();
- KillTimer(IDT_WAITING);
- SetTimer(IDT_WAITING,m_dwTimeToLive);
- break;
- case IDT_APPEARING:
- RedrawWindow();
- break;
- case IDT_DISAPPEARING:
- KillTimer(IDT_DISAPPEARING);
- SetTimer(IDT_WAITING,m_dwTimeToLive);
- if (bTaskbarOnRight) {
- m_nCurrentPosX=rcDesktop.right-m_nSkinWidth;
- } else if (bTaskbarOnLeft) {
- m_nCurrentPosX=rcDesktop.left;
- } else if (bTaskBarOnTop) {
- m_nCurrentPosY=rcDesktop.top;
- } else { //if (bTaskbarOnBottom)
- m_nCurrentPosY=rcDesktop.bottom-m_nSkinHeight;
- }
- SetWindowPos(NULL,m_nCurrentPosX,m_nCurrentPosY,m_nSkinWidth,m_nSkinHeight,
- SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
- RedrawWindow();
- break;
- }
- }
- template <class T, class TBase, class TWinTraits>
- void CTaskbarNotifierT<T, TBase, TWinTraits>::Hide()
- {
- switch (m_nAnimStatus)
- {
- case IDT_APPEARING:
- KillTimer(IDT_APPEARING);
- break;
- case IDT_WAITING:
- KillTimer(IDT_WAITING);
- break;
- case IDT_DISAPPEARING:
- KillTimer(IDT_DISAPPEARING);
- break;
- }
- MoveWindow(0,0,0,0);
- ShowWindow(SW_HIDE);
- m_nAnimStatus=IDT_HIDDEN;
- }
- template <class T, class TBase, class TWinTraits>
- HRGN CTaskbarNotifierT<T, TBase, TWinTraits>::GenerateRegion(HBITMAP hBitmap, BYTE red, BYTE green, BYTE blue)
- {
- WORD wBmpWidth,wBmpHeight;
- HRGN hRgn, hTmpRgn;
- // 24bit pixels from the bitmap
- BYTE *pPixels = Get24BitPixels(hBitmap, &wBmpWidth, &wBmpHeight);
- if (!pPixels) return NULL;
- // create our working region
- hRgn = CreateRectRgn(0,0,wBmpWidth,wBmpHeight);
- if (!hRgn) { delete pPixels; return NULL; }
- DWORD p=0;
- for (WORD y=0; y<wBmpHeight; y++)
- {
- for (WORD x=0; x<wBmpWidth; x++)
- {
- BYTE jRed = pPixels[p+2];
- BYTE jGreen = pPixels[p+1];
- BYTE jBlue = pPixels[p+0];
- if (jRed==red && jGreen==green && jBlue==blue)
- {
- // 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;
- }
- template <class T, class TBase, class TWinTraits>
- BYTE* CTaskbarNotifierT<T, TBase, TWinTraits>::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;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- bHandled = FALSE;
- m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649));
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- TRACKMOUSEEVENT t_MouseEvent = { sizeof(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);
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- ::PostMessage(m_pWndParent, WM_TASKBARNOTIFIERCLICKED, (WPARAM)m_hWnd,0);
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- if (m_bMouseIsOver==FALSE)
- {
- m_bMouseIsOver=TRUE;
- RedrawWindow();
- }
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- if (m_bMouseIsOver==TRUE)
- {
- m_bMouseIsOver=FALSE;
- RedrawWindow();
- }
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- CDCHandle pDC((HDC)wParam);
- CDC memDC;
- CBitmapHandle pOldBitmap;
- BITMAP bm;
- memDC.CreateCompatibleDC(pDC);
- GetObject(m_biSkinBackground.m_hBitmap, sizeof(bm), &bm);
- pOldBitmap=memDC.SelectBitmap(m_biSkinBackground);
- pDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,memDC,0,0,SRCCOPY);
- memDC.SelectBitmap(pOldBitmap);
- return TRUE;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- CPaintDC dc(*this);
- CRect rcClient;
- CFontHandle pOldFont;
- TCHAR *szBuffer;
- if (m_bMouseIsOver)
- {
- dc.SetTextColor(m_crSelectedTextColor);
- pOldFont=dc.SelectFont(m_mySelectedFont);
- }
- else
- {
- dc.SetTextColor(m_crNormalTextColor);
- pOldFont=dc.SelectFont(m_myNormalFont);
- }
- szBuffer=new TCHAR[m_strCaption.GetLength()+10];
- lstrcpy(szBuffer, (LPCTSTR)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.SelectFont(pOldFont);
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- if (LOWORD(lParam) == HTCLIENT)
- {
- ::SetCursor(m_hCursor);
- return TRUE;
- }
- bHandled = FALSE;
- return 0;
- }
- template <class T, class TBase, class TWinTraits>
- LRESULT CTaskbarNotifierT<T, TBase, TWinTraits>::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- uMsg, wParam, lParam, bHandled;
- bHandled = FALSE;
- int nDeltaX=m_nSkinWidth, nDeltaY=m_nSkinHeight;
- UINT nIDEvent = (UINT) wParam;
- 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;
- nDeltaX = m_nSkinWidth;
- nDeltaY = m_ptBase.y - m_nCurrentPosY;
- } else {
- KillTimer(IDT_APPEARING);
- SetTimer(IDT_WAITING,m_dwTimeToLive);
- m_nAnimStatus=IDT_WAITING;
- }
- break;
- case TASKBAR_ON_TOP:
- if ((m_nCurrentPosY-m_nStartPosY)<m_nSkinHeight) {
- m_nCurrentPosY += m_nIncrement;
- nDeltaX = m_nSkinWidth;
- nDeltaY = m_nCurrentPosY - m_ptBase.y;
- } else {
- KillTimer(IDT_APPEARING);
- SetTimer(IDT_WAITING,m_dwTimeToLive);
- m_nAnimStatus=IDT_WAITING;
- }
- break;
- case TASKBAR_ON_LEFT:
- if ((m_nCurrentPosX-m_nStartPosX)<m_nSkinWidth) {
- m_nCurrentPosX += m_nIncrement;
- nDeltaX = m_nCurrentPosX - m_ptBase.x;
- nDeltaY = m_nSkinHeight;
- } else {
- KillTimer(IDT_APPEARING);
- SetTimer(IDT_WAITING,m_dwTimeToLive);
- m_nAnimStatus=IDT_WAITING;
- }
- break;
- case TASKBAR_ON_RIGHT:
- if (m_nCurrentPosX>(m_nStartPosX-m_nSkinWidth)) {
- m_nCurrentPosX -= m_nIncrement;
- nDeltaX = m_ptBase.x - m_nCurrentPosX;
- nDeltaY = m_nSkinHeight;
- } else {
- KillTimer(IDT_APPEARING);
- SetTimer(IDT_WAITING,m_dwTimeToLive);
- m_nAnimStatus=IDT_WAITING;
- }
- break;
- }
- SetWindowPos(NULL,m_nCurrentPosX,m_nCurrentPosY,nDeltaX,nDeltaY,
- SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
- break;
- case IDT_WAITING:
- KillTimer(IDT_WAITING);
- SetTimer(IDT_DISAPPEARING,m_dwDelayBetweenHideEvents);
- break;
- case IDT_DISAPPEARING:
- m_nAnimStatus=IDT_DISAPPEARING;
- switch(m_nTaskbarPlacement)
- {
- case TASKBAR_ON_BOTTOM:
- if (m_nCurrentPosY<m_nStartPosY) {
- m_nCurrentPosY += m_nIncrement;
- nDeltaX = m_nSkinWidth;
- nDeltaY = m_ptBase.y - m_nCurrentPosY;
- } else {
- KillTimer(IDT_DISAPPEARING);
- Hide();
- }
- break;
- case TASKBAR_ON_TOP:
- if (m_nCurrentPosY>m_nStartPosY) {
- m_nCurrentPosY -= m_nIncrement;
- nDeltaX = m_nSkinWidth;
- nDeltaY = m_nCurrentPosY - m_ptBase.y;
- } else {
- KillTimer(IDT_DISAPPEARING);
- Hide();
- }
- break;
- case TASKBAR_ON_LEFT:
- if (m_nCurrentPosX>m_nStartPosX) {
- m_nCurrentPosX -= m_nIncrement;
- nDeltaX = m_nCurrentPosX - m_ptBase.x;
- nDeltaY = m_nSkinHeight;
- } else {
- KillTimer(IDT_DISAPPEARING);
- Hide();
- }
- break;
- case TASKBAR_ON_RIGHT:
- if (m_nCurrentPosX<m_nStartPosX) {
- m_nCurrentPosX += m_nIncrement;
- nDeltaX = m_ptBase.x - m_nCurrentPosX;
- nDeltaY = m_nSkinHeight;
- } else {
- KillTimer(IDT_DISAPPEARING);
- Hide();
- }
- break;
- }
- SetWindowPos(NULL,m_nCurrentPosX,m_nCurrentPosY,nDeltaX,nDeltaY,
- SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
- break;
- }
- return 0;
- }
- class CTaskbarNotifier : public CTaskbarNotifierT<CTaskbarNotifier>
- {
- public:
- DECLARE_WND_CLASS(_T("CTaskbarNotifier"))
- };

近期评论