//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TCTaskbarNotifier *CTaskbarNotifier;
//---------------------------------------------------------------------------
__fastcall TCTaskbarNotifier::TCTaskbarNotifier(TComponent* Owner)
: TForm(Owner)
{
m_pWndParent= (TForm *)Owner;
m_biSkinBackground = new Graphics::TBitmap;
m_rcText = new TRect;
m_myNormalFont = new TFont;
m_mySelectedFont = new TFont;
// m_myNormalFont = GetAFont();
// m_mySelectedFont = GetAFont();
m_strCaption="";
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=2;
m_nTaskbarPlacement=0;
m_nAnimStatus=IDT_HIDDEN;
SetRect(m_rcText,0,0,0,0);
}
//---------------------------------------------------------------------------
__fastcall TCTaskbarNotifier::~TCTaskbarNotifier()
{
// No need to delete the HRGN, SetWindowRgn() owns it after being called
}
int __fastcall TCTaskbarNotifier::Create(TForm *pWndParent)
{
m_pWndParent=pWndParent;
// RegisterClass(__classid(TCTaskbarNotifier));
// RegisterClass(__classid(Tchild2));
// CString strWndClass=AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW),
// GetSysColorBrush(COLOR_WINDOW),NULL);
// return CreateEx(0,strWndClass,NULL,WS_POPUP,0,0,0,0,pWndParent->m_hWnd,NULL);
// CreateWindowEx(0,ClassName(CTaskbarNotifier),NULL,WS_POPUP,0,0,0,0,pWndParent->Handle,NULL);
// CreateWindowEx(0,'BUTTON','groupbox2',
// WS_CHILD or WS_VISIBLE or BS_GROUPBOX,
// 10,10,100,100,
// GroupBox1.Handle,0,Hinstance,nil);
return 1;
}
void __fastcall TCTaskbarNotifier::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.Style |= WS_POPUP;
Params.WndParent = Form1->Handle;
}
void __fastcall TCTaskbarNotifier::SetTextFont(LPCTSTR szFont,int nSize,int nNormalStyle,int nSelectedStyle)
{
LOGFONT lf;
DeleteObject(m_myNormalFont->Handle);
m_myNormalFont->Size = nSize;
m_myNormalFont->Name = szFont;
// m_myNormalFont.CreatePointFont(nSize,szFont);
// m_myNormalFont.GetLogFont(&lf);
GetObject(m_myNormalFont->Handle,sizeof(lf),&lf);
// SelectObject(Canvas->Handle,pOldFont->Handle);
// 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;
DeleteObject(m_myNormalFont->Handle);
m_myNormalFont->Handle = 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;
DeleteObject(m_mySelectedFont->Handle);
m_myNormalFont->Handle = CreateFontIndirect(&lf);
// GetObject(m_myNormalFont->Handle,sizeof(lf),&lf);
}
void __fastcall TCTaskbarNotifier::ASetTextColor(COLORREF crNormalTextColor,COLORREF crSelectedTextColor)
{
m_crNormalTextColor=crNormalTextColor;
m_crSelectedTextColor=crSelectedTextColor;
RedrawWindow(Handle, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);
}
void __fastcall TCTaskbarNotifier::SetTextRect(TRect *rcText)
{
m_rcText=rcText;
}
BOOL __fastcall TCTaskbarNotifier::SetSkin(UINT nBitmapID,short red,short green,short blue)
{
BITMAP bm;
DeleteObject(m_biSkinBackground->Handle);
try
{
m_biSkinBackground->LoadFromFile("skinbox.bmp");
}
catch(...)
{
return FALSE;
}
// if (!m_biSkinBackground->LoadFromFile("back.bmp"))
// return FALSE;
GetObject(m_biSkinBackground->Handle, sizeof(bm), &bm);
m_nSkinWidth=bm.bmWidth;
m_nSkinHeight=bm.bmHeight;
SetRect(m_rcText,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->Handle,(BYTE) red,(BYTE) green,(BYTE) blue);
SetWindowRgn(Handle,m_hSkinRegion, true);
}
return TRUE;
}
BOOL __fastcall TCTaskbarNotifier::SetSkin(LPCTSTR szFileName,short red,short green,short blue)
{
BITMAP bm;
HBITMAP hBmp;
hBmp=(HBITMAP) ::LoadImage(HInstance,szFileName,IMAGE_BITMAP,0,0, LR_LOADFROMFILE);
if (!hBmp)
return FALSE;
DeleteObject(m_biSkinBackground->Handle);
m_biSkinBackground->Handle = hBmp;
// m_biSkinBackground.Attach(hBmp);
GetObject(m_biSkinBackground->Handle, sizeof(bm), &bm);
m_nSkinWidth=bm.bmWidth;
m_nSkinHeight=bm.bmHeight;
SetRect(m_rcText,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->Handle,(BYTE) red,(BYTE) green,(BYTE) blue);
SetWindowRgn(Handle,m_hSkinRegion, true);
}
return TRUE;
}
void __fastcall TCTaskbarNotifier::Show(LPCTSTR szCaption,DWORD dwTimeToShow,DWORD dwTimeToLive,DWORD dwTimeToHide,int nIncrement)
{
unsigned int nDesktopHeight;
unsigned int nDesktopWidth;
unsigned int nScreenWidth;
unsigned int nScreenHeight;
TRect rcDesktop;
m_strCaption=szCaption;
m_dwTimeToShow=dwTimeToShow;
m_dwTimeToLive=dwTimeToLive;
m_dwTimeToHide=dwTimeToHide;
::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:
ShowWindow(Handle,SW_SHOW);
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;
}
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;
}
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;
}
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.b