📄 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++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -