Old 31st October 2003, 01:11   #1
Lemonsoft
Junior Member
 
Join Date: Oct 2003
Posts: 8
about function "WADlg_init(hwndWinamp)" in "wa_dlg.h"

i want to create a windows in General Purpose Plugin,
but i can't use winamp skin at my windows through function "WADlg_init(hwndWinamp)"
who can help me?
thanks!!!!!!!!

Quote:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WADlg_handleDialogMsgs( hwnd, message, wParam, lParam);
switch (message)
{
case WM_DISPLAYCHANGE:
WADlg_init(plugin.hwndParent);
return 0;
case WM_CLOSE:
ShowWindow(hWnd,SW_HIDE);
return 0;
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
int init() {
WNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.lpfnWndProc = WndProc;
wc.hInstance = plugin.hDllInstance;
wc.lpszClassName= PlugInName;

RegisterClass(&wc);
hWnd = CreateWindowEx(
0,
PlugInName,PlugInName,
WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
0,0,
320,240,
plugin.hwndParent,
NULL,
plugin.hDllInstance,
NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
return 0;
}
Lemonsoft is offline   Reply With Quote
Old 31st October 2003, 14:17   #2
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
you seem to be having problems with this window thing - i'll try and get an example up for you for tomorrow (hopefully you can wait till then )

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 1st November 2003, 15:28   #3
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
just a quick reply on this, for the code to compile correctly the source file you are using needs to end in *.cpp (is due to the way the header has been written)

as for an example i've got something that will have a winamp skin style in a window but it's not using a full winamp window frame at the moment will post once i've done it all (along with all my other bits to do )

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 3rd November 2003, 15:35   #4
gb115
Junior Member
 
Join Date: Feb 2003
Posts: 48
Daz

did you ever get the winamp window frame working.. I think its been mentioned elsewhere, but I would really love a General plugin using the new api, with a simple "hello world" in a skinned window.

kind regards

G
gb115 is offline   Reply With Quote
Old 3rd November 2003, 18:00   #5
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
not forgotten i just haven't had as much time as i wanted.
i got the internal parts of a winamp style window working, it's just the outer frame to do (and i found the correct part in the headers last night).

i'll try to get it done for tomorrow (may use it myself for some bit's i'm doing...)

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 3rd November 2003, 19:31   #6
gb115
Junior Member
 
Join Date: Feb 2003
Posts: 48
any chance of it being MFC?
gb115 is offline   Reply With Quote
Old 3rd November 2003, 20:04   #7
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
it's all pure 'c' at the moment. it's basically a few sendmessage calls at the end of the day. the only mfc bits would be the on_message handlers and things like that for the dialog proceedure which is fairly easy for someone else to convert over to

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 3rd November 2003, 22:15   #8
Bizzeh
Forum Pirate
Beta Team
 
Bizzeh's Avatar
 
Join Date: Oct 2001
Posts: 2,032
never ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever ever use MFC, always use win32 api... mfc = slow and pooeh compaired to directly using the api
Bizzeh is offline   Reply With Quote
Old 3rd November 2003, 23:21   #9
Lemonsoft
Junior Member
 
Join Date: Oct 2003
Posts: 8
Quote:
Originally posted by DrO
you seem to be having problems with this window thing - i'll try and get an example up for you for tomorrow (hopefully you can wait till then )

-daz

i am back, and very grateful after i see you article.
thanks!
Lemonsoft is offline   Reply With Quote
Old 4th November 2003, 17:47   #10
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
here it is.

it's a 'c' example but read the notes in the source (should be clear) to get an idea of a few things that are needed to be done.

any problems then don't hesitate to ask, enjoy

-daz
Attached Files
File Type: zip gen_wa2dlg_v0_4.zip (25.2 KB, 470 views)

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 5th November 2003, 00:55   #11
Lemonsoft
Junior Member
 
Join Date: Oct 2003
Posts: 8
thanks! it run best on winamp 5
but i have another question,

My Code:
Quote:
if(wa2){
// here we attach a dialog into the window
// if need by this could been done with CreateWindow(), etc depending
// on what you want to do
RegisterClass(&wc);
HWND hWnd = CreateWindow(
PlugInName,
PlugInName,
WS_POPUP,
0, 0, 100, 100,
(HWND) NULL,
(HMENU) NULL,
plugin.hDllInstance,
(LPVOID) NULL);

ShowWindow(hWnd,SW_SHOWNORMAL);
proc = (PROC)SetWindowLong(wa2,GWL_WNDPROC,(LONG)WinampProc);
}
I create a window , and at Wndproc, i deal with WM_CREATE message
Quote:
switch(msg){
case WM_CREATE:
WADlg_init(plugin.hwndParent);
SetWindowText(GetParent(hwnd),"Project");
SetDlgItemText(hwnd,IDC_EDIT, "Lemonsoft");
// shows the owner window and this dialog
//ShowWindow(hwnd,SW_SHOWNORMAL);
ShowWindow(GetParent(hwnd),SW_SHOWNORMAL);
.......
Background Color changed,
but winamp base skin don't display, why?

Last edited by Lemonsoft; 5th November 2003 at 02:55.
Lemonsoft is offline   Reply With Quote
Old 5th November 2003, 15:57   #12
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
Quote:
it run best on winamp 5
i agree on that, using the modern skins does look better for a winamp styled window. glad it's what you were looking for.

with your problem, you need to alter the window styles used for the window you are creating. i think you need WS_CHILD and WS_VISIBLE and to change to CreateWindowEx using WS_EX_CONTROLPARENT as the extended window style.

i'll check it tonight and post you a new version unless you beat me to it (the part above should be part on the way to things).

also as a point of interest for you, it may be an idea to allow the ability to create a normal owner window as i think you had incase winamp is not able to return a valid window to use (such as on versions below 2.9x).

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 7th November 2003, 15:23   #13
gb115
Junior Member
 
Join Date: Feb 2003
Posts: 48
Bizzy D.

I'm not just usign MFC for the sheer fun of it, (in fact I'm preety sure no fun is to be gained at all) but because I need the message pump for my plugin which involves lots of two way serial communication for a remote control.

Is there an easier way of doing this that I skipped over? I'm using the CSerial on codeporject at the mo.

Dr. O cheers for that, I look forward to butchering your code beyong recognition.
gb115 is offline   Reply With Quote
Old 7th November 2003, 15:48   #14
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
Quote:
Dr. O cheers for that, I look forward to butchering your code beyong recognition.
that's what it's there for, if it helps at least one person then that's the main thing i think at the end of the day. also i needed the code myself

as for the MFC thing i agree with Bizzy D. about it but i'm sure you can do waht you need without using MFC since at the end of the day it is just a big wrapper for the basic win32 functions (codeproject and codeguru should be able to help)

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 8th November 2003, 09:41   #15
gb115
Junior Member
 
Join Date: Feb 2003
Posts: 48
Dr.O sorry this is goign to be a total n00b question.

when I add another dialog box (for say a configuration screen) when I actually creat the class and .cpp file in MS visual studio. it will no longer link.

I get lots of errors like
"gen_test4 error LNK2005: "int __cdecl WADlg_getColor(int)" (?WADlg_getColor@@YAHH@Z) already defined in gen_test4.obj"

can you help me?
gb115 is offline   Reply With Quote
Old 8th November 2003, 18:18   #16
saivert
Banned
 
saivert's Avatar
 
Join Date: Jan 2001
Location: Norway
Posts: 927
Dialog mess...

The shit you are talking about is just some custom code
written by Nullsoft inside wa_dlg.h. It's purpose is to owner-draw
(paint) various buttons and edit boxes in your dialog so
they look like Winamp. When designing the dialog template
remember to set the Owner-draw style for the control to on (checked).
Then call WADlg_handleDialogMsgs in your WndProc like this:
{
int a=WADlg_handleDialogMsgs( hwnd, message, wParam, lParam);
if (a) return a;
}
You must return from the Window Procedure if WADlg_handleDialogMsgs
returns something else than NULL.

I sorted this out after looking at the Media Library example (ml_ex).
Have closer look at this you too (plural).

Then you have the option of embedding your dialog (which must have
the WS_CHILD style as its only style set) in a "General Wnd" window.
To do this set up an embedWindowStruct:

HWND (*embedWindow)=0;

embedWindow = SendMessage(hwndWinamp, WM_WA_IPC, 0, IPC_GETEMBEDIF);

embedWindowStruct ews;
ews.flags = 0;
SetRect(&ews.r, 0, 0, 320, 240);

embedWindow(&ews);
SetWindowText(ews.me, "My filthy window!");
ShowWindow(ews.me, SW_SHOW);
SetParent(yourdlghandle, ews.me);

Question:
What I need to know is: How do Winamp paint the Scroll-bars in the
Media Library. How do you owner-draw scroll-bars. Is Winamp using
some custom control scroll-bar thingy??
saivert is offline   Reply With Quote
Old 10th November 2003, 01:06   #17
Lemonsoft
Junior Member
 
Join Date: Oct 2003
Posts: 8
Quote:
Originally posted by DrO

with your problem, you need to alter the window styles used for the window you are creating. i think you need WS_CHILD and WS_VISIBLE and to change to CreateWindowEx using WS_EX_CONTROLPARENT as the extended window style.versions below 2.9x).

-daz [/B]
Dr.O thank you
I try your way,but CreateWindowEx Error and GetLasterror returned 1406.

1406: Cannot create a top-level child window. ERROR_TLW_WITH_WSCHILD
Quote:
My Code
wnd=CreateWindowEx(
WS_EX_CONTROLPARENT,app_name,"Test",
WS_CHILD | WS_VISIBLE ,
10,10,300,300,
NULL,NULL,plugin.hDllInstance,NULL);
Lemonsoft is offline   Reply With Quote
Old 10th November 2003, 09:07   #18
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
@gb115: the problem is that the header can only be included once - forgot to mention that, oops (is because the parts in the header are statically defined and so you get the link error).

@saivert: i'm looking into that one already at the moment for my forth coming plugin - will post what i find out

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 16th March 2004, 06:21   #19
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
Skin

Lemonsoft: You ever solved that? I have the same problem...
Joonas is offline   Reply With Quote
Old 16th March 2004, 10:50   #20
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
Joonas: there is no parent assigned to the window in Lemonsoft's CreateWindowEx(..) and that's why it fails.

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 16th March 2004, 14:35   #21
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
oh... and there is a restriction (bug?) that you cannot have more than one wadlg with the same window name... otherwise, the second one will not have it's frame drawn properly... learnt the hard way... debugged for days... when i'm trying to get multiple Album List windows up...

i have some code around too... if you guys have questions still...
Safai is offline   Reply With Quote
Old 16th March 2004, 14:59   #22
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
Code!

Yeah, I would love any code on this subject. The gen_wa2dlg project is great but somewhat limited.

I also wonder if someone knows how to skin a listview control?

/Jonas
Joonas is offline   Reply With Quote
Old 16th March 2004, 15:10   #23
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
ListView_SetTextColor(enq_list,WADlg_getColor(WADLG_ITEMFG));
ListView_SetBkColor(enq_list,WADlg_getColor(WADLG_ITEMBG));
ListView_SetTextBkColor(enq_list,WADlg_getColor(WADLG_ITEMBG));

that will set the colours for the listview control though it won't do the scrollbars and header control - i'm trying to update wa_dlg.h to provide support for most controls (like the tab control, etc - as the skinned prefs plugin in my signature does)

as for the example, yes it is limited but that was the best i knew at the time if i can get the time i will try to update the example with the extra fixes that are incorporated into jtfe (since the example was using the original window skinning code i was using for jtfe at the time)

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 16th March 2004, 17:36   #24
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
custom draw code for the header control...

PHP Code:
NMCUSTOMDRAWpCD = (NMCUSTOMDRAW*)pnmh;

if (
CDDS_PREPAINT == pCD->dwDrawStage)
{
    return 
CDRF_NOTIFYITEMDRAW|CDRF_NOTIFYPOSTPAINT;
}
else if (
CDDS_ITEMPREPAINT == pCD->dwDrawStage)
{
    
HBRUSH hbr CreateSolidBrush(WADlg_getColor(WADLG_LISTHEADER_BGCOLOR));
    
FillRect(pCD->hdc, &pCD->rchbr);
    
DeleteObject(hbr);

    
HPEN pen1=CreatePen(PS_SOLID,0,WADlg_getColor(WADLG_LISTHEADER_FRAME_TOPCOLOR));
    
HPEN pen2=CreatePen(PS_SOLID,0,WADlg_getColor(WADLG_LISTHEADER_FRAME_MIDDLECOLOR));
    
HPEN pen3=CreatePen(PS_SOLID,0,0);
    
HGDIOBJ o=SelectObject(pCD->hdcpen1);

    if ((
pCD->uItemState CDIS_SELECTED) == CDIS_SELECTED)
    {
        
SelectObject(pCD->hdcpen3);
        
MoveToEx(pCD->hdc,pCD->rc.left,pCD->rc.bottom,NULL);
        
LineTo(pCD->hdc,pCD->rc.left,pCD->rc.top);
        
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.top);
        
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.bottom-1);
        
LineTo(pCD->hdc,pCD->rc.left,pCD->rc.bottom-1);
    }
    else
    {
        
// left, top
        
MoveToEx(pCD->hdc,pCD->rc.left,pCD->rc.bottom,NULL);
        
LineTo(pCD->hdc,pCD->rc.left,pCD->rc.top);
        
LineTo(pCD->hdc,pCD->rc.right,pCD->rc.top);

        
// right, bottom
        
SelectObject(pCD->hdcpen2);
        
MoveToEx(pCD->hdc,pCD->rc.left+1,pCD->rc.bottom-2,NULL);
        
LineTo(pCD->hdc,pCD->rc.right-2,pCD->rc.bottom-2);
        
LineTo(pCD->hdc,pCD->rc.right-2,pCD->rc.top);

        
// right, bottom (black line)
        
SelectObject(pCD->hdcpen3);
        
MoveToEx(pCD->hdc,pCD->rc.left,pCD->rc.bottom-1,NULL);
        
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.bottom-1);
        
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.top-1);
    }

    
SetTextColor(pCD->hdcWADlg_getColor(WADLG_LISTHEADER_FONTCOLOR));
    
SetBkMode(pCD->hdcTRANSPARENT);

    
char name***91;MAX_PATH***93; = "";
    
HDITEM hdi;
    
hdi.mask HDI_TEXT|HDI_FORMAT;
    
hdi.pszText name;
    
hdi.cchTextMax MAX_PATH;
    
Header_GetItem(pCD->hdr.hwndFrompCD->dwItemSpec, &hdi);

    
RECT rcItem pCD->rc;
    
rcItem.left += 5;
    
rcItem.right -= 5;
    
rcItem.top ++;

    if ((
pCD->uItemState CDIS_SELECTED) == CDIS_SELECTED)
    {
        
rcItem.left ++;
        
rcItem.right ++;
    }

    
int align = (hdi.fmt HDF_JUSTIFYMASK) == LVCFMT_RIGHT DT_RIGHT DT_LEFT;

    
DrawText(pCD->hdchdi.pszText, -1, &rcItemalign DT_VCENTER DT_SINGLELINE);

    
// clean up
    
SelectObject(pCD->hdco);
    
DeleteObject(pen1);
    
DeleteObject(pen2);
    
DeleteObject(pen3);

    return 
CDRF_SKIPDEFAULT;
}
else if (
CDDS_POSTPAINT == pCD->dwDrawStage)
{
    
RECT rc1;
    
int nCount Header_GetItemCount(pCD->hdr.hwndFrom);
    
Header_GetItemRect(pCD->hdr.hwndFromnCount 1, &rc1);
    
RECT rc;
    
GetClientRect(&rc);

    if (
rc1.right rc.right)
    {
        
rc.left rc1.right;
        
rc.right += 10;
        
HBRUSH hbr CreateSolidBrush(WADlg_getColor(WADLG_LISTHEADER_EMPTY_BGCOLOR));
        
FillRect(pCD->hdc, &rchbr);
        
DeleteObject(hbr);
    }

    return 
CDRF_DODEFAULT;
}
return 
FALSE
Safai is offline   Reply With Quote
Old 16th March 2004, 17:39   #25
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
for custom scrollbar... check this article... this is what media library is using...

http://www.codeproject.com/dialog/coolscroll.asp

here is the custom draw for the "coolsb"...

PHP Code:
typedef struct 
{
    
int xy;
    
int widthheight;
CustomDrawTable;

CustomDrawTable cdt_horz_normal***91;***93; = 
{
    { 
0,  451414 },    //left arrow  NORMAL
    
14451414 }, //right arrow NORMAL
    
WADLG_SCROLLBAR_FGCOLORWADLG_SCROLLBAR_BGCOLOR }, //page left   NORMAL
    
WADLG_SCROLLBAR_FGCOLORWADLG_SCROLLBAR_BGCOLOR }, //page right  NORMAL
    
    
{ -1, -1, -1, -},    //padding

    
84,  314,  4  }, //horz thumb (top,left)
    
84,  354,  6  }, //horz thumb (middle,left)
    
84,  414,  4  }, //horz thumb (bottom,left)

    
88,  31204  }, //horz thumb (top,middle)
    
88,  356,  6  }, //horz thumb (middle,middle,left)
    
102356,  6  }, //horz thumb (middle,middle,right)
    
88,  41204  }, //horz thumb (bottom,middle)

    
108314,  4  }, //horz thumb (top,right)
    
108354,  6  }, //horz thumb (middle,right)
    
108414,  4  }, //horz thumb (bottom,right)

    
94358,  6  }, //horz thumb (middle,middle,middle)
};

CustomDrawTable cdt_horz_active***91;***93; = 
{
    { 
28451414 }, //left arrow  ACTIVE
    
42451414 }, //right arrow ACTIVE
    
WADLG_SCROLLBAR_INV_FGCOLORWADLG_SCROLLBAR_INV_BGCOLOR }, //page left   ACTIVE
    
WADLG_SCROLLBAR_INV_FGCOLORWADLG_SCROLLBAR_INV_BGCOLOR }, //page right  ACTIVE

    
{ -1, -1, -1, -},    //padding

    
84,  454,  4  }, //horz thumb (top,left)
    
84,  494,  6  }, //horz thumb (middle,left)
    
84,  554,  4  }, //horz thumb (bottom,left)

    
88,  45204  }, //horz thumb (top,middle)
    
88,  496,  6  }, //horz thumb (middle,middle,left)
    
103496,  6  }, //horz thumb (middle,middle,right)
    
88,  56203  }, //horz thumb (bottom,middle)

    
108454,  4  }, //horz thumb (top,right)
    
108494,  6  }, //horz thumb (middle,right)
    
108554,  4  }, //horz thumb (bottom,right)

    
94499,  7  }, //horz thumb (middle,middle,middle)
};

CustomDrawTable cdt_vert_normal***91;***93; = 
{
    { 
0,  311414 }, //up arrow   NORMAL
    
14311414 }, //down arrow NORMAL
    
WADLG_SCROLLBAR_FGCOLORWADLG_SCROLLBAR_BGCOLOR }, //page up     NORMAL
    
WADLG_SCROLLBAR_FGCOLORWADLG_SCROLLBAR_BGCOLOR }, //page down  NORMAL

    
{ -1, -1, -1, -},    //padding

    
56314,  4  }, //vert thumb (top,left)
    
60316,  4  }, //vert thumb (top,middle)
    
66314,  4  }, //vert thumb (top,right)
    
5635420  }, //vert thumb (middle,left)
    
60356,  6  }, //vert thumb (middle,middle,top)
    
60496,  6  }, //vert thumb (middle,middle,bottom)
    
6635420  }, //vert thumb (middle,right)
    
56554,  4  }, //vert thumb (bottom,left)
    
60556,  4  }, //vert thumb (bottom,middle)
    
66554,  4  }, //vert thumb (bottom,right)
    
60416,  8  }, //vert thumb (middle,middle,middle)
};

CustomDrawTable cdt_vert_active***91;***93; = 
{
    { 
2831,  1414 }, //up arrow   ACTIVE
    
42311414 }, //down arrow ACTIVE
    
WADLG_SCROLLBAR_INV_FGCOLORWADLG_SCROLLBAR_INV_BGCOLOR }, //page up     ACTIVE
    
WADLG_SCROLLBAR_INV_FGCOLORWADLG_SCROLLBAR_INV_BGCOLOR }, //page down  ACTIVE

    
{ -1, -1, -1, -},    //padding

    
70314,  4  }, //vert thumb (left)
    
74316,  4  }, //vert thumb (middle)
    
80314,  4  }, //vert thumb (right)
    
7035420  }, //vert thumb (middle,left)
    
74356,  6  }, //vert thumb (middle,middle,top)
    
74506,  6  }, //vert thumb (middle,middle,bottom)
    
8135320  }, //vert thumb (middle,right)
    
70554,  4  }, //vert thumb (bottom,left)
    
74556,  4  }, //vert thumb (bottom,middle)
    
80554,  4  }, //vert thumb (bottom,right)
    
74417,  9  }, //vert thumb (middle,middle,middle)
};

BOOL CUserInterface::OnCoolSBCustomDrawAlbumList(NMHDRpnmhLRESULTpResult)
{
    
NMCSBCUSTOMDRAW *pCSCD = (NMCSBCUSTOMDRAW *)pnmh;

    
// Take the default processing unless we set this to something else below.
    
*pResult 0;

    if (
pCSCD->dwDrawStage == CDDS_PREPAINT)
    {
        *
pResult CDRF_SKIPDEFAULT;
        return 
TRUE;
    }
    
    if(
pCSCD->dwDrawStage == CDDS_POSTPAINT)
    {
        
    }

    
RECT *rc;
    
CustomDrawTable *cdt;

    
//the sizing gripper in the bottom-right corner
    
if (pCSCD->nBar == SB_BOTH)    
    {
        
HBRUSH hbr CreateSolidBrush(WADlg_getColor(WADLG_SCROLLBAR_DEADAREA_COLOR));
        
FillRect(pCSCD->hdc, &pCSCD->recthbr);
        
DeleteObject(hbr);
            
        *
pResult CDRF_SKIPDEFAULT;
        return 
TRUE;
    }
    else if (
pCSCD->nBar == SB_HORZ)
    {
        
rc = &pCSCD->rect;

        if (
pCSCD->uState == CDIS_SELECTED
            
cdt = &cdt_horz_active***91;pCSCD->uItem***93;;
        else                   
            
cdt = &cdt_horz_normal***91;pCSCD->uItem***93;;
        
        if ((
pCSCD->uItem == HTSCROLL_PAGELEFT) ||
            (
pCSCD->uItem == HTSCROLL_PAGERIGHT))

        {
            
COLORREF fg WADlg_getColor(cdt->x);
            
COLORREF bg WADlg_getColor(cdt->y);

            
COLORREF color RGB((GetRValue(fg)+GetRValue(bg))/2,
                                (
GetGValue(fg)+GetGValue(bg))/2,
                                (
GetBValue(fg)+GetBValue(bg))/2);

            
HBRUSH hbr CreateSolidBrush(color);
            
FillRect(pCSCD->hdcrchbr);
            
DeleteObject(hbr);

            *
pResult CDRF_SKIPDEFAULT;
            return 
TRUE;
        }
        if (
pCSCD->uItem == HTSCROLL_THUMB)
        {
            
// get skin bitmap
            
HDC hdcSkin CreateCompatibleDC(pCSCD->hdc);
            
HBITMAP oBitmap = (HBITMAP)SelectObject(hdcSkinWADlg_getBitmap());
            
SetStretchBltMode(pCSCD->hdcCOLORONCOLOR);

            
// top left
            
StretchBlt(pCSCD->hdcrc->leftrc->top44hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle left
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->leftrc->top+44rc->bottom-rc->top-8hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// bottom left
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->leftrc->bottom-444hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
            
// top middle
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->toprc->right-rc->left-84hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle middle left
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->top+4, (rc->right-rc->left-8)/2+2rc->bottom-rc->top-7hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle middle right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-(rc->right-rc->left-8)/2-3rc->top+4, (rc->right-rc->left-8)/2rc->bottom-rc->top-7hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// bottom middle
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->bottom-cdt->heightrc->right-rc->left-8cdt->heighthdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);

            
// top right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-4rc->top44hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-4rc->top+44rc->bottom-rc->top-8hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// bottom right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-4rc->bottom-444hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);

            
// middle middle middle
            
cdt++;
            if ((
rc->right-rc->left-8) > cdt->width)
            {
                
StretchBlt(pCSCD->hdcrc->left+(rc->right-rc->left)/2-4rc->top+4cdt->widthcdt->heighthdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            }

            
// free dc
            
SelectObject(hdcSkinoBitmap);
            
DeleteDC(hdcSkin);

            *
pResult CDRF_SKIPDEFAULT;
            return 
TRUE;
        }
    }
    else if (
pCSCD->nBar == SB_VERT)
    {
        
rc = &pCSCD->rect;

        if (
pCSCD->uState == CDIS_SELECTED)  
            
cdt = &cdt_vert_active***91;pCSCD->uItem***93;;
        else                    
            
cdt = &cdt_vert_normal***91;pCSCD->uItem***93;;

        if ((
pCSCD->uItem == HTSCROLL_PAGEGUP) ||
            (
pCSCD->uItem == HTSCROLL_PAGEGDOWN))

        {
            
COLORREF fg WADlg_getColor(cdt->x);
            
COLORREF bg WADlg_getColor(cdt->y);

            
COLORREF color RGB((GetRValue(fg)+GetRValue(bg))/2,
                                (
GetGValue(fg)+GetGValue(bg))/2,
                                (
GetBValue(fg)+GetBValue(bg))/2);

            
HBRUSH hbr CreateSolidBrush(color);
            
FillRect(pCSCD->hdcrchbr);
            
DeleteObject(hbr);

            *
pResult CDRF_SKIPDEFAULT;
            return 
TRUE;
        }
        if (
pCSCD->uItem == HTSCROLL_THUMB)
        {
            
// get skin bitmap
            
HDC hdcSkin CreateCompatibleDC(pCSCD->hdc);
            
HBITMAP oBitmap = (HBITMAP)SelectObject(hdcSkinWADlg_getBitmap());
            
SetStretchBltMode(pCSCD->hdcCOLORONCOLOR);

            
// top left
            
StretchBlt(pCSCD->hdcrc->leftrc->top44hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// top middle
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->toprc->right-rc->left-84hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// top right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-4rc->top44hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);

            
// middle left
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->leftrc->top+44rc->bottom-rc->top-8hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle middle top
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->top+4rc->right-rc->left-7, (rc->bottom-rc->top-8)/2+2hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle middle bottom
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->bottom-(rc->bottom-rc->top-8)/2-4rc->right-rc->left-7, (rc->bottom-rc->top-8)/2hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-cdt->widthrc->top+4cdt->widthrc->bottom-rc->top-8hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);

            
// bottom left
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->leftrc->bottom-444hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// bottom middle
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->left+4rc->bottom-4rc->right-rc->left-84hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// bottom right
            
cdt++;
            
StretchBlt(pCSCD->hdcrc->right-4rc->bottom-444hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            
// middle middle middle
            
cdt++;
            if ((
rc->bottom-rc->top-8) > cdt->height)
            {
                
StretchBlt(pCSCD->hdcrc->left+4rc->top+(rc->bottom-rc->top)/2-4cdt->widthcdt->heighthdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);
            }

            
// free dc
            
SelectObject(hdcSkinoBitmap);
            
DeleteDC(hdcSkin);

            *
pResult CDRF_SKIPDEFAULT;
            return 
TRUE;
        }
    }
    else
    {
        *
pResult CDRF_DODEFAULT;
        return 
TRUE;
    }

    
// get skin bitmap
    
HDC hdcSkin CreateCompatibleDC(pCSCD->hdc);
    
HBITMAP oBitmap = (HBITMAP)SelectObject(hdcSkinWADlg_getBitmap());
    
SetStretchBltMode(pCSCD->hdcCOLORONCOLOR);

    
//normal bitmaps, use same code for HORZ and VERT
    
StretchBlt(pCSCD->hdcrc->leftrc->toprc->right-rc->leftrc->bottom-rc->top,
        
hdcSkincdt->xcdt->ycdt->widthcdt->heightSRCCOPY);

    
// free dc
    
SelectObject(hdcSkinoBitmap);
    
DeleteDC(hdcSkin);

    *
pResult CDRF_SKIPDEFAULT;
    return 
TRUE;

Safai is offline   Reply With Quote
Old 16th March 2004, 17:45   #26
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
the end result will look something like this...

Safai is offline   Reply With Quote
Old 16th March 2004, 17:53   #27
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
some nice little bits of code in there

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 17th March 2004, 06:22   #28
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
The winamp style close button

Hmm, I add my listview dynamically with CreateWindow but when I press the close button on the skinned window it just closes (or hides?) the listview. What command are being sent when I press that button? And to which window?

/Jonas
Joonas is offline   Reply With Quote
Old 17th March 2004, 10:42   #29
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
Two problems with Listview header skin

I posted Safai about one of these issues but I'll guess I take them both here as well.

First - The post-paint seems to erase the header controls sometimes. Often happens when the mouse is nearby...might be connected to the other issue...

Which is that I am using a virtual listview but when the header control code Safai used is implemented none of the items is shown. When removed it works fine...

Any help would be highly appreciated.

/Jonas
Joonas is offline   Reply With Quote
Old 17th March 2004, 14:35   #30
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
Joonas: i got your PM... but i guess i will answer here...

1) there was an issue when reordering the headers (drag&drop the column headers) that i had recently fixed but i guess the source that i posted was not up to date... sorry about that... other than that, i have never encountered that problem... replacement code for postpaint

PHP Code:
else if (CDDS_POSTPAINT == pCD->dwDrawStage)
{
    
int nRight 0;

    
int nCount Header_GetItemCount(pCD->hdr.hwndFrom);
    for (
int i=0i<nCount; ++i)
    {
        
RECT rc1;
        
Header_GetItemRect(pCD->hdr.hwndFromi, &rc1);
        
nRight max(nRightrc1.right);
    }
    
RECT rc;
    
GetClientRect(&rc);

    if (
nRight rc.right)
    {
        
rc.left nRight;
        
rc.right += 10;
        
HBRUSH hbr CreateSolidBrush(WADlg_getColor(WADLG_LISTHEADER_EMPTY_BGCOLOR));
        
FillRect(pCD->hdc, &rchbr);
        
DeleteObject(hbr);
    }

    return 
CDRF_DODEFAULT;

2) interesting, i'm using a virtual list too... that code should only affect the header, and not the list itself... might be you're not handling the WM_NOTIFY properly?? did you check for notification for ID '0' only? in your WM_NOTIFY handler, it has to check

pnmh->idFrom == 0
pnmh->code == NM_CUSTOMDRAW
Safai is offline   Reply With Quote
Old 17th March 2004, 14:51   #31
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
Re: The winamp style close button

Quote:
Originally posted by Joonas
Hmm, I add my listview dynamically with CreateWindow but when I press the close button on the skinned window it just closes (or hides?) the listview. What command are being sent when I press that button? And to which window?

/Jonas
from my understanding, WM_CLOSE is sent to the window that is the child (most likely your listview) of wadlg...

and this is what i do in mine...

PHP Code:
BOOL CUserInterface::OnClose()
{
    
GetParent().ShowWindow(SW_HIDE);
    
m_bShow FALSE;
    return 
TRUE;

Safai is offline   Reply With Quote
Old 17th March 2004, 15:00   #32
DrO
Winamp & SHOUTcast Team
 
DrO's Avatar
 
Join Date: Sep 2003
Posts: 26,683
code:
case WM_USER+101:
case WM_DESTROY:

// gets the top left corner for position restoring
if(jumpex_skin && jumpex_pos){
RECT rc;
GetWindowRect((jumpex_skin?jump_skin:hwnd),&rc);
jumpex_pos_x = rc.left;
jumpex_pos_y = rc.top;
}

// if the window is already open then force a close of it
// this will handle issues currently with the skin window not
// working correctly (only if clicked on so switching on/off
// will work)
if(msg == WM_USER+101 && jump_wnd){
DestroyWindow(jump_wnd);
}

jump_skin = 0;
break;

i've just taken this out of jtfe from my subclassed window frame proc. by catching either of the messages it's possible to allow/disallow a close and call the relevant window destructors, etc

-daz

If you have issues with Winamp or still want to get it, ensure
you get v5.666 build 3516 and the required plug-in updates
DrO is offline   Reply With Quote
Old 17th March 2004, 15:18   #33
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
still trouble

Here is my windowproc...same problem as before though even with that new postpaint. if you have the time you could perhaps point out what I'm doing wrong...

LRESULT bleh = CallWindowProc(oProc, wnd, msg, wParam, lParam);

switch (msg)
{
case WM_NOTIFY:
{
switch (((LPNMHDR)lParam)->code)
{
case LVN_GETDISPINFO: // dynamisk fråga om listview item som ska ritas upp
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)lParam;

if (pDispInfo->item.mask & LVIF_TEXT)
{
int index = pDispInfo->item.iItem;

FILESTRUCT* t = general->getFileStruct(index);

if (!general->isTagged(t))
{
ID3* tag = general->getWinampInterface()->getID3(strdup(t->path.c_str()));
t->title = strdup(tag->title);
t->artist = strdup(tag->artist);
t->album = strdup(tag->album);
t->tagged = true;

delete tag;
}

switch (pDispInfo->item.iSubItem)
{
case 0: strcpy(pDispInfo->item.pszText, t->title); break;
case 1: strcpy(pDispInfo->item.pszText, t->artist); break;
case 2: strcpy(pDispInfo->item.pszText, t->album); break;
case 3: strcpy(pDispInfo->item.pszText, t->path.c_str()); break;
}
} // end if

break;
} // end case

break;
} // end switch


case LISTVIEW: // om meddelandet gäller listview
{
NMCUSTOMDRAW* pCD = (NMCUSTOMDRAW*)lParam;

switch (pCD->dwDrawStage)
{
case CDDS_PREPAINT:
{
if (pCD->hdr.idFrom != 0)
return CDRF_NOTIFYITEMDRAW|CDRF_NOTIFYPOSTPAINT;
}

case CDDS_ITEMPREPAINT:
{
HBRUSH hbr = CreateSolidBrush(WADlg_getColor(WADLG_LISTHEADER_BGCOLOR));
FillRect(pCD->hdc, &pCD->rc, hbr);
DeleteObject(hbr);

HPEN pen1=CreatePen(PS_SOLID,0,WADlg_getColor(WADLG_LISTHEADER_FRAME_TOPCOLOR));
HPEN pen2=CreatePen(PS_SOLID,0,WADlg_getColor(WADLG_LISTHEADER_FRAME_MIDDLECOLOR));
HPEN pen3=CreatePen(PS_SOLID,0,0);
HGDIOBJ o=SelectObject(pCD->hdc, pen1);

if ((pCD->uItemState & CDIS_SELECTED) == CDIS_SELECTED)
{
SelectObject(pCD->hdc, pen3);
MoveToEx(pCD->hdc,pCD->rc.left,pCD->rc.bottom,NULL);
LineTo(pCD->hdc,pCD->rc.left,pCD->rc.top);
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.top);
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.bottom-1);
LineTo(pCD->hdc,pCD->rc.left,pCD->rc.bottom-1);
}
else
{
// left, top
MoveToEx(pCD->hdc,pCD->rc.left,pCD->rc.bottom,NULL);
LineTo(pCD->hdc,pCD->rc.left,pCD->rc.top);
LineTo(pCD->hdc,pCD->rc.right,pCD->rc.top);

// right, bottom
SelectObject(pCD->hdc, pen2);
MoveToEx(pCD->hdc,pCD->rc.left+1,pCD->rc.bottom-2,NULL);
LineTo(pCD->hdc,pCD->rc.right-2,pCD->rc.bottom-2);
LineTo(pCD->hdc,pCD->rc.right-2,pCD->rc.top);

// right, bottom (black line)
SelectObject(pCD->hdc, pen3);
MoveToEx(pCD->hdc,pCD->rc.left,pCD->rc.bottom-1,NULL);
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.bottom-1);
LineTo(pCD->hdc,pCD->rc.right-1,pCD->rc.top-1);
}

SetTextColor(pCD->hdc, WADlg_getColor(WADLG_LISTHEADER_FONTCOLOR));
SetBkMode(pCD->hdc, TRANSPARENT);

char name[MAX_PATH] = "";
HDITEM hdi;
hdi.mask = HDI_TEXT|HDI_FORMAT;
hdi.pszText = name;
hdi.cchTextMax = MAX_PATH;
Header_GetItem(pCD->hdr.hwndFrom, pCD->dwItemSpec, &hdi);

RECT rcItem = pCD->rc;
rcItem.left += 5;
rcItem.right -= 5;
rcItem.top ++;

if ((pCD->uItemState & CDIS_SELECTED) == CDIS_SELECTED)
{
rcItem.left ++;
rcItem.right ++;
}

int align = (hdi.fmt & HDF_JUSTIFYMASK) == LVCFMT_RIGHT ? DT_RIGHT : DT_LEFT;

DrawText(pCD->hdc, hdi.pszText, -1, &rcItem, align | DT_VCENTER | DT_SINGLELINE);

// clean up
SelectObject(pCD->hdc, o);
DeleteObject(pen1);
DeleteObject(pen2);
DeleteObject(pen3);

return CDRF_SKIPDEFAULT;
}

case CDDS_POSTPAINT:
{
int nRight = 0;

int nCount = Header_GetItemCount(pCD->hdr.hwndFrom);
for (int i=0; i<nCount; ++i)
{
RECT rc1;
Header_GetItemRect(pCD->hdr.hwndFrom, i, &rc1);
nRight = max(nRight, rc1.right);
}

RECT rc;
GetClientRect(listview->getHWND(), &rc); //listview is an object of mine that acts a wrapper for the listview control, returns the HWND for it...

if (nRight < rc.right)
{
rc.left = nRight;
rc.right += 10;
HBRUSH hbr = CreateSolidBrush(WADlg_getColor(WADLG_LISTHEADER_EMPTY_BGCOLOR));
FillRect(pCD->hdc, &rc, hbr);
DeleteObject(hbr);
}

return CDRF_DODEFAULT;
} // end case NM_CUSTOMDRAW
} // end switch
} // end case LISTVIEW
} // end case WM_NOTIFY
} // end switch

return bleh;
Joonas is offline   Reply With Quote
Old 17th March 2004, 15:30   #34
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
ehm correction

Sorry, this line is of course invalid:

if (pCD->hdr.idFrom != 0)
return CDRF_NOTIFYITEMDRAW|CDRF_NOTIFYPOSTPAINT;

it should only be

return CDRF_NOTIFYITEMDRAW|CDRF_NOTIFYPOSTPAINT;

but the problem remains...

/Jonas
Joonas is offline   Reply With Quote
Old 17th March 2004, 15:32   #35
Safai
Senior Member
 
Join Date: Sep 2000
Location: Canada
Posts: 249
Send a message via ICQ to Safai
what's that LISTVIEW thing? shouldn't it be NM_CUSTOMDRAW, also, getting the CUSTOMDRAW message should be done inside the listview's window proc

assuming the code you posted is not listview's, if it is, i don't know how that LVN_GETDISPINFO notification will work in your case, cuz that should be handled in the parent of listview...
Safai is offline   Reply With Quote
Old 17th March 2004, 15:35   #36
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
I don't know if I have a Listview window proc per se...I am not using MFC...I run it all through the window procedure...guess I have to try something later on..
Joonas is offline   Reply With Quote
Old 17th March 2004, 20:02   #37
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
Quote:
Originally posted by Safai
Joonas: i got your PM... but i guess i will answer here...

2) interesting, i'm using a virtual list too... that code should only affect the header, and not the list itself... might be you're not handling the WM_NOTIFY properly?? did you check for notification for ID '0' only? in your WM_NOTIFY handler, it has to check

pnmh->idFrom == 0
pnmh->code == NM_CUSTOMDRAW
It was exactly that idFrom that was the problem Thanks!

/Jonas
Joonas is offline   Reply With Quote
Old 18th March 2004, 11:15   #38
Joonas
Forum King
 
Join Date: Mar 2004
Location: Sweden
Posts: 2,263
more trouble..

Jesus...the problems never end. Bear with me for a little bit more

When I add (dynamically) the listview to the window I receive back from

window = (HWND)SendMessage(winampWindow, WM_WA_IPC, (WPARAM)wa_wnd, IPC_GET_EMBEDIF);

everything seems well, except that when the window is moved (repainted I presume) it auto-fits the listview to cover the entire window which isn't exactly what I want...I have other controls I want to add there too...anyone knows why it does that?

/Jonas
Joonas is offline   Reply With Quote
Reply
Go Back   Winamp & SHOUTcast Forums > Developer Center > Winamp Development

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump