www.pudn.com > winnap.rar > lrcmain.cpp


 
////////////////////////////////////////////// 
/// @defgroup plugin  插件窗体及消息处理 
/// @author  abao++ 
/// @version 1.0 
/// @date    2006-9-24 9:54:23 
/// @{ 
////////////////////////////////////////////// 
 
// Winamp general purpose plug-in mini-SDK 
// Copyright (C) 1997, Justin Frankel/Nullsoft 
 
#include  
#include  
#include  
#include "gen.h" 
#include  
#include "resource.h" 
#include "abao_lrc.h" 
 
 
#define SYSTRAY_ICON_BASE 2024 
AbaoLrcWindow lrc; 
int topwindowflag=0; 
void DrawTitleBar(HDC hdc); 
int OnNcMouseMove(POINT point); 
int OnNcLButtonDown(POINT point); 
#define ID_TIMER 1 
 
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) 
{ 
	return TRUE; 
} 
 
#define ENABLE_PREV 1 
 
 
HWND m_hWnd; 
 
 
 
HICON Icons; 
 
BOOL CALLBACK ConfigProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); 
BOOL CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); 
void config(); 
void quit(); 
int init(); 
void config_write(); 
void config_read(); 
void PopLrcMenu(int x,int y); 
 
 
 
winampGeneralPurposePlugin plugin = 
{ 
	GPPHDR_VER, 
	"abao++'s 歌词show v0.1", 
	init, 
	config, 
	quit, 
}; 
 
 

///显示tray图标
/*! 在tray栏显示歌词图标
    @param[in] int flag 
	-1 显示
	-0 注销
*/
void __stdcall do_icons(int flag) 
{ 
 
	if (flag) 
	{ 
		NOTIFYICONDATA tnid={0,}; 
		tnid.cbSize=sizeof(NOTIFYICONDATA); 
		tnid.hWnd=plugin.hwndParent; 
		tnid.uID=SYSTRAY_ICON_BASE; 
		Shell_NotifyIcon(NIM_DELETE, &tnid); 
	} 
	else 
	{ 
		if (lrc.AutoStartUp) 
		{ 
			if (!Icons) Icons = LoadIcon(plugin.hDllInstance,MAKEINTRESOURCE(IDI_ICON1)); 
			{ 
				NOTIFYICONDATA tnid={0,}; 
				tnid.cbSize=sizeof(NOTIFYICONDATA); 
				tnid.hWnd=plugin.hwndParent; 
				tnid.uID=SYSTRAY_ICON_BASE; 
				tnid.uFlags=NIF_ICON | NIF_TIP | NIF_MESSAGE; 
				tnid.uCallbackMessage=WM_USER + 2707; 
				tnid.hIcon=Icons;      
				sprintf(tnid.szTip,"abao++的歌词show啦"); 
				Shell_NotifyIcon(NIM_ADD, &tnid); 
			} 
		} 
	} 
} 
 
///窗体消息循环 
LRESULT CALLBACK LrcMainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
{  
	int x,y; 
	POINT pnt; 
	//if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY) 
	if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message == WM_NOTIFY||message==WM_NCACTIVATE) 
	{ 
		if(message==WM_MOVE) 
		{ // 从配置中得到 config_x 和 config_y  
			RECT r;  
			if(lrc.hMainWnd!=NULL) 
			{ 
				GetWindowRect(lrc.hMainWnd,&r);  
				lrc.WindowPosX = r.left;  
				lrc.WindowPosY = r.top;  
			} 
		}  
		PAINTSTRUCT ps;  
		RECT r;  
		HDC hdc = BeginPaint(hwnd,&ps);  
		GetClientRect(hwnd,&r);  
		BitBlt(hdc,0,0,r.right,r.bottom,lrc.memDC,0,0,SRCCOPY);  
		EndPaint(hwnd,&ps); 
		hdc=GetWindowDC(hwnd); 
		DrawTitleBar(hdc); 
		ReleaseDC(hwnd,hdc); 
		if(message==WM_NCACTIVATE) 
		{ 
			if(wParam==FALSE) return TRUE; 
		} 
		return 0; 
	} 
	switch (message)  
	{  
	case 0x46: 
		return 0; 
	case WM_NCLBUTTONDOWN: 
		x = LOWORD (lParam); 
		y= HIWORD (lParam);  
		pnt.x=x; 
		pnt.y=y; 
		if(!OnNcLButtonDown(pnt)) return 0; 
		break;		 
	case WM_NCMOUSEMOVE: 
		x = LOWORD (lParam); 
		y= HIWORD (lParam);  
		pnt.x=x; 
		pnt.y=y; 
		if(OnNcMouseMove(pnt)) return 0; 
		break; 
	case WM_RBUTTONDOWN: 
 
		x = LOWORD (lParam); 
		y= HIWORD (lParam);  
		PopLrcMenu(lrc.WindowPosX+x,lrc.WindowPosY+y); 
		return 0; 
	case WM_SIZE: 
		RECT r;  
		if(lrc.hMainWnd!=NULL) 
		{ 
			GetWindowRect(lrc.hMainWnd,&r);  
			lrc.Width = r.right-r.left;  
			lrc.Height = r.bottom-r.top;  
		} 
		return 0; 
	case WM_CREATE:  
		m_hWnd=hwnd; return 0;  
		 
	case WM_ERASEBKGND: return 0;  
	case WM_PAINT:  
		{ // 以双缓冲的信息更新窗口显示  
			PAINTSTRUCT ps;  
			RECT r;  
			HDC hdc = BeginPaint(hwnd,&ps);  
			GetClientRect(hwnd,&r);  
			BitBlt(hdc,0,0,r.right,r.bottom,lrc.memDC,0,0,SRCCOPY);  
			EndPaint(hwnd,&ps);  
		}  
		return 0;  
	case WM_DESTROY:  
		//PostQuitMessage(0);  
		quit(); 
		return 0;  
	case WM_KEYDOWN: // 将键盘消息传递给 WinAMP 主窗口 (使其被处理)  
	case WM_KEYUP:  
		{ // 从窗口的用户数据中得到 lrcmod  
			//winampGenMod *lrcmod = (winampGenMod *)         
			//	GetWindowLong(hwnd,GWL_USERDATA);  
			PostMessage(lrc.hWinampWnd,message,wParam,lParam);  
		}  
		return 0;  
	}  
	return DefWindowProc(hwnd,message,wParam,lParam);  
}  
 
void config() 
{ 
	DialogBox(plugin.hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),plugin.hwndParent,ConfigProc); 
} 
void about() 
{ 
	DialogBox(plugin.hDllInstance,MAKEINTRESOURCE(IDD_DIALOG2),plugin.hwndParent,AboutProc); 
} 
void quit() 
{ 
	// 写入配置  
	SelectObject(lrc.memDC,lrc.oldBM); // 删除双缓冲  
	DeleteObject(lrc.memDC); 
	DeleteObject(lrc.memBM); 
	DestroyWindow(lrc.hMainWnd); // 销毁窗口  
	UnregisterClass(lrc.szAppName,plugin.hDllInstance); // 取消窗口类的注册  
	//lrc.config_enabled=0; 
	lrc.WriteConfig();  
	KillTimer(lrc.hMainWnd,ID_TIMER); 
	do_icons(1); 
} 
BOOL CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) 
{ 
	switch (uMsg) 
	{ 
	case WM_COMMAND: 
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{ 
			 
			EndDialog(hwndDlg,0); 
		} 
		break; 
	} 
	return FALSE; 
} 
 
void SetLrcTopWindow(HWND ZorderFlag) 
{ 
	topwindowflag=!topwindowflag; 
	SetWindowPos(lrc.hMainWnd,ZorderFlag, lrc.WindowPosX,lrc.WindowPosY,lrc.Width,lrc.Height,SWP_NOMOVE|SWP_NOACTIVATE); 
} 
 
WNDPROC lpWndProcOld; 
void DoPopMenu(int selection) 
{ 
	switch(selection) 
	{ 
	case 1: 
		DialogBox(plugin.hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),plugin.hwndParent,ConfigProc); 
		break; 
	case 2: 
		SetLrcTopWindow(topwindowflag?HWND_TOP:HWND_TOPMOST); 
		break; 
	case 3: 
		lrc.addoffset(-2000); 
		break; 
	case 4: 
		lrc.addoffset(-500); 
		break; 
	case 5: 
		lrc.addoffset(500); 
		break; 
	case 6: 
		lrc.addoffset(3000); 
		break; 
	default: 
		break;			 
	} 
} 
 
void PopLrcMenu(int x,int y) 
{ 
	HMENU lrcmenu; 
	lrcmenu=CreatePopupMenu(); 
	int nMenuID=1; 
	AppendMenu(lrcmenu,MF_STRING|MF_ENABLED,nMenuID++,"设置"); 
	AppendMenu(lrcmenu,MF_STRING|MF_ENABLED,nMenuID++,topwindowflag?"取消窗口置顶":"窗口置顶"); 
	AppendMenu(lrcmenu,MF_STRING|MF_ENABLED,nMenuID++,"提前3秒"); 
	AppendMenu(lrcmenu,MF_STRING|MF_ENABLED,nMenuID++,"提前半秒"); 
	AppendMenu(lrcmenu,MF_STRING|MF_ENABLED,nMenuID++,"延迟半秒"); 
	AppendMenu(lrcmenu,MF_STRING|MF_ENABLED,nMenuID++,"延迟3秒"); 
	int nSelection=TrackPopupMenu(lrcmenu, 
		TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|TPM_NONOTIFY|TPM_RETURNCMD, x,y,0,lrc.hMainWnd,0); 
	DoPopMenu(nSelection); 
	DestroyMenu(lrcmenu); //销毁菜单	 
} 
 
LRESULT CALLBACK LrcWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
 
	if (message == WM_USER+2707) 
	{ 
		switch (LOWORD(lParam)) 
		{ 
		case WM_RBUTTONDOWN: 
			if (lrc.AutoStartUp)  
				switch (LOWORD(wParam)) 
			{ 
				case 1024: 
					{ 
						POINT point; 
						GetCursorPos(&point); 
						PopLrcMenu(point.x ,point.y); 
					} 
					return 0; 
			} 
			break; 
		} 
	} 
	return CallWindowProc(lpWndProcOld,hwnd,message,wParam,lParam); 
} 
 
void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) 
{ 
	//处理WM_TIMER讯息  
	lrc.ShowLrc(); 
} 
int CreateLrc(); 
int init() 
{ 
	//* 
	lrc.ReadConfig(); // 读取配置信息  
	//	lrc.modhdl=&plugin; 
	if(lrc.AutoStartUp==1) 
	{ 
		if(CreateLrc()) return 1; 
	} 
	lrc.hWinampWnd=plugin.hwndParent; 
	return 0; 
} 
int setwindowalpha(HWND hwnd,int alpha) 
{ 
	HINSTANCE hInst = LoadLibrary("User32.DLL");  
	if(hInst)  
	{  
		typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);  
		MYFUNC fun = NULL; 
		//取得SetLayeredWindowAttributes函数指针  
		fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
		if(fun)fun(hwnd,0,alpha,2);  
		FreeLibrary(hInst);  
	} 
return 1; 
} 
int CreateLrc() 
	{ // 注册窗口类  
		WNDCLASS wc;  
		memset(&wc,0,sizeof(wc));  
		wc.lpfnWndProc = LrcMainWndProc; // 窗口处理过程  
		wc.hInstance = plugin.hDllInstance; // DLL 的实例句柄  
		wc.lpszClassName = lrc.szAppName; // 窗口类名  
 
		if (!RegisterClass(&wc))  
		{  
			MessageBox(plugin.hwndParent,"注册窗口错误","blah",MB_OK);  
			return 1;  
		}  
 
 
	lrc.hMainWnd = CreateWindow( 
		// 这些扩展风格建立一个好看的小窗口外框,  
		// 但是窗口在任务栏上有一个按钮  
		lrc.szAppName, // 窗口类名  
		"", // 窗口标题使用模块描述  
		//	WS_VISIBLE|(~(WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_THICKFRAME)) , // 使窗口可见并且有一个关闭按钮  
		//WS_VISIBLE^(~(WS_CAPTION|WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_THICKFRAME)) ,  
		//WS_VISIBLE, 
		//WS_POPUP, 
		WS_THICKFRAME, 
		lrc.WindowPosX,lrc.WindowPosY, // 窗口的屏幕位置 (从配置中读取)  
		lrc.Width,lrc.Height, // 窗口的宽高 (需要在后面调整客户区尺寸)  
		plugin.hwndParent, // 父窗口句柄 (WinAMP 主窗口)  
		NULL, // 无菜单  
		plugin.hDllInstance, // DLL 的实例句柄  
		0); // 无窗口创建数据  
	//SetLrcTopWindow(); 
	if (!lrc.hMainWnd)  
	{  
		MessageBox(plugin.hwndParent,"创建窗口错误","blah",MB_OK);  
		//ErrorExit("创建窗口错误"); 
		return 1;  
	}  
 
 
	//SetWindowLong(lrc.hMainWnd,GWL_USERDATA,(LONG)plugin);  
	// 将窗口用户数据设为模块结构体指针  
 
	{ // 调整窗口尺寸以使得客户区等于宽乘高  
		RECT r;  
		GetClientRect(lrc.hMainWnd,&r);  
		SetWindowPos(lrc.hMainWnd,0,0,0,lrc.Width*2-r.right,lrc.Height*2-      
			r.bottom,SWP_NOMOVE|SWP_NOZORDER);  
	}  
 
 
	// 创建双缓冲  
 
	lrc.memDC = CreateCompatibleDC(NULL);  
	lrc.memBM = CreateCompatibleBitmap(lrc.memDC,lrc.Width,lrc.Height);  
	lrc.oldBM = (HBITMAP)SelectObject(lrc.memDC,lrc.memBM);  
	// 显示窗口  
	ShowWindow(lrc.hMainWnd,SW_SHOWNORMAL); 
	lpWndProcOld = (WNDPROC)SetWindowLong(plugin.hwndParent,GWL_WNDPROC,(LONG)LrcWndProc); 
	//*/	 
	SetWindowLong(lrc.hMainWnd,GWL_EXSTYLE,GetWindowLong(lrc.hMainWnd,GWL_EXSTYLE)^0x80000); 
	 
 
	if(lrc.AlphaFlag) setwindowalpha(lrc.hMainWnd,lrc.AlphaValue); 
	else setwindowalpha(lrc.hMainWnd,255); 
	do_icons(0); 
	SetTimer(lrc.hMainWnd,ID_TIMER,50,TimerProc); 
	return 0; 
} 
 
 
 
BOOL CALLBACK ConfigProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) 
{ 
	switch (uMsg) 
	{ 
	case WM_INITDIALOG: 
		{ 
			CheckDlgButton(hwndDlg,IDC_PREV,lrc.AutoStartUp); 
			CheckDlgButton(hwndDlg,IDC_CHECK1,lrc.FilterLrcFlag); 
			CheckDlgButton(hwndDlg,IDC_CHECK2,lrc.lrcfile.SearchFlag); 
			CheckDlgButton(hwndDlg,IDC_CHECK3,lrc.lrcfile.SaveLrcFlag); 
			CheckDlgButton(hwndDlg,IDC_CHECK4,lrc.lrcfile.SearchHttpFlag); 
			CheckDlgButton(hwndDlg,IDC_CHECK5,lrc.AlphaFlag); 
			 
			SetDlgItemText(hwndDlg,IDC_EDIT1,lrc.FilterString.c_str()); 
			SetDlgItemText(hwndDlg,IDC_EDIT2,lrc.lrcfile.SearchPath.c_str()); 
			char temp[20]; 
			sprintf(temp,"%d",lrc.FontHeight); 
			SetDlgItemText(hwndDlg,IDC_EDIT3,temp); 
			sprintf(temp,"%d",lrc.RowLedge); 
			SetDlgItemText(hwndDlg,IDC_EDIT4,temp); 
			sprintf(temp,"%d",lrc.AlphaValue); 
			SetDlgItemText(hwndDlg,IDC_EDIT5,temp); 
			SetWindowText(hwndDlg,PLUGIN_DESC); 
		} 
		break; 
	case WM_COMMAND: 
		if (LOWORD(wParam) >= IDC_PREV && LOWORD(wParam) <= IDC_PREV5) 
		{ 
			lrc.AutoStartUp=0; 
			if (IsDlgButtonChecked(hwndDlg,IDC_PREV)) 
				lrc.AutoStartUp =1; 
			do_icons(!lrc.AutoStartUp); 
		} 
		if (LOWORD(wParam) ==IDC_BUTTON5) 
		{ 
			about(); 
		} 
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{ 
			char buf[512]; 
			lrc.FilterLrcFlag=0; 
			lrc.lrcfile.FilterFlag=0; 
			lrc.lrcfile.SearchFlag=0; 
			lrc.lrcfile.SaveLrcFlag=0; 
			lrc.lrcfile.SearchHttpFlag=0; 
			lrc.AlphaFlag=0; 
			if (IsDlgButtonChecked(hwndDlg,IDC_CHECK1)) 
			{ 
				lrc.FilterLrcFlag=1; 
				lrc.lrcfile.FilterFlag=1; 
			} 
			if (IsDlgButtonChecked(hwndDlg,IDC_CHECK2)) 
			{ 
				lrc.lrcfile.SearchFlag=1; 
			} 
			if (IsDlgButtonChecked(hwndDlg,IDC_CHECK3)) 
			{ 
				lrc.lrcfile.SaveLrcFlag=1; 
			} 
			if (IsDlgButtonChecked(hwndDlg,IDC_CHECK4)) 
			{ 
				lrc.lrcfile.SearchHttpFlag=1; 
			} 
			if (IsDlgButtonChecked(hwndDlg,IDC_CHECK5)) 
			{ 
				lrc.AlphaFlag=1; 
			} 
			int oldoffset=lrc.lrcfile.offset; 
	 
			lrc.lrcfile.offset=oldoffset; 
			GetWindowText(GetDlgItem(hwndDlg,IDC_EDIT1),buf,512); 
			lrc.setfilter(buf); 
			GetWindowText(GetDlgItem(hwndDlg,IDC_EDIT2),buf,512); 
			if(buf!=lrc.lrcfile.SearchPath) 
			{ 
				lrc.lrcfile.SearchPath=buf; 
				if(lrc.lrcfile.SearchFlag) lrc.lrcfile.GetFileFromDir(lrc.lrcfile.SearchPath,1); 
			} 
			GetWindowText(GetDlgItem(hwndDlg,IDC_EDIT3),buf,512); 
			sscanf(buf,"%d",&lrc.FontHeight); 
			GetWindowText(GetDlgItem(hwndDlg,IDC_EDIT4),buf,512); 
			sscanf(buf,"%d",&lrc.RowLedge); 
			GetWindowText(GetDlgItem(hwndDlg,IDC_EDIT5),buf,512); 
			sscanf(buf,"%d",&lrc.AlphaValue); 
			if(lrc.lrcfile.lrcmap.empty()&&lrc.IsSearch==0)                      
			{ 
					lrc.lrcfile.InitLrc(lrc.lrcfile.LrcFileName); 
			} 
			if(lrc.AlphaFlag) setwindowalpha(lrc.hMainWnd,lrc.AlphaValue); 
			else setwindowalpha(lrc.hMainWnd,255); 
			lrc.drawlrcbitmap(); 
			EndDialog(hwndDlg,0); 
		} 
		if(LOWORD(wParam)==IDC_BUTTON3) 
		{ 
			CreateLrc(); 
		} 
		if(LOWORD(wParam)==IDC_BUTTON2) 
		{		 
			BROWSEINFO  bi; 
			bi.hwndOwner=NULL;  
			bi.pidlRoot=NULL;  
			bi.pszDisplayName=NULL;  
			bi.lpszTitle=NULL;  
			bi.ulFlags=0;  
			bi.lpfn =NULL;  
			bi.iImage =0;  
			LPCITEMIDLIST pidl=SHBrowseForFolder(&bi);  
			if(!pidl)  return false;  
			TCHAR  szDisplayName[255];  
			SHGetPathFromIDList(pidl,szDisplayName); 
			lrc.lrcfile.SearchPath=szDisplayName; 
			lrc.lrcfile.SearchPath+='\\'; 
			SetDlgItemText(hwndDlg,IDC_EDIT2,lrc.lrcfile.SearchPath.c_str()); 
		} 
		break; 
	} 
	return FALSE; 
} 
RECT m_rtButtExit;	//关闭按钮位置 
RECT m_rtButtMax;	//最大化按钮位置 
RECT m_rtButtMin;	//最小化按钮位置 
RECT m_rtButtHelp;	//帮助按钮位置 
RECT m_rtIcon;		//图标位置 
void DrawTitleBar(HDC hdc) 
{ 
	if (m_hWnd) 
	{								 
		//Brush(RGB(0,100,255)); 
		HBRUSH Brush=CreateSolidBrush(RGB(95,95,144)); //0x000064ff); 
		HBRUSH pOldBrush =(HBRUSH)SelectObject(hdc,Brush);  
 
		//CRect rtWnd, rtTitle, rtButtons; 
		RECT rtWnd,rtTitle,rtButtons; 
		GetWindowRect(m_hWnd,&rtWnd);  
		//取得标题栏的位置 
		rtTitle.left = GetSystemMetrics(SM_CXFRAME); 
		rtTitle.top = GetSystemMetrics(SM_CYFRAME); 
		rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME); 
		rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE); 
 
		POINT point; 
		//填充顶部框架 
		point.x = rtWnd.right -rtWnd.left;//rtWnd.Width(); 
		point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+3;//+20; 
		PatBlt(hdc,0, 0, point.x, point.y, PATCOPY); 
		//填充左侧框架 
		point.x = GetSystemMetrics(SM_CXFRAME) + 1; 
		point.y = rtWnd.bottom-rtWnd.top;//rtWnd.Height(); 
		PatBlt(hdc,0, 0, point.x, point.y, PATCOPY); 
		//填充底部框架 
		point.x = rtWnd.right -rtWnd.left;  
		point.y = GetSystemMetrics(SM_CYFRAME) + 1; 
		PatBlt(hdc,0, rtWnd.bottom-rtWnd.top-point.y, point.x, point.y, PATCOPY); 
		//填充右侧框架 
		point.x = GetSystemMetrics(SM_CXFRAME) + 1; 
		point.y = rtWnd.bottom-rtWnd.top; 
		PatBlt(hdc,rtWnd.right -rtWnd.left -point.x,0, point.x, point.y, PATCOPY); 
 
		//绘制美化线条 
		HBRUSH BrushLine=CreateSolidBrush(RGB(255,255,255)); 
		SelectObject(hdc,BrushLine); 
 
		point.x = rtWnd.right -rtWnd.left ; 
		point.y =  2; 
		PatBlt(hdc,GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY); 
		point.y += 2; 
		PatBlt(hdc,GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY); 
		point.y += 2; 
		PatBlt(hdc,GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY); 
		point.x -=90; 
		point.y += 5; 
		PatBlt(hdc,point.x, point.y, 85, 1, PATCOPY); 
		point.y += 5; 
		PatBlt(hdc,point.x, point.y, 85, 1, PATCOPY); 
 
		point.x -= 30 - GetSystemMetrics(SM_CXFRAME); 
		point.y += 5; 
		PatBlt(hdc,point.x, point.y, 100-GetSystemMetrics(SM_CXFRAME) , 1, PATCOPY); 
		point.y -= 22; 
		PatBlt(hdc,point.x, point.y, 1 , 32, PATCOPY); 
 
		SelectObject(hdc,pOldBrush); 
 
		//重画图标 
		m_rtIcon.left = rtWnd.right -rtWnd.left - 135; 
		m_rtIcon.top = GetSystemMetrics(SM_CYFRAME); 
		m_rtIcon.right = m_rtIcon.left + 32; 
		m_rtIcon.bottom = m_rtIcon.top + 32; 
 
		HICON m_hIcon; 
		m_hIcon=LoadIcon(plugin.hDllInstance,MAKEINTRESOURCE(IDI_ICON1)); 
		DrawIconEx(hdc, m_rtIcon.left, m_rtIcon.top, m_hIcon,  
			(m_rtIcon.right-m_rtIcon.left)/2, (m_rtIcon.bottom-m_rtIcon.top)/2, 0, NULL, DI_NORMAL); 
		POINT temp; 
		temp.x=rtWnd.left; 
		temp.y=rtWnd.top; 
		OffsetRect(&m_rtIcon,rtWnd.left,rtWnd.top);  
 
		//准备画XP风格按钮 
		//CBitmap* pBitmap = new CBitmap; 
		HBITMAP pBitMap; 
		//CBitmap* pOldBitmap; 
		HBITMAP* pOldBitmap; 
		//CDC* pDisplayMemDC=new CDC; 
		HDC pDisplayMemDc; 
		pDisplayMemDc=CreateCompatibleDC(hdc); 
		//pDisplayMemDC->CreateCompatibleDC(pDC); 
 
		//重画关闭button 
		rtButtons.left = rtTitle.right - 19; 
		rtButtons.top = rtTitle.top; 
		rtButtons.right = rtButtons.left + 19; 
		rtButtons.bottom = rtButtons.top + 19; 
		pBitMap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_EXIT_NORMAL)); 
		//pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
		pOldBitmap=(HBITMAP*)SelectObject(pDisplayMemDc,pBitMap); 
		//pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); 
		BitBlt(hdc,rtButtons.left, rtButtons.top, rtButtons.right-rtButtons.left, rtButtons.bottom-rtButtons.top,pDisplayMemDc, 0, 0, SRCCOPY); 
		//pDisplayMemDC->SelectObject(pOldBitmap); 
		SelectObject(pDisplayMemDc,pOldBitmap); 
		m_rtButtExit = rtButtons; 
		//m_rtButtExit.OffsetRect(rtWnd.TopLeft());  
		OffsetRect(&m_rtButtExit,rtWnd.left,rtWnd.top); 
		//pBitmap->DeleteObject(); 
		DeleteObject(pBitMap); 
 
		/* 
		rtButtons.right = rtButtons.left - 3; 
		rtButtons.left = rtButtons.right - 19; 
		if (IsZoomed(m_hWnd)) 
		pBitMap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_RESTORE_NORMAL)); 
		else 
		pBitMap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_MAX_NORMAL)); 
		pOldBitmap=(HBITMAP*)SelectObject(pDisplayMemDc,pBitMap); 
		BitBlt(hdc,rtButtons.left, rtButtons.top, rtButtons.right-rtButtons.left, rtButtons.bottom-rtButtons.top, pDisplayMemDc, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDc,pOldBitmap); 
		m_rtButtMax = rtButtons; 
		OffsetRect(&m_rtButtMax,rtWnd.left,rtWnd.top); 
		DeleteObject(pBitMap); 
 
		//重画最小化button 
		rtButtons.right = rtButtons.left - 3; 
		rtButtons.left = rtButtons.right - 19; 
		pBitMap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_MIN_NORMAL)); 
		//pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
		pOldBitmap=(HBITMAP*)SelectObject(pDisplayMemDc,pBitMap); 
		//pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); 
		BitBlt(hdc,rtButtons.left, rtButtons.top, rtButtons.right-rtButtons.left, rtButtons.bottom-rtButtons.top, pDisplayMemDc, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDc,pOldBitmap); 
		m_rtButtMin = rtButtons; 
		OffsetRect(&m_rtButtMin,rtWnd.left,rtWnd.top); 
		DeleteObject(pBitMap); 
 
		//重画帮助button 
		rtButtons.right = rtButtons.left - 3; 
		rtButtons.left = rtButtons.right - 19; 
		pBitMap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_HELP_NORMAL)); 
		//pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); 
		pOldBitmap=(HBITMAP*)SelectObject(pDisplayMemDc,pBitMap); 
		//BitBlt(hdc,rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); 
		BitBlt(hdc,rtButtons.left, rtButtons.top, rtButtons.right-rtButtons.left, rtButtons.bottom-rtButtons.top, pDisplayMemDc, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDc,pOldBitmap); 
		m_rtButtHelp = rtButtons; 
		OffsetRect(&m_rtButtHelp,rtWnd.left,rtWnd.top); 
		DeleteObject(pBitMap); 
		*/ 
		//重画caption 
		int nOldMode = GetBkMode(hdc); 
		SetBkMode(hdc,TRANSPARENT); 
		COLORREF clOldText=GetTextColor(hdc); 
		SetTextColor(hdc,RGB(255,255,255)); 
		//pDC->SetTextColor(RGB(255, 255, 255)); 
		//GetStockObject(YSTEM_FIXED_FONT); 
		GetStockObject(SYSTEM_FIXED_FONT); 
		//rtTitle.left += 2; 
		//rtTitle.top += GetSystemMetrics(SM_CYSIZE); 
		//rtTitle.bottom = rtTitle.top + 30; 
		char m_strTitle[100]="abao++'s lrcshow"; 
		//GetWindowText(m_hWnd,m_strTitle,256); 
		DrawText(hdc,m_strTitle,-1, &rtTitle, DT_LEFT); 
		SetBkMode(hdc,nOldMode); 
		SetTextColor(hdc,clOldText); 
	} 
} 
 
int OnNcLButtonDown(POINT point)  
{ 
	if (PtInRect(&m_rtButtExit,point)) 
		SendMessage(lrc.hMainWnd,WM_CLOSE,0,0); 
	else if (PtInRect(&m_rtButtMin,point)) 
		SendMessage(lrc.hMainWnd,WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y)); 
	else if (!IsZoomed(lrc.hMainWnd)) 
		return 1; 
	return 0; 
} 
 
int OnNcMouseMove(POINT point)  
{ 
	HDC pDC = GetWindowDC(lrc.hMainWnd); 
	HDC pDisplayMemDC=CreateCompatibleDC(pDC); 
	HBITMAP pBitmap; 
	HBITMAP pOldBitmap; 
	RECT rtWnd, rtButton; 
 
	if (pDC) 
	{ 
		GetWindowRect(lrc.hMainWnd,&rtWnd); 
 
		//关闭button 
		if (PtInRect(&m_rtButtExit,point)) 
			pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_EXIT_FOCUS)); 
		else 
			pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_EXIT_NORMAL)); 
		rtButton = m_rtButtExit; 
		OffsetRect(&rtButton,-rtWnd.left, -rtWnd.top); 
		pOldBitmap=(HBITMAP)SelectObject(pDisplayMemDC,pBitmap); 
		BitBlt(pDC,rtButton.left, rtButton.top, rtButton.right-rtButton.left, rtButton.bottom-rtButton.top, pDisplayMemDC, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDC,pOldBitmap); 
		DeleteObject(pBitmap); 
		/* 
		//最大化/恢复button 
		if (PtInRect(&m_rtButtMax,point)) 
		{ 
		if (IsZoomed(lrc.hMainWnd)) 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_RESTORE_FOCUS)); 
		else 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_MAX_FOCUS)); 
		} 
		else 
		{ 
		if (IsZoomed(lrc.hMainWnd)) 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_RESTORE_NORMAL)); 
		else 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_MAX_NORMAL)); 
		} 
		rtButton = m_rtButtMax; 
		OffsetRect(&rtButton,-rtWnd.left, -rtWnd.top); 
		pOldBitmap=(HBITMAP)SelectObject(pDisplayMemDC,pBitmap); 
		BitBlt(pDC,rtButton.left, rtButton.top, rtButton.right-rtButton.left, rtButton.bottom-rtButton.top, pDisplayMemDC, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDC,pOldBitmap); 
		DeleteObject(pBitmap); 
 
		//最小化button 
		if (PtInRect(&m_rtButtMin,point)) 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_MIN_FOCUS)); 
		else 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_MIN_NORMAL)); 
		rtButton = m_rtButtMin; 
		OffsetRect(&rtButton,-rtWnd.left, -rtWnd.top); 
		pOldBitmap=(HBITMAP)SelectObject(pDisplayMemDC,pBitmap); 
		BitBlt(pDC,rtButton.left, rtButton.top,  rtButton.right-rtButton.left, rtButton.bottom-rtButton.top, pDisplayMemDC, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDC,pOldBitmap); 
		DeleteObject(pBitmap); 
 
		//帮助button 
		if (PtInRect(&m_rtButtHelp,point)) 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_HELP_FOCUS)); 
		else 
		pBitmap=LoadBitmap(plugin.hDllInstance,MAKEINTRESOURCE(IDB_HELP_NORMAL)); 
		rtButton = m_rtButtHelp; 
		OffsetRect(&rtButton,-rtWnd.left, -rtWnd.top); 
		pOldBitmap=(HBITMAP)SelectObject(pDisplayMemDC,pBitmap); 
		BitBlt(pDC,rtButton.left, rtButton.top,  rtButton.right-rtButton.left, rtButton.bottom-rtButton.top, pDisplayMemDC, 0, 0, SRCCOPY); 
		SelectObject(pDisplayMemDC,pOldBitmap); 
		DeleteObject(pBitmap); 
		*/ 
	} 
 
	ReleaseDC(lrc.hMainWnd,pDisplayMemDC); 
	ReleaseDC(lrc.hMainWnd,pDC); 
	return 1; 
} 
#ifdef __cplusplus  
extern "C" {  
#endif  
	__declspec( dllexport ) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin() 
	{ 
		return &plugin; 
	} 
#ifdef __cplusplus  
}  
#endif  
 
 
/// @}  文件注释完毕