Hi Remy
//I am creating a appbar for my form.
//I have to read a xml file which has news headlines and URL paths for
images then i need to scroll these over form.
//So i selected a Panel as a container, this Panel requires a background
picture, so i took a ImageBox Control and made as alClient to the panel at
design time.
//Every present in the local hard drive, the XML file, and URL path for the
images.
//Header file
class TfrmMain : public TForm
{
private:
{
APPBARDATA abd;
_di_IXMLDocument XMLNews;
_di_IXMLNode Nrss;
int TotalNewsItems;
_di_IXMLDocument XMLImages;
_di_IXMLNode Arss;
int TotalImagesItems;
void __fastcall CMMouseEnter(TMessage &Message);
void __fastcall CMMouseLeave(TMessage &Message);
}
public:
{
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter)
VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
END_MESSAGE_MAP(TForm)
}
}
-----------------------------------------------
//cpp file
//structure arrays to store the news and images data
struct udtNewsItem
{
String Headline,url,pubdate;
}*NewsItem;
struct udtAdvtItem
{
String url,AdvtLink;
int order;
}*AdvtItem;
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
abd.cbSize = sizeof(abd);
abd.hWnd = frmMain->Handle;
abd.uCallbackMessage = WM_ABNOTIFY;
SHAppBarMessage(ABM_NEW, &abd);
abd.uEdge=ABE_TOP;
SetRect(&abd.rc,0,0,Screen->Width,Screen->Height);
SHAppBarMessage(ABM_QUERYPOS,&abd);
abd.rc.bottom=abd.rc.top+30;
SHAppBarMessage(ABM_SETPOS,&abd);
SetWindowPos(abd.hWnd,HWND_TOPMOST,abd.rc.left,abd.rc.top,
abd.rc.right-abd.rc.left,abd.rc.bottom-abd.rc.top,
SWP_NOMOVE | SWP_NOSIZE);
MoveWindow(abd.hWnd,abd.rc.left,abd.rc.top,
abd.rc.right-abd.rc.left,
abd.rc.bottom-abd.rc.top,TRUE);
frmMain->Width = Screen->Width;
}
----------------------------------------------------
void __fastcall TfrmMain::CMMouseEnter(TMessage &Message)
{
TForm::Dispatch(&Message);
frmMain->Height = 30;
}
//---------------------------------------------------------
void __fastcall TfrmMain::CMMouseLeave(TMessage &Message)
{
TForm::Dispatch(&Message);
frmMain->Height = 1;
}
---------------------------------------------------------
//Aligning the panel
Panel->Width = frmMain->Width-2;
Panel->Height = frmMain->Height-2;
Panel->Left = frmMain->Left+1;
Panel->Top = frmMain->Top+1;
----------------------------------------------------------
//Painting the panel(the image box)
TPicture *TilePicture = new TPicture();
TilePicture->LoadFromFile("c:\some.gif");
for(int y = 0; y < Panel->Height; y += TilePicture->Height)
{
for(int x = 0; x < Panel->Width; x +=
TilePicture->Width)
Image->Canvas->Draw(x, y,
TilePicture->Graphic);
}
----------------------------------------------------------
//reading the news xml file data into structure array.
XMLNews = LoadXMLDocument("c:\News.xml");
Nrss = XMLNews->DocumentElement->ChildNodes->GetNode(0);
TotalNewsItems = Nrss->ChildNodes->GetCount();
NewsItem = new udtNewsItem[TotalNewsItems];
for(int i=0; i<TotalNewsItems; i++)
{
NewsItem[i].Headline =
Nrss->ChildNodes->Nodes[WideString("title")]->Text;
NewsItem[i].url =
Nrss->ChildNodes->Nodes[WideString("link")]->Text;
NewsItem[i].pubdate =
Nrss->ChildNodes->Nodes[WideString("pubDate")]->Text;
}
//i am creating the labels as i shown in the previous in a loop and placing
them over panel side-by-side.
//read the images xml file for placing images over panel.
//I need to display .bmp, gif, .jpeg, and flash files, so i took
GIFImage.pas for showing .gif, .jpeg, .bmp and TShockwaveFlash Active X
control for flash images.
//Here are classes that i created in the header for detecting MouserEnter,
MouseLeave Events.
//-->begin of header
class TImageGIF : public TImage
{
private:
void __fastcall CMMouseEnter(TMessage &Message);
void __fastcall CMMouseLeave(TMessage &Message);
String GIFCursor;
public:
__fastcall TImageGIF(TComponent *Owner);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter)
VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
END_MESSAGE_MAP(TImage)
};
class TImageFLASH : public TShockwaveFlash
{
private:
void __fastcall CMMouseEnter(TMessage &Message);
void __fastcall CMMouseLeave(TMessage &Message);
void __fastcall CMMouseDown(TMessage &Message);
String FlashCursor;
public:
__fastcall TImageFLASH(TComponent *Owner);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter)
VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TMessage, CMMouseDown)
END_MESSAGE_MAP(TShockwaveFlash)
};
//-->end of header
//All functions has expansions in cpp file.
void __fastcall TImageGIF::CMMouseEnter(TMessage &Message)
{
TImage::Dispatch(&Message);
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TImageGIF::CMMouseLeave(TMessage &Message)
{
TImage::Dispatch(&Message);
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TImageFLASH::CMMouseEnter(TMessage &Message)
{
TShockwaveFlash::Dispatch(&Message);
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TImageFLASH::CMMouseLeave(TMessage &Message)
{
TShockwaveFlash::Dispatch(&Message);
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TImageFLASH::CMMouseDown(TMessage &Message)
{
TShockwaveFlash::Dispatch(&Message);
I->Play();
}
//---------------------------------------------------------------------------
//Reading the Image XML file into structure array.
//same as i shown for news
//Creating controls at runtime : For .gif, .jpeg, .bmp, .jpg
TImageGIF *ImageGIF = new TImageGIF(Panel);
ImageGIF->Parent = picTickerPanel;
ImageGIF->AutoSize = true;
ImageGIF->Stretch = false;
ImageGIF->Top = Panel->Top + 1;
ImageGIF->Left = Left;
ImageGIF->Picture->LoadFromFile("c:\\some
path");
ImageGIF->Cursor = crHandPoint;
//assign events
ImageGIF->OnClick = ImageGIFClick;
ImageGIF->Visible = true;
//For .swf
TImageFLASH *ImageFLASH = new
TImageFLASH(Panel);
ImageFLASH->Parent = Panel;
ImageFLASH->Width = 300;
ImageFLASH->Height = 41;
ImageFLASH->Left = Left;
ImageFLASH->Top = Panel->Top;
ImageFLASH->Cursor = crHandPoint;
ImageFLASH->Visible = true;
ImageFLASH->Movie = "c:\\some path";
//I am sure about the alignment of lables and images everything fine.
//After i am starting a timer which scrolls this panel.at an interval of 25
milli seconds.
void __fastcall TfrmMain::Timer1Timer(TObject *Sender)
{
Panel->Left += 1;
}
While scrolling none of the events are triggering if the news and images
number is large and i don't have any problem when the number of news and
images are 10 - 15.
I tried to present the minimal code, I will appreciate for the any
suggestion,
Regards
SA