www.pudn.com > MyPlayerbylqh.rar > Skin.cpp
/**************************************************************************************
* *
* *
**************************************************************************************/
#include "Skin.h"
/*
* Constructor : 装载缺省的外壳
*
*/
Skin::Skin(HINSTANCE hInstance, HWND hwnd)
{
this->LoadDefault(hInstance, hwnd);
if(this->skin == NULL ||this->controls == NULL) {
MessageBox(NULL, "Cannot load default skin!", "Error", MB_OK);
}
this->menuButton.left = 2;
this->menuButton.right = 14;
this->menuButton.top = 3;
this->menuButton.bottom = 14;
this->minimizeButton.left = 266;
this->minimizeButton.right = 278;
this->minimizeButton.top = 3;
this->minimizeButton.bottom = 14;
this->closeButton.left = 283;
this->closeButton.right = 295;
this->closeButton.top = 3;
this->closeButton.bottom = 14;
this->rewindButton.left = 15;
this->rewindButton.right = 15+29;
this->rewindButton.top = 343;
this->rewindButton.bottom = 360;
this->stopButton.left = 52;
this->stopButton.right = 52+29;
this->stopButton.top = 343;
this->stopButton.bottom = 360;
this->playButton.left = 89;
this->playButton.right = 89+29;
this->playButton.top = 343;
this->playButton.bottom = 360;
this->pauseButton.left = 126;
this->pauseButton.right = 126+29;
this->pauseButton.top = 343;
this->pauseButton.bottom = 360;
this->forwardButton.left = 263;
this->forwardButton.right = 300;
this->forwardButton.top = 343;
this->forwardButton.bottom = 360;
this->loadButton.left = 236;
this->loadButton.right = 263+44;
this->loadButton.top = 343;
this->loadButton.bottom = 360;
this->progressBar.left = 12;
this->progressBar.right = 281;
this->progressBar.top = 325;
this->progressBar.bottom = 332;
this->volumeBar.left = 212;
this->volumeBar.right = 273;
this->volumeBar.top = 296;
this->volumeBar.bottom = 304;
this->progressCursor.left = 15;
this->progressCursor.right = 43;
this->progressCursor.top = 321;
this->progressCursor.bottom = 336;
this->volumeCursor.left = 250;
this->volumeCursor.right = 270;
this->volumeCursor.top = 293;
this->volumeCursor.bottom = 307;
this->volume = 100;
this->progress = 0.0;
this->compactMode = 0;
}
Skin::~Skin()
{
DeleteObject((HGDIOBJ) this->skin);
DeleteObject((HGDIOBJ) this->controls);
DeleteObject((HGDIOBJ) this->bottom);
DeleteObject((HGDIOBJ) this->logo);
}
BOOL Skin::isInsideRect(int x, int y, RECT rect)
{
return (x > rect.left && x < rect.right && y > rect.top && y < rect.bottom);
}
int Skin::LoadDefault(HINSTANCE hInstance, HWND hwnd) {
HDC dc, sdc, ddc;
DWORD i;
this->skin = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_SKIN));
this->controls = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_CONTROLS));
this->logo = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_LOGO));
dc = GetDC(hwnd);
this->bottom = CreateCompatibleBitmap(dc, 256, 115);
sdc = CreateCompatibleDC(dc);
SelectObject(sdc, this->skin);
ddc = CreateCompatibleDC(dc);
SelectObject(ddc, this->bottom);
for(i=0; i < 256; i++) {
BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
}
ReleaseDC(hwnd, dc);
DeleteDC(sdc);
DeleteDC(ddc);
this->skinColor = 0;
return 1;
}
int Skin::Load(char *directory, HWND hwnd) {
HDC dc, sdc, ddc;
DWORD i;
if(directory != NULL) {
char *mainc, *logoc, *controlsc;
mainc = (char *) new char[strlen(directory) + 10];
strcpy(mainc, directory);
logoc = (char *) new char[strlen(directory) + 10];
strcpy(logoc, directory);
controlsc = (char *) new char[strlen(directory) + 20];
strcpy(controlsc, directory);
if(this->skin)
DeleteObject((HGDIOBJ) this->skin);
if(this->controls)
DeleteObject((HGDIOBJ) this->controls);
if(this->logo)
DeleteObject((HGDIOBJ) this->logo);
this->skin = (HBITMAP) LoadImage(NULL, strcat(mainc, "\\main.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
this->logo = (HBITMAP) LoadImage(NULL, strcat(logoc, "\\logo.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
this->controls = (HBITMAP) LoadImage(NULL, strcat(controlsc, "\\controls.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
free(mainc);
free(logoc);
free(controlsc);
if(this->skin == 0 || this->logo == 0 || this->controls == 0) {
this->LoadDefault(GetModuleHandle(NULL), hwnd);
}
else {
dc = GetDC(hwnd);
sdc = CreateCompatibleDC(dc);
SelectObject(sdc, this->skin);
ddc = CreateCompatibleDC(dc);
SelectObject(ddc, this->bottom);
for(i=0; i < 256; i++) {
BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
}
ReleaseDC(hwnd, dc);
DeleteDC(sdc);
DeleteDC(ddc);
SkinFile *skinFile = new SkinFile(directory);
this->skinColor = skinFile->getColor("background");
skinFile->Close();
}
}
return 1;
}
int Skin::GetDefaultWidth()
{
return DEFAULT_SKIN_WIDTH;
}
int Skin::GetDefaultHeight()
{
return DEFAULT_SKIN_HEIGHT;
}
int Skin::SetVolume(HWND hwnd, int new_volume)
{
int sizeX, sizeY;
RECT clientRect;
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
this->volume = new_volume;
this->volumeCursor.left = 215 + (sizeX - DEFAULT_SKIN_WIDTH) + 35*this->volume/100;
this->volumeCursor.right = 235 + (sizeX - DEFAULT_SKIN_WIDTH) + 35*this->volume/100;
this->volumeCursor.top = 293 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->volumeCursor.bottom = 307 + (sizeY - DEFAULT_SKIN_HEIGHT);
return 1;
}
int Skin::SetProgress(HWND hwnd, double new_progress)
{
int sizeX, sizeY;
RECT clientRect;
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
this->progress = new_progress;
this->progressCursor.left = 15 + (int)((double)(sizeX - DEFAULT_SKIN_WIDTH + 263 - 28)*this->progress)/100;
this->progressCursor.right = 43 + (int)((double)(sizeX - DEFAULT_SKIN_WIDTH + 263 - 28)*this->progress)/100;
this->progressCursor.top = 321 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->progressCursor.bottom = 336 + (sizeY - DEFAULT_SKIN_HEIGHT);
return 1;
}
int Skin::SetVolumeCursorX(HWND hwnd, int x)
{
int the_volume;
int sizeX, sizeY;
RECT clientRect;
HDC hdc, bdc;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
if(hdc == NULL || bdc == NULL) {
return 0;
}
SelectObject(bdc, this->skin);
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
if(x < volumeBar.left)
the_volume = 0;
else {
if(x > volumeBar.right)
the_volume = 100;
else {
the_volume = (x - volumeBar.left)*100/(volumeBar.right - volumeBar.left);
}
}
SetVolume(hwnd, the_volume);
BitBlt(hdc, volumeBar.left, volumeBar.top - 5, (volumeBar.right - volumeBar.left), (volumeBar.bottom - volumeBar.top) + 10,
bdc, 212, 291, SRCCOPY);
SelectObject(bdc, this->controls);
BitBlt(hdc, volumeCursor.left, volumeCursor.top, (volumeCursor.right - volumeCursor.left), (volumeCursor.bottom - volumeCursor.top),
bdc, 32, 45, SRCCOPY);
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
return 1;
}
int Skin::SetProgressCursorX(HWND hwnd, int x)
{
int the_progress;
int sizeX, sizeY, i;
RECT clientRect;
HDC hdc, bdc;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
if(hdc == NULL || bdc == NULL) {
return 0;
}
SelectObject(bdc, this->skin);
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
if(x < progressBar.left)
the_progress = 0;
else {
if(x > progressBar.right)
the_progress = 100;
else {
the_progress = (x - progressBar.left)*100/(progressBar.right - progressBar.left);
}
}
SetProgress(hwnd, the_progress);
BitBlt(hdc, 0, 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 20, bdc, 0, 320, SRCCOPY);
for(i=0; i < (sizeX - DEFAULT_SKIN_WIDTH); i++) {
BitBlt(hdc, 200 + i, 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 1, 20, bdc, 200, 320, SRCCOPY);
}
BitBlt(hdc, 200 + (sizeX - DEFAULT_SKIN_WIDTH), 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 100, 20, bdc, 200, 320, SRCCOPY);
SelectObject(bdc, this->controls);
BitBlt(hdc, progressCursor.left, progressCursor.top, (progressCursor.right - progressCursor.left), (progressCursor.bottom - progressCursor.top),
bdc, 2, 45, SRCCOPY);
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
return 1;
}
int Skin::SetProgressValue(HWND hwnd, double progress)
{
int sizeX, sizeY;
RECT clientRect;
HDC hdc, bdc;
if(progress != this->progress) {
hdc = GetDC(this->hwnd);
bdc = CreateCompatibleDC(hdc);
if(hdc == NULL) {
return 0;
}
SelectObject(bdc, this->skin);
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
BitBlt(hdc, progressCursor.left, progressCursor.top,
(progressCursor.right - progressCursor.left),
(progressCursor.bottom - progressCursor.top),
bdc, 200, 321, SRCCOPY);
SetProgress(hwnd, progress);
SelectObject(bdc, this->controls);
BitBlt(hdc, progressCursor.left, progressCursor.top,
(progressCursor.right - progressCursor.left),
(progressCursor.bottom - progressCursor.top),
bdc, 2, 45, SRCCOPY);
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
}
return 1;
}
RECT *Skin::GetVideoRect()
{
if(this->hwnd) {
GetClientRect(this->hwnd, &this->videoRect);
if(this->compactMode) {
return &this->videoRect;
}
else {
this->videoRect.left = 7;
this->videoRect.right -= 15;
this->videoRect.top = 22;
this->videoRect.bottom -= 115;
return &this->videoRect;
}
}
return &this->videoRect;
}
int Skin::SetCompact(int compact)
{
this->compactMode = compact;
return 0;
}
int Skin::GetProgress()
{
return (int) this->progress;
}
int Skin::GetVolume()
{
return this->volume;
}
Skin::Display(HWND hwnd, MediaPlayback *playback)
{
HDC hdc, bdc;
PAINTSTRUCT ps;
int sizeX, sizeY, i;
RECT clientRect;
HBRUSH brush, oldBrush;
/*
* 得到窗口的大小等信息
*/
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
this->hwnd = hwnd;
if(!playback->IsInFullscreen() || playback->desktopMode) {
hdc = BeginPaint(hwnd, &ps);
if(this->compactMode) {
/*
* 简单显示logo
*/
bdc = CreateCompatibleDC(hdc);
SelectObject(bdc, this->logo);
if(playback->IsOverlay()) {
brush = CreateSolidBrush(DD_OVERLAY_COLORREF);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 0, 0, sizeX, sizeY);
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
}
else {
if(!playback->IsPlaying()) {
brush = CreateSolidBrush(this->skinColor);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 0, 0, DEFAULT_SKIN_WIDTH + (sizeX - DEFAULT_SKIN_WIDTH),
DEFAULT_SKIN_HEIGHT + (sizeY - DEFAULT_SKIN_HEIGHT));
SelectObject(bdc, this->logo);
if(sizeY > LOGO_HEIGHT)
BitBlt(hdc, (sizeX - LOGO_WIDTH)/2, (sizeY - LOGO_HEIGHT)/2, LOGO_WIDTH, LOGO_HEIGHT, bdc, 0, 0, SRCCOPY);
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
}
}
DeleteDC(bdc);
}
else {
/*
* 绘制标准外壳
*/
bdc = CreateCompatibleDC(hdc);
SelectObject(bdc, this->skin);
if(hdc == NULL || bdc == NULL) {
return 0;
}
/*
* 首先复制背景
*/
/*
* 标题
*/
BitBlt(hdc, 0, 0, 21, 22, bdc, 0, 0, SRCCOPY);
for(i = 0; i < (sizeX - DEFAULT_SKIN_WIDTH) / 2; i++) {
BitBlt(hdc, 21 + i, 0, 1, 22, bdc, 21, 0, SRCCOPY);
}
BitBlt(hdc, 21 + (sizeX - DEFAULT_SKIN_WIDTH) / 2, 0, 240, 22, bdc, 21, 0, SRCCOPY);
for(i = 0; i < (sizeX - DEFAULT_SKIN_WIDTH) / 2 + ((sizeX - DEFAULT_SKIN_WIDTH) % 2); i++) {
BitBlt(hdc, 261 + (sizeX - DEFAULT_SKIN_WIDTH) / 2 + i, 0, 1, 22, bdc, 261, 0, SRCCOPY);
}
BitBlt(hdc, 261 + (sizeX - DEFAULT_SKIN_WIDTH), 0, 39, 22, bdc, 261, 0, SRCCOPY);
/*
* 播放面积
*
*/
for(i=0; i < 238 + (sizeY - DEFAULT_SKIN_HEIGHT); i++) {
BitBlt(hdc, 0, 22 + i, 7, 1, bdc, 0, 22, SRCCOPY);
BitBlt(hdc, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 22 + i, 8, 1, bdc, 292, 22, SRCCOPY);
}
/*
* 底
*/
BitBlt(hdc, 0, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 115, bdc, 0, 260, SRCCOPY);
BitBlt(hdc, 200 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 100, 115, bdc, 200, 260, SRCCOPY);
SelectObject(bdc, this->bottom);
if(sizeX - DEFAULT_SKIN_WIDTH > 0) {
int pass = (sizeX - DEFAULT_SKIN_WIDTH) / 256;
for(i=0; i < pass; i++) {
BitBlt(hdc, 200 + i*256, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 256, 115, bdc, 0, 0, SRCCOPY);
}
BitBlt(hdc, 200 + pass*256, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), (sizeX - DEFAULT_SKIN_WIDTH) - pass*256, 115, bdc, 0, 0, SRCCOPY);
}
/*
* 某些信息
*/
if(playback->HasVideo() && !this->compactMode) {
HFONT font, oldFont;
DWORD time, total;
char buffer[24];
DWORD h, m, s, ht, mt, st;
char *file;
font = CreateFont(13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
oldFont = (HFONT) SelectObject(hdc, (HGDIOBJ) font);
SetBkMode(hdc, TRANSPARENT);
if(strrchr(playback->GetFilename(), '\\') != NULL) {
file = strrchr(playback->GetFilename(), '\\')+1;
}
else {
file = playback->GetFilename();
}
TextOut(hdc, 20, 282 + (sizeY - DEFAULT_SKIN_HEIGHT), file, strlen(file));
time = playback->GetActualTime();
total = playback->GetTotalTime();
h = time / 3600;
m = (time - h*3600) / 60;
s = (time - h*3600 - m*60);
ht = total / 3600;
mt = (total - ht*3600) / 60;
st = (total - ht*3600 - mt*60);
sprintf(buffer, "%.2d:%.2d:%.2d / %.2d:%.2d:%.2d", h, m, s, ht, mt, st);
TextOut(hdc, 20, 296 + (sizeY - DEFAULT_SKIN_HEIGHT), buffer, strlen(buffer));
SelectObject(hdc, (HGDIOBJ) oldFont);
DeleteObject((HGDIOBJ)font);
}
/*
* 控件
*
*/
SelectObject(bdc, this->controls);
BitBlt(hdc, progressCursor.left, progressCursor.top, (progressCursor.right - progressCursor.left), (progressCursor.bottom - progressCursor.top),
bdc, 2, 45, SRCCOPY);
BitBlt(hdc, volumeCursor.left, volumeCursor.top, (volumeCursor.right - volumeCursor.left), (volumeCursor.bottom - volumeCursor.top),
bdc, 32, 45, SRCCOPY);
/*
* 时间信息
*/
if(!playback->desktopMode) {
if(!playback->IsPlaying() && !playback->IsPaused()) {
brush = CreateSolidBrush(this->skinColor);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT));
SelectObject(bdc, this->logo);
if(sizeY > LOGO_HEIGHT + 135 + 22)
BitBlt(hdc, (sizeX - LOGO_WIDTH)/2, 50 + (sizeY - DEFAULT_SKIN_HEIGHT)/2, LOGO_WIDTH, LOGO_HEIGHT, bdc, 0, 0, SRCCOPY);
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
}
else {
if(playback->IsOverlay()) {
brush = CreateSolidBrush(DD_OVERLAY_COLORREF);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT));
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
}
}
if(playback->IsPaused()) {
if(playback->IsOverlay()) {
brush = CreateSolidBrush(DD_OVERLAY_COLORREF);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT));
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
}
else {
brush = CreateSolidBrush(0);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT));
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
}
}
}
DeleteDC(bdc);
}
EndPaint(hwnd, &ps);
}
else {
if(playback->IsOverlay() && playback->HasVideo()) {
RECT *fullRects;
fullRects = playback->videoRenderer->GetFullscreenRects();
if(fullRects != NULL) {
GetClientRect(hwnd, &clientRect);
hdc = BeginPaint(hwnd, &ps);
brush = CreateSolidBrush(0);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, fullRects[0].left, fullRects[0].top, fullRects[0].left + fullRects[0].right + 50, fullRects[0].top + fullRects[0].bottom);
Rectangle(hdc, fullRects[2].left, fullRects[2].top, fullRects[2].left + fullRects[2].right + 50, fullRects[2].top + fullRects[2].bottom + 50);
DeleteObject((HGDIOBJ) brush);
brush = CreateSolidBrush(DD_OVERLAY_COLORREF_FULLSCREEN);
(HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, fullRects[1].left, fullRects[1].top, fullRects[1].left + fullRects[1].right + 50, fullRects[1].top + fullRects[1].bottom);
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
EndPaint(hwnd, &ps);
}
}
else {
if(playback->HasVideo()) {
hdc = BeginPaint(hwnd, &ps);
brush = CreateSolidBrush(0);
oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, 0, 0, sizeX, sizeY);
SelectObject(hdc, oldBrush);
DeleteObject((HGDIOBJ) brush);
EndPaint(hwnd, &ps);
}
}
}
return 1;
}
/*
* 显示FPS
*
*/
int Skin::DisplayFps(HWND hwnd, MediaPlayback *playback)
{
HDC hdc, bdc;
int sizeX, sizeY;
RECT clientRect;
if(playback) {
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
SelectObject(bdc, this->skin);
BitBlt(hdc, 0, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 40, bdc, 0, 260, SRCCOPY);
char msg[10];
sprintf(msg, "%3.f FPS", playback->GetCurrentFps());
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 15, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), msg, 7);
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
}
return 1;
}
int Skin::DrawTime(HWND hwnd, MediaPlayback *playback) {
HDC hdc, bdc, ddc;
int sizeX, sizeY;
RECT clientRect;
HFONT font, oldFont;
HBITMAP buff;
if(hwnd) {
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
ddc = CreateCompatibleDC(hdc);
buff = CreateCompatibleBitmap(hdc, 106, 28);
SelectObject(bdc, this->skin);
SelectObject(ddc, buff);
BitBlt(ddc, 0, 0, 106, 28, bdc, 17, 280, SRCCOPY);
HFONT font, oldFont;
DWORD time, total;
char buffer[24];
DWORD h, m, s, ht, mt, st;
char *file;
if(strrchr(playback->GetFilename(), '\\') != NULL) {
file = strrchr(playback->GetFilename(), '\\')+1;
}
else {
file = playback->GetFilename();
}
font = CreateFont(13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
oldFont = (HFONT) SelectObject(ddc, (HGDIOBJ) font);
SetBkMode(ddc, TRANSPARENT);
TextOut(ddc, 3, 2, file, strlen(file));
time = playback->GetActualTime();
total = playback->GetTotalTime();
h = time / 3600;
m = (time - h*3600) / 60;
s = (time - h*3600 - m*60);
ht = total / 3600;
mt = (total - ht*3600) / 60;
st = (total - ht*3600 - mt*60);
sprintf(buffer, "%.2d:%.2d:%.2d / %.2d:%.2d:%.2d", h, m, s, ht, mt, st);
TextOut(ddc, 3, 16, buffer, strlen(buffer));
SelectObject(ddc, (HGDIOBJ) oldFont);
DeleteObject((HGDIOBJ)font);
BitBlt(hdc, 17, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), 106, 28, ddc, 0, 0, SRCCOPY);
DeleteObject((HGDIOBJ) buff);
DeleteDC(bdc);
DeleteDC(ddc);
ReleaseDC(hwnd, hdc);
}
return 0;
}
int Skin::DrawBufferingState(HWND hwnd, DWORD state)
{
HDC hdc, bdc;
int sizeX, sizeY;
RECT clientRect;
HFONT font, oldFont;
if(hwnd && state > 0) {
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
SelectObject(bdc, this->skin);
BitBlt(hdc, 17, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), 106, 28, bdc, 17, 280, SRCCOPY);
font = CreateFont(12, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
oldFont = (HFONT) SelectObject(hdc, (HGDIOBJ) font);
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 20, 282 + (sizeY - DEFAULT_SKIN_HEIGHT), "Buffering...", 12);
SelectObject(hdc, (HGDIOBJ) oldFont);
DeleteObject((HGDIOBJ)font);
MoveToEx(hdc, 20, 295 + (sizeY - DEFAULT_SKIN_HEIGHT), NULL);
LineTo(hdc, 120, 295 + (sizeY - DEFAULT_SKIN_HEIGHT));
LineTo(hdc, 120, 305 + (sizeY - DEFAULT_SKIN_HEIGHT));
LineTo(hdc, 20, 305 + (sizeY - DEFAULT_SKIN_HEIGHT));
LineTo(hdc, 20, 295 + (sizeY - DEFAULT_SKIN_HEIGHT));
Rectangle(hdc, 20, 295 + (sizeY - DEFAULT_SKIN_HEIGHT), 20 + state, 305 + (sizeY - DEFAULT_SKIN_HEIGHT));
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
}
return 1;
}
int Skin::UpdateSize(HWND hwnd)
{
int sizeX, sizeY;
RECT clientRect;
GetClientRect(hwnd, &clientRect);
sizeX = clientRect.right - clientRect.left;
sizeY = clientRect.bottom - clientRect.top;
this->menuButton.left = 2;
this->menuButton.right = 14;
this->menuButton.top = 3;
this->menuButton.bottom = 14;
this->minimizeButton.left = 266 + (sizeX - DEFAULT_SKIN_WIDTH);
this->minimizeButton.right = 278 + (sizeX - DEFAULT_SKIN_WIDTH);
this->minimizeButton.top = 3;
this->minimizeButton.bottom = 14;
this->closeButton.left = 283 + (sizeX - DEFAULT_SKIN_WIDTH);
this->closeButton.right = 295 + (sizeX - DEFAULT_SKIN_WIDTH);
this->closeButton.top = 3;
this->closeButton.bottom = 14;
this->rewindButton.left = 15;
this->rewindButton.right = 15+29;
this->rewindButton.top = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->rewindButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->stopButton.left = 52;
this->stopButton.right = 52+29;
this->stopButton.top = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->stopButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->playButton.left = 89;
this->playButton.right = 89+29;
this->playButton.top = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->playButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->pauseButton.left = 126;
this->pauseButton.right = 126+29;
this->pauseButton.top = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->pauseButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->forwardButton.left = 163;
this->forwardButton.right = 192;
this->forwardButton.top = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->forwardButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->loadButton.left = 236 + (sizeX - DEFAULT_SKIN_WIDTH);
this->loadButton.right = 236 + 44 + (sizeX - DEFAULT_SKIN_WIDTH);
this->loadButton.top = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->loadButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->resizeButton.left = 282 + (sizeX - DEFAULT_SKIN_WIDTH);
this->resizeButton.right = 282 + 15 + (sizeX - DEFAULT_SKIN_WIDTH);
this->resizeButton.top = 357 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->resizeButton.bottom = 357 + 15 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->progressBar.left = 12;
this->progressBar.right = 281 + (sizeX - DEFAULT_SKIN_WIDTH);
this->progressBar.top = 325 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->progressBar.bottom = 332 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->volumeBar.left = 212 + (sizeX - DEFAULT_SKIN_WIDTH);
this->volumeBar.right = 273 + (sizeX - DEFAULT_SKIN_WIDTH);
this->volumeBar.top = 296 + (sizeY - DEFAULT_SKIN_HEIGHT);
this->volumeBar.bottom = 304 + (sizeY - DEFAULT_SKIN_HEIGHT);
SetVolume(hwnd, this->volume);
SetProgress(hwnd, this->progress);
return 1;
}
int Skin::SetActionStart(HWND hwnd, int action)
{
HDC hdc, bdc;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
if(hdc == NULL || bdc == NULL) {
return 0;
}
SelectObject(bdc, this->controls);
switch(action) {
case ACTION_REWIND:
BitBlt(hdc, rewindButton.left, rewindButton.top, (rewindButton.right - rewindButton.left), (rewindButton.bottom - rewindButton.top),
bdc, 2, 26, SRCCOPY);
break;
case ACTION_STOP:
BitBlt(hdc, stopButton.left, stopButton.top, (stopButton.right - stopButton.left), (stopButton.bottom - stopButton.top),
bdc, 33, 26, SRCCOPY);
break;
case ACTION_PLAY:
BitBlt(hdc, playButton.left, playButton.top, (playButton.right - playButton.left), (playButton.bottom - playButton.top),
bdc, 64, 26, SRCCOPY);
break;
case ACTION_PAUSE:
BitBlt(hdc, pauseButton.left, pauseButton.top, (pauseButton.right - pauseButton.left), (pauseButton.bottom - pauseButton.top),
bdc, 95, 26, SRCCOPY);
break;
case ACTION_FORWARD:
BitBlt(hdc, forwardButton.left, forwardButton.top, (forwardButton.right - forwardButton.left), (forwardButton.bottom - forwardButton.top),
bdc, 126, 26, SRCCOPY);
break;
case ACTION_LOAD:
BitBlt(hdc, loadButton.left, loadButton.top, (loadButton.right - loadButton.left), (loadButton.bottom - loadButton.top),
bdc, 157, 26, SRCCOPY);
break;
default:
break;
}
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
return 1;
}
int Skin::SetActionEnd(HWND hwnd, int action)
{
HDC hdc, bdc;
hdc = GetDC(hwnd);
bdc = CreateCompatibleDC(hdc);
if(hdc == NULL || bdc == NULL) {
return 0;
}
SelectObject(bdc, this->skin);
switch(action) {
case ACTION_REWIND:
BitBlt(hdc, rewindButton.left, rewindButton.top, (rewindButton.right - rewindButton.left), (rewindButton.bottom - rewindButton.top),
bdc, 15, 343, SRCCOPY);
break;
case ACTION_STOP:
BitBlt(hdc, stopButton.left, stopButton.top, (stopButton.right - stopButton.left), (stopButton.bottom - stopButton.top),
bdc, 52, 343, SRCCOPY);
break;
case ACTION_PLAY:
BitBlt(hdc, playButton.left, playButton.top, (playButton.right - playButton.left), (playButton.bottom - playButton.top),
bdc, 89, 343, SRCCOPY);
break;
case ACTION_PAUSE:
BitBlt(hdc, pauseButton.left, pauseButton.top, (pauseButton.right - pauseButton.left), (pauseButton.bottom - pauseButton.top),
bdc, 126, 343, SRCCOPY);
break;
case ACTION_FORWARD:
BitBlt(hdc, forwardButton.left, forwardButton.top, (forwardButton.right - forwardButton.left), (forwardButton.bottom - forwardButton.top),
bdc, 163, 343, SRCCOPY);
break;
case ACTION_LOAD:
BitBlt(hdc, loadButton.left, loadButton.top, (loadButton.right - loadButton.left), (loadButton.bottom - loadButton.top),
bdc, 236, 343, SRCCOPY);
break;
default:
break;
}
DeleteDC(bdc);
ReleaseDC(hwnd, hdc);
return 1;
}
int Skin::GetAction(int x, int y)
{
if(isInsideRect(x, y, this->menuButton))
return ACTION_MENU;
if(isInsideRect(x, y, this->minimizeButton))
return ACTION_MINIMIZE;
if(isInsideRect(x, y, this->closeButton))
return ACTION_CLOSE;
if(isInsideRect(x, y, this->rewindButton))
return ACTION_REWIND;
if(isInsideRect(x, y, this->stopButton))
return ACTION_STOP;
if(isInsideRect(x, y, this->playButton))
return ACTION_PLAY;
if(isInsideRect(x, y, this->pauseButton))
return ACTION_PAUSE;
if(isInsideRect(x, y, this->forwardButton))
return ACTION_FORWARD;
if(isInsideRect(x, y, this->loadButton))
return ACTION_LOAD;
if(isInsideRect(x, y, this->resizeButton))
return ACTION_RESIZE;
if(isInsideRect(x, y, this->volumeCursor))
return ACTION_VOLUME_CURSOR;
if(isInsideRect(x, y, this->progressCursor))
return ACTION_PROGRESS_CURSOR;
if(isInsideRect(x, y, this->volumeBar))
return ACTION_VOLUME_BAR;
if(isInsideRect(x, y, this->progressBar))
return ACTION_PROGRESS_BAR;
return ACTION_NONE;
}