diff options
Diffstat (limited to 'Src/Plugins/Input/in_mp3/about.cpp')
-rw-r--r-- | Src/Plugins/Input/in_mp3/about.cpp | 576 |
1 files changed, 576 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mp3/about.cpp b/Src/Plugins/Input/in_mp3/about.cpp new file mode 100644 index 00000000..7bc3ae04 --- /dev/null +++ b/Src/Plugins/Input/in_mp3/about.cpp @@ -0,0 +1,576 @@ +#include <windows.h> +#include "main.h" +#if 1 +BOOL CALLBACK AboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) +{ + if (uMsg == WM_COMMAND && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)) EndDialog(hwndDlg,0); + return 0; +} + +#else +#include <commctrl.h> + +#include ".\graphics\image.h" +#include ".\graphics\imagefilters.h" +#include <strsafe.h> + + + +#define random( min, max ) (( rand() % (int)((( max ) + 1 ) - ( min ))) + ( min )) + +HBITMAP LoadImageFromResource(INT_PTR handle); + +#define LEGAL_COUNT 4 +wchar_t *legal[] = {L"Copyright (C) 1998-2006 - Nullsoft, Inc.", + L"MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and THOMSON multimedia.", + L"VLB decoding copyright 1998-2002 by Dolby Laboratories, Inc. All rights reserved.", + L"AAC && aacPlus decoding copyright 1998-2006 by Coding Technologies, Inc. All rights reserved."}; + +HFONT fntPlugin, fntC, fntLegal; +HBRUSH brhDlgBG; + +#define IMAGES_COUNT 6 +#define IMAGES_INDEX_MY 0 +#define IMAGES_INDEX_WA 1 +#define IMAGES_INDEX_CT 2 +#define IMAGES_INDEX_IIS 3 +#define IMAGES_INDEX_ID3V2 4 +#define IMAGES_INDEX_MP3S 5 + +RECT rectLogo[IMAGES_COUNT]; +MLImage *imgLogo[IMAGES_COUNT] = {NULL, NULL, NULL, NULL, NULL, NULL}; +MLImage *imgLlama = NULL, *imgLlamaOrig = NULL, *imgMy = NULL; +RECT rcLlama; + +int idxSelected; + +wchar_t *url[IMAGES_COUNT - 1] = { L"http://winamp.com/", + L"http://www.codingtechnologies.com/index.htm", + L"http://www.iis.fraunhofer.de/index.html", + L"http://www.id3.org/", + L"http://www.iis.fraunhofer.de/amm/download/mp3surround/index.html"}; + +HWND hwndTT; +wchar_t strTT[] = L"click here to visit this website"; + +#define TIMER_ID_WATERRENDER 1980 +#define TIMER_ID_WATERPULSE 1978 +#define TIMER_DELAY_WATERRENDER 48 +#define TIMER_DELAY_WATERPULSE 12000 +#define TIMER_ID_LLAMAFADE 1987 +#define TIMER_DELAY_LLAMAFADE 200 + +#define TIMER_ID_LOADDATA 1959 +#define TIMER_DELAY_LOADDATA 10 +MLImage *tmpImage = NULL; + +MLImageFilterWater *fltrWater = NULL; +HCURSOR curHand = NULL; + +void about_OnInit(HWND hwndDlg); +void about_OnDestroy(HWND hwndDlg); +void about_OnMouseDown(HWND hwndDlg, int cx, int cy); +void about_OnMouseMove(HWND hwndDlg, int cx, int cy); +void about_OnDraw(HWND hwndDlg); +void timer_OnWaterPulse(HWND hwndDlg); +void timer_OnLlamaFade(HWND hwndDlg); +void timer_OnLoadData(HWND hwndDlg); + + +void SetRects(int cx, int cy) +{ + int i, xl, yl; + + i = IMAGES_INDEX_MY; xl = (cx - imgLogo[i]->GetWidth())/2; yl = 64; + if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight()); + xl = 2; yl = 2; i = IMAGES_INDEX_WA; + if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight()); + xl = 2; yl = cy - 88; i = IMAGES_INDEX_CT; + if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight()); + xl = rectLogo[i].right; i = IMAGES_INDEX_IIS; + if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight()); + xl = rectLogo[i].right; i = IMAGES_INDEX_ID3V2; + if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight()); + xl = rectLogo[i].right; i = IMAGES_INDEX_MP3S; + if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight()); + + if(imgLlama) SetRect(&rcLlama, 2, 1, imgLlama->GetWidth() + 2, imgLlama->GetHeight() + 1); +} +void CreateToolTipWnd(HWND hwndDlg) +{ + INITCOMMONCONTROLSEX iccex; + iccex.dwICC = ICC_WIN95_CLASSES; + iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCommonControlsEx(&iccex); + + hwndTT = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndDlg, NULL, mod.hDllInstance, NULL); + + SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); +} + +void UpdateToolTips(HWND hwndDlg) +{ + TOOLINFOW ti; + unsigned int uid = 0; + + // delete tools + int ttCount = SendMessage(hwndTT, TTM_GETTOOLCOUNT, 0, 0); + for(int i = 0; i < ttCount; i++) + { + if (SendMessageW(hwndTT, TTM_ENUMTOOLSW, (WPARAM)i, (LPARAM)&ti)) SendMessageW(hwndTT, TTM_DELTOOLW, 0, (LPARAM)&ti); + } + + /// add tools + + for (int i = 1; i < IMAGES_COUNT -1; i++) + { + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hwndDlg; + ti.hinst = mod.hDllInstance; + ti.uId = uid; + ti.lpszText = strTT; + ti.rect = rectLogo[i]; + SendMessageW(hwndTT, TTM_ADDTOOLW, 0, (LPARAM) (LPTOOLINFO) &ti); + } +} +BOOL CALLBACK AboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + about_OnInit(hwndDlg); + break; + case WM_DESTROY: + about_OnDestroy(hwndDlg); + break; + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hwndDlg,0); + } + break; + case WM_SIZE: + if (wParam != SIZE_MINIMIZED) + { + SetRects(LOWORD(lParam), HIWORD(lParam)); + UpdateToolTips(hwndDlg); + } + case WM_MOUSEMOVE: + about_OnMouseMove(hwndDlg, LOWORD(lParam), HIWORD(lParam)); + break; + case WM_LBUTTONDOWN: + about_OnMouseDown(hwndDlg, LOWORD(lParam), HIWORD(lParam)); + break; + case WM_PAINT: + about_OnDraw(hwndDlg); + break; + case WM_TIMER: + switch(wParam) + { + case TIMER_ID_WATERRENDER: + if (idxSelected != -1 && fltrWater) + { + fltrWater->Render(tmpImage, imgLogo[idxSelected]); + InvalidateRect(hwndDlg, &rectLogo[idxSelected], FALSE); + } + break; + case TIMER_ID_WATERPULSE: + timer_OnWaterPulse(hwndDlg); + break; + case TIMER_ID_LLAMAFADE: + timer_OnLlamaFade(hwndDlg); + break; + case TIMER_ID_LOADDATA: + timer_OnLoadData(hwndDlg); + break; + } + break; + case WM_CTLCOLORDLG: + return (BOOL)brhDlgBG; + break; + } + return 0; +} +void about_OnInit(HWND hwndDlg) +{ + HDC hdc = GetDC(hwndDlg); + fntPlugin = CreateFontW(-MulDiv(20, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Microsoft Sans Serif"); + fntC = CreateFontW(-MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, 0, 0, 0, TRUE, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, L"Arial"); + fntLegal = CreateFontW(-MulDiv(6, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, L"Microsoft Sans Serif"); + ReleaseDC(hwndDlg, hdc); + + brhDlgBG = CreateSolidBrush(RGB(255,255,255)); + + SetTimer(hwndDlg, TIMER_ID_LOADDATA, TIMER_DELAY_LOADDATA, NULL); +} + +void about_OnDestroy(HWND hwndDlg) +{ + for (int i = 0; i < IMAGES_COUNT; i++) + { + if (imgLogo[i]) delete(imgLogo[i]); + imgLogo[i] = NULL; + } + + if (imgLlama) delete(imgLlama); + imgLlama = NULL; + + if (imgLlamaOrig) delete(imgLlamaOrig); + imgLlamaOrig = NULL; + + if (imgMy) delete(imgMy); + imgMy = NULL; + + if (fntPlugin) DeleteObject(fntPlugin); + if (fntC) DeleteObject(fntC); + if (fntLegal) DeleteObject(fntLegal); + fntPlugin = NULL; + fntC = NULL; + fntLegal = NULL; + + if (brhDlgBG) DeleteObject(brhDlgBG); + brhDlgBG = NULL; + + if (fltrWater) delete (fltrWater); + fltrWater = NULL; + + if (tmpImage) delete(tmpImage); + tmpImage = NULL; + + if (curHand) DestroyCursor(curHand); + curHand = NULL; +} + +void about_OnMouseDown(HWND hwndDlg, int cx, int cy) +{ + + if (idxSelected == -1) return; + + HCURSOR curWait = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(32514/*OCR_WAIT*/), IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR); + SetCursor(curWait); + ShellExecuteW(hwndDlg, L"open", url[idxSelected -1], NULL, L"c:\\", SW_SHOW); + SetCursor(curHand); + DestroyCursor(curWait); +} +void about_OnMouseMove(HWND hwndDlg, int cx, int cy) +{ + POINT pt = {cx, cy}; + int idxNew = -1; + for (int i = 1; i < IMAGES_COUNT - 1; i ++) + { + if (PtInRect(&rectLogo[i], pt)) + { + if (!curHand) + { + curHand = (HCURSOR)LoadImage(mod.hDllInstance, MAKEINTRESOURCE(IDC_CUR_HAND), IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR); + } + SetCursor(curHand); + idxNew = i; + } + } + if (idxNew != idxSelected) + { + // stop animation + KillTimer(hwndDlg, TIMER_ID_WATERPULSE); + KillTimer(hwndDlg, TIMER_ID_WATERRENDER); + + if (idxSelected != -1) // redraw previously animated + { + InvalidateRect(hwndDlg, &rectLogo[idxSelected], FALSE); + } + // set new one + idxSelected = idxNew; + if (fltrWater) delete(fltrWater); + fltrWater = NULL; + if (tmpImage) delete(tmpImage); + tmpImage = NULL; + if (idxSelected != -1 && idxSelected != IMAGES_INDEX_WA) SetTimer(hwndDlg, TIMER_ID_WATERPULSE, 30, NULL); // start delay + } +} +void about_OnDraw(HWND hwndDlg) +{ + PAINTSTRUCT ps; + HDC hdc; + hdc = BeginPaint(hwndDlg, &ps); + RECT rc, ri; + GetClientRect(hwndDlg, &rc); + + // Draw Llama + RECT rl; + SetRect(&rl, rcLlama.left, rcLlama.top, rcLlama.right, rcLlama.bottom); + if (imgLlama && IntersectRect(&ri, &rl, &ps.rcPaint)) + { + HRGN hrgn = CreateRectRgn(rcLlama.left, rcLlama.top, rcLlama.right, rcLlama.bottom); + + HRGN hrgn1 = CreateRectRgn(rectLogo[IMAGES_INDEX_MY].left, + rectLogo[IMAGES_INDEX_MY].top, + rectLogo[IMAGES_INDEX_MY].right, + rectLogo[IMAGES_INDEX_MY].bottom); + CombineRgn(hrgn, hrgn, hrgn1, RGN_DIFF); + DeleteObject(hrgn1); + hrgn1 = CreateRectRgn(rectLogo[IMAGES_INDEX_WA].left, + rectLogo[IMAGES_INDEX_WA].top, + rectLogo[IMAGES_INDEX_WA].right, + rectLogo[IMAGES_INDEX_WA].bottom); + CombineRgn(hrgn, hrgn, hrgn1, RGN_DIFF); + SelectClipRgn(hdc, hrgn); + DeleteObject(hrgn); + DeleteObject(hrgn1); + + imgLlama->Draw(hdc, rl.left, rl.top); + SelectClipRgn(hdc, NULL); + } + + MLImage *img; + for (int i = 0; i < IMAGES_COUNT -1; i++) + { + + if (IntersectRect(&ri, &rectLogo[i], &ps.rcPaint)) + { + if (idxSelected == i && tmpImage) + { + img = tmpImage; + HRGN hrgn = CreateRectRgn(rectLogo[i].left + 3, rectLogo[i].top + 3 , rectLogo[i].right - 3, rectLogo[i].bottom - 3); + SelectClipRgn(hdc, hrgn); + DeleteObject(hrgn); + } + else img = imgLogo[i]; + if (img == NULL || imgLlama == NULL) continue; + if (i == IMAGES_INDEX_MY) + { // blend Llama First + MLImageFilter_Blend1(imgMy, img, 0, 0, + imgLlama->GetWidth() - (rectLogo[i].left - rcLlama.left), img->GetHeight(), imgLlama, + rectLogo[i].left - rcLlama.left, rectLogo[i].top - rcLlama.top, RGB(255,255,255)); + img = imgMy; + } + img->Draw(hdc, rectLogo[i].left, rectLogo[i].top); + SelectClipRgn(hdc, NULL); + } + } + + RECT rt; + SetBkMode(hdc, TRANSPARENT); + rc.left += 6; + rc.bottom -= 2; + rc.right -= 4; + + HFONT oldF = NULL; + + SetRect(&rt, rc.right - 192, rc.top, rc.right, rc.top + 16); + if (IntersectRect(&ri, &rt, &ps.rcPaint)) + { + /// Nullsoft (c) + HFONT oldF = (HFONT)SelectObject(hdc, fntC); + SetTextColor(hdc, RGB(100,100,200)); + DrawTextW(hdc, legal[0], -1, &rt, DT_LEFT | DT_SINGLELINE); + } + + SetRect(&rt, rc.left - 2, rc.bottom - 33, rc.right, rc.bottom); + if (IntersectRect(&ri, &rt, &ps.rcPaint)) + { + /// Separator + MoveToEx(hdc, rt.left, rt.top, NULL); + HPEN lp = CreatePen(PS_SOLID,1, RGB(190, 190, 190)); + HPEN op = (HPEN)SelectObject(hdc, lp); + LineTo(hdc, rt.right, rt.top); + SelectObject(hdc, lp); + DeleteObject(lp); + + /// Legal... + oldF = (oldF != NULL) ? oldF : (HFONT)SelectObject(hdc, fntLegal); + SetTextColor(hdc, RGB(0,0,0)); + for(int i = 1; i < LEGAL_COUNT; i++) + { + int y = rc.bottom - (LEGAL_COUNT - i)*10; + SetRect(&rt, rc.left, y, rc.right, y +10); + if (IntersectRect(&ri, &rt, &ps.rcPaint)) + DrawTextW(hdc, legal[i], -1, &rt, DT_LEFT | DT_SINGLELINE); + } + } + if (oldF != NULL) SelectObject(hdc, oldF); + EndPaint(hwndDlg, &ps); +} +void timer_OnLoadData(HWND hwndDlg) +{ + static step = 0; + KillTimer(hwndDlg, TIMER_ID_LOADDATA); + RECT rc; + GetClientRect(hwndDlg, &rc); + for (int i = 0; i < IMAGES_COUNT; i++) + { + imgLogo[i] = new MLImage(LoadImageFromResource, TRUE); + imgLogo[i]->Load(); + } + + imgMy = new MLImage(); + MLImage::Copy(imgMy, imgLogo[IMAGES_INDEX_MY]); + + imgLlamaOrig = new MLImage(LoadImageFromResource, TRUE); + imgLlamaOrig->Load(); + imgLlama = new MLImage(); + MLImage::Copy(imgLlama, imgLlamaOrig); + CreateToolTipWnd(hwndDlg); + UpdateToolTips(hwndDlg); + idxSelected = -1; + SetRects(rc.right - rc.left, rc.bottom - rc.top); + InvalidateRect(hwndDlg, &rc, FALSE); +// SetTimer(hwndDlg, TIMER_ID_LLAMAFADE, TIMER_DELAY_LLAMAFADE, NULL); + +} +void timer_OnWaterPulse(HWND hwndDlg) +{ + if (idxSelected == -1) return; + + BOOL startRender = (!fltrWater); + + if(!fltrWater) + { + KillTimer(hwndDlg, TIMER_ID_WATERPULSE); // stop timer - will change to slower interval + fltrWater = new MLImageFilterWater(); + fltrWater->CreateFor(imgLogo[idxSelected]); + tmpImage = new MLImage(imgLogo[idxSelected]->GetWidth(), imgLogo[idxSelected]->GetHeight()); + } + + int ow = imgLogo[idxSelected]->GetWidth(); + int oh = imgLogo[idxSelected]->GetHeight(); + + for (int i = 0; i < oh*ow/1024; i++) + { + fltrWater->SineBlob(-1, -1, random(4,min(oh,ow)), 600, 0); + } + + if (startRender) + { + SetTimer(hwndDlg, TIMER_ID_WATERRENDER, TIMER_DELAY_WATERRENDER, NULL); + SetTimer(hwndDlg, TIMER_ID_WATERPULSE, TIMER_DELAY_WATERPULSE, NULL); + } +} +void timer_OnLlamaFade(HWND hwndDlg) +{ + static int c = -2; + static int step = 2; + c = c + step; + if (c > 30 && step > 0) {step = 0 - step; c = 30;} + else if (c < 0 && step < 0) { step = 0 - step; c = 0; } + MLImageFilter_Fader3(imgLlama, imgLlamaOrig, c); + InvalidateRect(hwndDlg, &rcLlama, FALSE); +} + +HBITMAP LoadImageFromResource(INT_PTR handle) +{ + int id = 0; + BOOL incSize; + MLImage *img = (MLImage*)handle; + + if (img == imgLogo[IMAGES_INDEX_WA]) {id = IDB_LOGO_WAPLUGINS; incSize = FALSE;} + else if (img == imgLogo[IMAGES_INDEX_IIS]) {id = IDB_LOGO_IIS; incSize = TRUE;} + else if (img == imgLogo[IMAGES_INDEX_CT]) {id = IDB_LOGO_CODETECH; incSize = TRUE;} + else if (img == imgLogo[IMAGES_INDEX_ID3V2]) {id = IDB_LOGO_ID3V2; incSize = TRUE;} + else if (img == imgLogo[IMAGES_INDEX_MP3S]) {id = IDB_LOGO_MP3SURROUND; incSize = FALSE;} // because we don't use it for now + else if (img == imgLogo[IMAGES_INDEX_MY]) {id = IDB_LOGO_MY; incSize = FALSE;} + else if (img == imgLlamaOrig) {id = IDB_LLAMA; incSize = FALSE;} + if (id == 0) return NULL; + + HBITMAP hbmp = LoadBitmap(mod.hDllInstance, MAKEINTRESOURCE(id)); + if (hbmp == NULL) return hbmp; + + if (incSize) + {// we want to add additional white border + HDC hdcWnd = GetWindowDC(NULL); + HDC hdcSrc = CreateCompatibleDC(hdcWnd); + HDC hdcDest = CreateCompatibleDC(hdcWnd); + BITMAP bmp; + GetObject(hbmp, sizeof(BITMAP), &bmp); + int extraW = 40; + int extraH = 16; + HBITMAP hbmpNew = CreateBitmap(bmp.bmWidth + extraW, bmp.bmHeight + extraH, bmp.bmPlanes, bmp.bmBitsPixel, NULL); + + SelectObject(hdcSrc, hbmp); + SelectObject(hdcDest, hbmpNew); + + // fill borders + HBRUSH br = CreateSolidBrush(RGB(255,255,255)); + RECT rc; + SetRect(&rc, 0,0, bmp.bmWidth + extraW, extraH/2); + FillRect(hdcDest, &rc, br); + SetRect(&rc, 0, bmp.bmHeight + extraH/2, bmp.bmWidth + extraW, bmp.bmHeight + extraH); + FillRect(hdcDest, &rc, br); + SetRect(&rc, 0, extraH/2, extraW/2, bmp.bmHeight + extraH/2); + FillRect(hdcDest, &rc, br); + SetRect(&rc, bmp.bmWidth + extraW/2, extraH/2, bmp.bmWidth + extraW, bmp.bmHeight + extraH/2); + FillRect(hdcDest, &rc, br); + // copy original + BitBlt(hdcDest, extraW/2, extraH/2, bmp.bmWidth, bmp.bmHeight, hdcSrc, 0,0, SRCCOPY); + + DeleteObject(br); + DeleteObject(hbmp); + DeleteDC(hdcSrc); + DeleteDC(hdcDest); + ReleaseDC(NULL, hdcWnd); + + hbmp = hbmpNew; + } + if (img == imgLogo[IMAGES_INDEX_MY]) + { // need to add vesion number + HDC hdcWnd = GetWindowDC(NULL); + HDC hdcSrc = CreateCompatibleDC(hdcWnd); + HDC hdcDest = CreateCompatibleDC(hdcWnd); + + HFONT fnt = CreateFontW(-MulDiv(90, GetDeviceCaps(hdcDest, LOGPIXELSY), 72), 22, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, L"Agency FB"); + SelectObject(hdcDest, fnt); + + char *ver = mod.description + lstrlen(mod.description); + while(ver != mod.description && *ver != ' ') + { + ver = CharPrevA(mod.description, ver); + } + if (*ver == ' ') ver++; + + RECT rc; + SetRect(&rc, 0, 0, 0, 0); + DrawText(hdcDest, ver, -1, &rc, DT_CALCRECT | DT_RIGHT |DT_SINGLELINE); + + int extraW = rc.right + 6; + int extraH = 16; + + BITMAP bmp; + GetObject(hbmp, sizeof(BITMAP), &bmp); + HBITMAP hbmpNew = CreateBitmap(bmp.bmWidth + extraW, bmp.bmHeight + extraH, bmp.bmPlanes, bmp.bmBitsPixel, NULL); + + SelectObject(hdcSrc, hbmp); + SelectObject(hdcDest, hbmpNew); + + // fill new area + HBRUSH br = CreateSolidBrush(RGB(255,255,255)); + + SetRect(&rc, bmp.bmWidth,0, bmp.bmWidth + extraW, bmp.bmHeight + extraH); + FillRect(hdcDest, &rc, br); + SetRect(&rc, 0,0, bmp.bmWidth, extraH); + FillRect(hdcDest, &rc, br); + // copy original + BitBlt(hdcDest, 0, extraH, bmp.bmWidth, bmp.bmHeight, hdcSrc, 0,0, SRCCOPY); + // draw number + + SetTextColor(hdcDest, RGB(80, 60, 10)); + SetBkMode(hdcDest, TRANSPARENT); + SetRect(&rc, bmp.bmWidth + 6, rc.top -= 22, bmp.bmWidth + extraW, bmp.bmHeight + extraH); + DrawText(hdcDest, ver, -1, &rc, DT_RIGHT |DT_SINGLELINE); + DeleteObject(fnt); + DeleteObject(br); + DeleteObject(hbmp); + DeleteDC(hdcSrc); + DeleteDC(hdcDest); + ReleaseDC(NULL, hdcWnd); + + hbmp = hbmpNew; + + } + + + return hbmp; + +} + +#endif
\ No newline at end of file |