123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- #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);
- }
-
|