⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skin.cpp

📁 <VC++视频音频开发>一书的光盘资料。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************
 *                                                                                    *
 *                                                                                    *
 **************************************************************************************/


#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 + -