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
/// @} 文件注释完毕