winamp/Src/Plugins/Library/ml_pmp/banner.cpp

216 lines
4.7 KiB
C++
Raw Normal View History

2024-09-24 14:54:57 +02:00
#include ".\banner.h"
#include "..\gen_ml\graphics.h"
MLBanner::MLBanner(void)
{
bmpBck = NULL;
bmpLogo = NULL;
bmpLogoMask = NULL;
bmpBanner = NULL;
oldWndProc = NULL;
color1 = RGB(0,0,0);
color2 = RGB(255,255,255);
hInstance = NULL;
logoResId = 0;
bgndResId = 0;
m_hwnd = 0;
SetRect(&rcBanner, 0,0,0,0);
}
MLBanner::~MLBanner(void)
{
DestroyImages();
SetWindowLongPtr(m_hwnd, GWLP_WNDPROC, (LONG_PTR)oldWndProc);
oldWndProc = NULL;
}
void MLBanner::SetColors(int color1, int color2)
{
this->color1 = color1;
this->color2 = color2;
ReloadImages();
}
void MLBanner::SetImages(HINSTANCE hInstance, int bgndResId, int logoResId)
{
this->hInstance = hInstance;
this->logoResId = logoResId;
this->bgndResId = bgndResId;
ReloadImages();
}
void MLBanner::ReloadImages(void)
{
DestroyImages();
if (hInstance)
{
if (bgndResId)
{
bmpBck = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(bgndResId), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if (bmpBck) bmpBck = PatchBitmapColors24(bmpBck, color1, color2, Filter1);
}
if (logoResId)
{
bmpLogo = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(logoResId), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if (bmpLogo)
{
bmpLogoMask = CreateBitmapMask(bmpLogo, 1,1);
}
}
}
}
void MLBanner::DestroyImages(void)
{
if (bmpBck) DeleteObject(bmpBck);
bmpBck = NULL;
if (bmpLogo) DeleteObject(bmpLogo);
bmpLogo = NULL;
if (bmpLogoMask) DeleteObject(bmpLogoMask);
bmpLogoMask = NULL;
if (bmpBanner) DeleteObject(bmpBanner);
bmpBanner = NULL;
}
void MLBanner::UpdateBunnerBmp(void)
{
if (bmpBanner) DeleteObject(bmpBanner);
HDC hdc = GetDC(m_hwnd);
bmpBanner = CreateCompatibleBitmap(hdc, rcBanner.right, rcBanner.bottom);
HDC memDstDC = CreateCompatibleDC (hdc);
HDC memSrcDC = CreateCompatibleDC (hdc);
SelectObject(memDstDC, bmpBanner);
SelectObject(memSrcDC, bmpBck);
for (int i = 0; i < rcBanner.right; i++)
{
BitBlt(memDstDC,
i,0,
1, rcBanner.bottom,
memSrcDC,
0,0,
SRCCOPY);
}
BITMAP bm;
GetObject(bmpLogo, sizeof(BITMAP), &bm);
SelectObject(memSrcDC, bmpLogoMask);
BitBlt(memDstDC,
6,
max(2, (rcBanner.bottom - bm.bmHeight) / 2),
min(rcBanner.right - 4, bm.bmWidth),
min(rcBanner.bottom - 2, bm.bmHeight),
memSrcDC,
0,0,
SRCAND);
SelectObject(memSrcDC, bmpLogo);
BitBlt(memDstDC,
6,
max(2, (rcBanner.bottom - bm.bmHeight) / 2),
min(rcBanner.right - 4, bm.bmWidth),
min(rcBanner.bottom - 2, bm.bmHeight),
memSrcDC,
0,0,
SRCPAINT);
ReleaseDC(m_hwnd, hdc);
DeleteDC(memDstDC);
DeleteDC(memSrcDC);
}
void MLBanner::Init(HWND hwnd)
{
m_hwnd = hwnd;
SetWindowLongPtr(hwnd,GWLP_USERDATA,(LONG_PTR)this);
oldWndProc= (WNDPROC) SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)newWndProc);
UpdateBunnerBmp();
}
INT_PTR CALLBACK MLBanner::newWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
MLBanner *banner = (MLBanner*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch(uMsg)
{
case WM_SIZE:
if (SIZE_MINIMIZED != wParam)
{
SetRect(&banner->rcBanner, 0,0,LOWORD(lParam),HIWORD(lParam));
banner->UpdateBunnerBmp();
}
break;
case WM_ERASEBKGND:
{
HDC hdc = GetDC(hwndDlg);
if (banner->bmpBanner)
{
HDC memSrcDC = CreateCompatibleDC (hdc);
SelectObject(memSrcDC, banner->bmpBanner);
StretchBlt( hdc,
banner->rcBanner.left,
banner->rcBanner.top,
banner->rcBanner.right - banner->rcBanner.left,
banner->rcBanner.bottom - banner->rcBanner.top,
memSrcDC,
banner->rcBanner.left,
banner->rcBanner.top,
banner->rcBanner.right - banner->rcBanner.left,
banner->rcBanner.bottom - banner->rcBanner.top,
SRCCOPY);
DeleteDC(memSrcDC);
}
ReleaseDC(hwndDlg, hdc);
}
return TRUE;
case WM_PAINT:
{
PAINTSTRUCT pt;
HDC hdc = BeginPaint(hwndDlg, &pt);
if (!banner->bmpBanner)
{
SetRect(&banner->rcBanner, 0,0,pt.rcPaint.right - pt.rcPaint.left, pt.rcPaint.bottom - pt.rcPaint.top);
banner->UpdateBunnerBmp();
}
if (banner->bmpBanner)
{
HDC memSrcDC = CreateCompatibleDC (hdc);
SelectObject(memSrcDC, banner->bmpBanner);
StretchBlt( hdc,
pt.rcPaint.left,
pt.rcPaint.top,
pt.rcPaint.right - pt.rcPaint.left,
pt.rcPaint.bottom - pt.rcPaint.top,
memSrcDC,
pt.rcPaint.left,
pt.rcPaint.top,
pt.rcPaint.right - pt.rcPaint.left,
pt.rcPaint.bottom - pt.rcPaint.top,
SRCCOPY);
DeleteDC(memSrcDC);
ValidateRect(hwndDlg, &pt.rcPaint);
}
EndPaint(hwndDlg, &pt);
}
break;
}
return CallWindowProc(banner->oldWndProc, hwndDlg, uMsg, wParam, lParam);
}