Skin.cpp
上传用户:lusi_8715
上传日期:2007-01-08
资源大小:199k
文件大小:23k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************************
  2.  *                                                                                    *
  3.  * This application contains code from OpenDivX and is released as a "Larger Work"    *
  4.  * under that license. Consistant with that license, this application is released     *
  5.  * under the GNU General Public License.                                              *
  6.  *                                                                                    *
  7.  * The OpenDivX license can be found at: http://www.projectmayo.com/opendivx/docs.php *
  8.  * The GPL can be found at: http://www.gnu.org/copyleft/gpl.html                      *
  9.  *                                                                                    *
  10.  * Copyright (c) 2001 - Project Mayo                                                  *
  11.  *                                                                                    *
  12.  * Authors: Damien Chavarria <adrc at projectmayo.com>                                *
  13.  *                                                                                    *
  14.  **************************************************************************************/
  15. #include "Skin.h"
  16. /*
  17.  * Class Functions
  18.  *
  19.  */
  20. /*
  21.  * Constructor : Loads the default skin
  22.  *
  23.  */
  24. Skin::Skin(HINSTANCE hInstance, HWND hwnd)
  25. {
  26. this->LoadDefault(hInstance, hwnd);
  27. if(this->skin == NULL ||this->controls == NULL) {
  28. MessageBox(NULL, "Cannot load default skin!", "Error", MB_OK);
  29. }
  30. /*
  31.    * Default values for the rects
  32.  */
  33. this->menuButton.left   = 2;
  34. this->menuButton.right  = 14;
  35. this->menuButton.top    = 3;
  36. this->menuButton.bottom = 14;
  37. this->minimizeButton.left   = 266;
  38. this->minimizeButton.right  = 278;
  39. this->minimizeButton.top    = 3;
  40. this->minimizeButton.bottom = 14;
  41. this->closeButton.left   = 283;
  42. this->closeButton.right  = 295;
  43. this->closeButton.top    = 3;
  44. this->closeButton.bottom = 14;
  45. this->rewindButton.left   = 15;
  46. this->rewindButton.right  = 15+29;
  47. this->rewindButton.top    = 343;
  48. this->rewindButton.bottom = 360;
  49. this->stopButton.left   = 52;
  50. this->stopButton.right  = 52+29;
  51. this->stopButton.top    = 343;
  52. this->stopButton.bottom = 360;
  53. this->playButton.left   = 89;
  54. this->playButton.right  = 89+29;
  55. this->playButton.top    = 343;
  56. this->playButton.bottom = 360;
  57. this->pauseButton.left   = 126;
  58. this->pauseButton.right  = 126+29;
  59. this->pauseButton.top    = 343;
  60. this->pauseButton.bottom = 360;
  61. this->forwardButton.left   = 263;
  62. this->forwardButton.right  = 300;
  63. this->forwardButton.top    = 343;
  64. this->forwardButton.bottom = 360;
  65. this->loadButton.left   = 236;
  66. this->loadButton.right  = 263+44;
  67. this->loadButton.top    = 343;
  68. this->loadButton.bottom = 360;
  69. this->progressBar.left   = 12;
  70. this->progressBar.right  = 281;
  71. this->progressBar.top    = 325;
  72. this->progressBar.bottom = 332;
  73. this->volumeBar.left   = 212;
  74. this->volumeBar.right  = 273;
  75. this->volumeBar.top    = 296;
  76. this->volumeBar.bottom = 304;
  77. this->progressCursor.left   = 15;
  78. this->progressCursor.right  = 43;
  79. this->progressCursor.top    = 321;
  80. this->progressCursor.bottom = 336;
  81. this->volumeCursor.left   = 250;
  82. this->volumeCursor.right  = 270;
  83. this->volumeCursor.top    = 293;
  84. this->volumeCursor.bottom = 307;
  85. this->volume   = 100;
  86. this->progress = 0.0;
  87. }
  88. /*
  89.  * Destructor
  90.  *
  91.  */
  92. Skin::~Skin()
  93. {
  94. DeleteObject((HGDIOBJ) this->skin); 
  95. DeleteObject((HGDIOBJ) this->controls); 
  96. DeleteObject((HGDIOBJ) this->bottom); 
  97. DeleteObject((HGDIOBJ) this->logo); 
  98. }
  99. /*
  100.  * Returns TRUE if the point is
  101.  * inside the given rect...
  102.  *
  103.  */
  104. BOOL Skin::isInsideRect(int x, int y, RECT rect)
  105. {
  106. return (x > rect.left && x < rect.right && y > rect.top && y < rect.bottom);
  107. }
  108. /*
  109.  * loads the Default Skin
  110.  *
  111.  */
  112. int Skin::LoadDefault(HINSTANCE hInstance, HWND hwnd) {
  113. HDC   dc, sdc, ddc;
  114. DWORD i;
  115. this->skin     = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_SKIN)); 
  116. this->controls = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_CONTROLS));
  117. this->logo     = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_LOGO));
  118. dc = GetDC(hwnd);
  119. this->bottom = CreateCompatibleBitmap(dc, 256, 115);
  120. sdc = CreateCompatibleDC(dc);
  121. SelectObject(sdc, this->skin);
  122. ddc = CreateCompatibleDC(dc);
  123. SelectObject(ddc, this->bottom);
  124. for(i=0; i < 256; i++) {
  125. BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
  126. }
  127. ReleaseDC(hwnd, dc);
  128. DeleteDC(sdc);
  129. DeleteDC(ddc);
  130. this->skinColor = 0;
  131. return 1;
  132. }
  133. /*
  134.  * Loads a new skin
  135.  *
  136.  */
  137. int Skin::Load(char *directory, HWND hwnd) {
  138. HDC   dc, sdc, ddc;
  139. DWORD i;
  140. if(directory != NULL) {
  141. char *mainc, *logoc, *controlsc;
  142. mainc     = (char *) malloc(strlen(directory) + 10);
  143. strcpy(mainc, directory);
  144. logoc     = (char *) malloc(strlen(directory) + 10);
  145. strcpy(logoc, directory);
  146. controlsc = (char *) malloc(strlen(directory) + 20);
  147. strcpy(controlsc, directory);
  148. if(this->skin)
  149. DeleteObject((HGDIOBJ) this->skin);
  150. if(this->controls)
  151. DeleteObject((HGDIOBJ) this->controls);
  152. if(this->logo)
  153. DeleteObject((HGDIOBJ) this->logo);
  154. this->skin =     (HBITMAP) LoadImage(NULL, strcat(mainc, "\main.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  155. this->logo =     (HBITMAP) LoadImage(NULL, strcat(logoc, "\logo.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  156. this->controls = (HBITMAP) LoadImage(NULL, strcat(controlsc, "\controls.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  157. free(mainc);
  158. free(logoc);
  159. free(controlsc);
  160. /*
  161.  * Do some cache
  162.  *
  163.  */
  164. dc = GetDC(hwnd);
  165. sdc = CreateCompatibleDC(dc);
  166. SelectObject(sdc, this->skin);
  167. ddc = CreateCompatibleDC(dc);
  168. SelectObject(ddc, this->bottom);
  169. for(i=0; i < 256; i++) {
  170. BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
  171. }
  172. ReleaseDC(hwnd, dc);
  173. DeleteDC(sdc);
  174. DeleteDC(ddc);
  175. /*
  176.  * Now load the background color from the config.txt file
  177.  */
  178. SkinFile *skinFile = new SkinFile(directory);
  179. this->skinColor = skinFile->getColor("background");
  180. skinFile->Close();
  181. }
  182. return 1;
  183. }
  184. /*
  185.  * Return Default Width
  186.  *
  187.  */
  188. int Skin::DefaultWidth()
  189. {
  190. return DEFAULT_SKIN_WIDTH;
  191. }
  192. /*
  193.  * Return Default Width
  194.  *
  195.  */
  196. int Skin::DefaultHeight()
  197. {
  198. return DEFAULT_SKIN_HEIGHT;
  199. }
  200. /*
  201.  * Set volume and Progress
  202.  * (for display only!)
  203.  *
  204.  */
  205. int Skin::SetVolume(HWND hwnd, int new_volume)
  206. {
  207. int          sizeX, sizeY;
  208. RECT         clientRect;
  209. /*
  210.    * Get some info about the
  211.  * window size and all.
  212.  */
  213. GetClientRect(hwnd, &clientRect);
  214. sizeX = clientRect.right - clientRect.left;
  215. sizeY = clientRect.bottom - clientRect.top;
  216. this->volume = new_volume;
  217. this->volumeCursor.left   = 215 + (sizeX - DEFAULT_SKIN_WIDTH) + 35*this->volume/100;
  218. this->volumeCursor.right  = 235 + (sizeX - DEFAULT_SKIN_WIDTH) + 35*this->volume/100;
  219. this->volumeCursor.top    = 293 + (sizeY - DEFAULT_SKIN_HEIGHT);
  220. this->volumeCursor.bottom = 307 + (sizeY - DEFAULT_SKIN_HEIGHT);
  221. return 1;
  222. }
  223. int Skin::SetProgress(HWND hwnd, double new_progress)
  224. {
  225. int          sizeX, sizeY;
  226. RECT         clientRect;
  227. /*
  228.    * Get some info about the
  229.  * window size and all.
  230.  */
  231. GetClientRect(hwnd, &clientRect);
  232. sizeX = clientRect.right - clientRect.left;
  233. sizeY = clientRect.bottom - clientRect.top;
  234. this->progress = new_progress;
  235. this->progressCursor.left   =  15 + (int)((double)(sizeX - DEFAULT_SKIN_WIDTH + 263 - 28)*this->progress)/100;
  236. this->progressCursor.right  =  43 + (int)((double)(sizeX - DEFAULT_SKIN_WIDTH + 263 - 28)*this->progress)/100;
  237. this->progressCursor.top    =  321 + (sizeY - DEFAULT_SKIN_HEIGHT);
  238. this->progressCursor.bottom =  336 + (sizeY - DEFAULT_SKIN_HEIGHT);
  239. return 1;
  240. }
  241. int Skin::SetVolumeCursorX(HWND hwnd, int x)
  242. {
  243. int  the_volume;
  244. int  sizeX, sizeY;
  245. RECT clientRect;
  246. HDC          hdc, bdc;
  247. hdc = GetDC(hwnd);
  248. bdc = CreateCompatibleDC(hdc);
  249.  
  250. if(hdc == NULL || bdc == NULL) {
  251. MessageBox(NULL, "Cannot get appropriate DCs!", "Error", MB_OK);
  252. }
  253. SelectObject(bdc, this->skin);
  254. /*
  255.    * Get some info about the
  256.  * window size and all.
  257.  */
  258. GetClientRect(hwnd, &clientRect);
  259. sizeX = clientRect.right - clientRect.left;
  260. sizeY = clientRect.bottom - clientRect.top;
  261. if(x < volumeBar.left)
  262. the_volume = 0;
  263. else {
  264. if(x > volumeBar.right)
  265. the_volume = 100;
  266. else {
  267. the_volume = (x - volumeBar.left)*100/(volumeBar.right - volumeBar.left);
  268. }
  269. }
  270. SetVolume(hwnd, the_volume);
  271. BitBlt(hdc, volumeBar.left, volumeBar.top - 5, (volumeBar.right - volumeBar.left), (volumeBar.bottom - volumeBar.top) + 10, 
  272.    bdc, 212, 291, SRCCOPY);
  273. SelectObject(bdc, this->controls);
  274. BitBlt(hdc, volumeCursor.left, volumeCursor.top, (volumeCursor.right - volumeCursor.left), (volumeCursor.bottom - volumeCursor.top), 
  275.    bdc, 32, 45, SRCCOPY);
  276. DeleteDC(bdc);
  277. ReleaseDC(hwnd, hdc);
  278. return 1;
  279. }
  280. int Skin::SetProgressCursorX(HWND hwnd, int x)
  281. {
  282. int  the_progress;
  283. int  sizeX, sizeY, i;
  284. RECT clientRect;
  285. HDC  hdc, bdc;
  286. hdc = GetDC(hwnd);
  287. bdc = CreateCompatibleDC(hdc);
  288.  
  289. if(hdc == NULL || bdc == NULL) {
  290. MessageBox(NULL, "Cannot get appropriate DCs!", "Error", MB_OK);
  291. }
  292. SelectObject(bdc, this->skin);
  293. /*
  294.    * Get some info about the
  295.  * window size and all.
  296.  */
  297. GetClientRect(hwnd, &clientRect);
  298. sizeX = clientRect.right - clientRect.left;
  299. sizeY = clientRect.bottom - clientRect.top;
  300. if(x < progressBar.left)
  301. the_progress = 0;
  302. else {
  303. if(x > progressBar.right)
  304. the_progress = 100;
  305. else {
  306. the_progress = (x - progressBar.left)*100/(progressBar.right - progressBar.left);
  307. }
  308. }
  309. SetProgress(hwnd, the_progress);
  310. BitBlt(hdc, 0, 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 20, bdc, 0, 320, SRCCOPY);
  311. for(i=0; i < (sizeX - DEFAULT_SKIN_WIDTH); i++) {
  312. BitBlt(hdc, 200 + i, 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 1, 20, bdc, 200, 320, SRCCOPY);
  313. }
  314. BitBlt(hdc, 200 + (sizeX - DEFAULT_SKIN_WIDTH), 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 100, 20, bdc, 200, 320, SRCCOPY);
  315. SelectObject(bdc, this->controls);
  316. BitBlt(hdc, progressCursor.left, progressCursor.top, (progressCursor.right - progressCursor.left), (progressCursor.bottom - progressCursor.top), 
  317.    bdc, 2, 45, SRCCOPY);
  318. DeleteDC(bdc);
  319. ReleaseDC(hwnd, hdc);
  320. return 1;
  321. }
  322. int Skin::SetProgressValue(HWND hwnd, double progress)
  323. {
  324. int  sizeX, sizeY, i;
  325. RECT clientRect;
  326. HDC  hdc, bdc;
  327. if(progress != this->progress) {
  328. hdc = GetDC(this->hwnd);
  329. bdc = CreateCompatibleDC(hdc);
  330.  
  331. if(hdc == NULL) {
  332. MessageBox(NULL, "Cannot get appropriate DCs!", "Error", MB_OK);
  333. }
  334. SelectObject(bdc, this->skin);
  335. /*
  336.   * Get some info about the
  337. * window size and all.
  338. */
  339. GetClientRect(hwnd, &clientRect);
  340. sizeX = clientRect.right - clientRect.left;
  341. sizeY = clientRect.bottom - clientRect.top;
  342. BitBlt(hdc, progressCursor.left, progressCursor.top, 
  343.   (progressCursor.right - progressCursor.left), 
  344.   (progressCursor.bottom - progressCursor.top), 
  345.   bdc, 200, 321, SRCCOPY);
  346. SetProgress(hwnd, progress);
  347. /*
  348.  * The cursor
  349.  */
  350. SelectObject(bdc, this->controls);
  351. BitBlt(hdc, progressCursor.left, progressCursor.top, 
  352.   (progressCursor.right - progressCursor.left), 
  353.   (progressCursor.bottom - progressCursor.top), 
  354.   bdc, 2, 45, SRCCOPY);
  355. DeleteDC(bdc);
  356. ReleaseDC(hwnd, hdc);
  357. }
  358. return 1;
  359. }
  360. /*
  361.  * Gives the Progress and Volume
  362.  *
  363.  */
  364. int Skin::GetProgress()
  365. {
  366. return (int) this->progress;
  367. }
  368. int Skin::GetVolume()
  369. {
  370. return this->volume;
  371. }
  372. /*
  373.  * Display : display the skin 
  374.  *           into a window
  375.  *
  376.  */
  377. Skin::Display(HWND hwnd, Playback *playback)
  378. {
  379. HDC          hdc, bdc, dbdc;
  380. PAINTSTRUCT  ps;
  381. int          sizeX, sizeY, i;
  382. RECT         clientRect;
  383. HBRUSH       brush, oldBrush;
  384. /*
  385.    * Get some info about the
  386.  * window size and all.
  387.  */
  388. this->hwnd = hwnd;
  389. GetClientRect(hwnd, &clientRect);
  390. sizeX = clientRect.right - clientRect.left;
  391. sizeY = clientRect.bottom - clientRect.top;
  392. hdc  = BeginPaint(hwnd, &ps);
  393. bdc  = CreateCompatibleDC(hdc);
  394. SelectObject(bdc, this->skin);
  395. if(hdc == NULL || bdc == NULL) {
  396. MessageBox(NULL, "Cannot get appropriate DCs!", "Error", MB_OK);
  397. }
  398. /*
  399.  * First blit the background
  400.  */
  401. /*
  402.  * Title
  403.  */
  404. BitBlt(hdc, 0, 0, 21, 22, bdc, 0, 0, SRCCOPY);
  405. for(i = 0; i < (sizeX - DEFAULT_SKIN_WIDTH) / 2; i++) {
  406. BitBlt(hdc, 21 + i, 0, 1, 22, bdc, 21, 0, SRCCOPY);
  407. }
  408. BitBlt(hdc, 21 + (sizeX - DEFAULT_SKIN_WIDTH) / 2, 0, 240, 22, bdc, 21, 0, SRCCOPY);
  409. for(i = 0; i < (sizeX - DEFAULT_SKIN_WIDTH) / 2 + ((sizeX - DEFAULT_SKIN_WIDTH) % 2); i++) {
  410. BitBlt(hdc, 261 + (sizeX - DEFAULT_SKIN_WIDTH) / 2 + i, 0, 1, 22, bdc, 261, 0, SRCCOPY);
  411. }
  412. BitBlt(hdc, 261 + (sizeX - DEFAULT_SKIN_WIDTH), 0, 39, 22, bdc, 261, 0, SRCCOPY);
  413. /*
  414.  * The play Area
  415.  *
  416.  */
  417. for(i=0; i < 238 + (sizeY - DEFAULT_SKIN_HEIGHT); i++) {
  418. BitBlt(hdc, 0, 22 + i, 7, 1, bdc, 0, 22, SRCCOPY);
  419. BitBlt(hdc, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 22 + i, 8, 1, bdc, 292, 22, SRCCOPY);
  420. }
  421. /*
  422.  * The bottom
  423.  */
  424. BitBlt(hdc, 0, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 115, bdc, 0, 260, SRCCOPY);
  425. BitBlt(hdc, 200 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 100, 115, bdc, 200, 260, SRCCOPY);
  426. SelectObject(bdc, this->bottom);
  427. if(sizeX - DEFAULT_SKIN_WIDTH > 0) {
  428. int pass = (sizeX - DEFAULT_SKIN_WIDTH) / 256;
  429. for(i=0; i < pass; i++) {
  430. BitBlt(hdc, 200 + i*256, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 256, 115, bdc, 0, 0, SRCCOPY);
  431. }
  432. BitBlt(hdc, 200 + pass*256, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), (sizeX - DEFAULT_SKIN_WIDTH) - pass*256, 115, bdc, 0, 0, SRCCOPY);
  433. }
  434. /*
  435.  * Now the controls
  436.  *
  437.  */
  438. SelectObject(bdc, this->controls);
  439. BitBlt(hdc, progressCursor.left, progressCursor.top, (progressCursor.right - progressCursor.left), (progressCursor.bottom - progressCursor.top), 
  440.    bdc, 2, 45, SRCCOPY);
  441. BitBlt(hdc, volumeCursor.left, volumeCursor.top, (volumeCursor.right - volumeCursor.left), (volumeCursor.bottom - volumeCursor.top), 
  442.    bdc, 32, 45, SRCCOPY);
  443. /*
  444.  * And the time info
  445.  */
  446. if(!playback->isPlaying()) {
  447. brush = CreateSolidBrush(this->skinColor); 
  448. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  449. Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  450. SelectObject(bdc, this->logo);
  451. BitBlt(hdc, (sizeX - LOGO_WIDTH)/2, 50 + (sizeY - DEFAULT_SKIN_HEIGHT)/2, LOGO_WIDTH, LOGO_HEIGHT, 
  452.    bdc, 0, 0, SRCCOPY);
  453. SelectObject(hdc, oldBrush);
  454. DeleteObject((HGDIOBJ) brush);
  455. }
  456. if(playback->isPaused()) {
  457. brush = CreateSolidBrush(0); 
  458.  
  459. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  460. Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  461. SelectObject(hdc, oldBrush);
  462. DeleteObject((HGDIOBJ) brush);
  463. }
  464. DeleteDC(bdc);
  465. EndPaint(hwnd, &ps); 
  466. return 1;
  467. }
  468. /*
  469.  * Display the FPS
  470.  *
  471.  */
  472. int Skin::DisplayFps(HWND hwnd, Playback *playback)
  473. {
  474. HDC          hdc, bdc;
  475. int          sizeX, sizeY;
  476. RECT         clientRect;
  477. if(playback) {
  478. /*
  479.    * Get some info about the
  480.  * window size and all.
  481. */
  482. GetClientRect(hwnd, &clientRect);
  483. sizeX = clientRect.right - clientRect.left;
  484. sizeY = clientRect.bottom - clientRect.top;
  485. hdc  = GetDC(hwnd);
  486. bdc  = CreateCompatibleDC(hdc);
  487. SelectObject(bdc, this->skin);
  488. BitBlt(hdc, 0, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 40, bdc, 0, 260, SRCCOPY);
  489. char msg[10];
  490. sprintf(msg, "%3.f FPS", playback->GetCurrentFps());
  491. SetBkMode(hdc, TRANSPARENT);
  492. TextOut(hdc, 15, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), msg, 7);
  493. DeleteDC(bdc);
  494. ReleaseDC(hwnd, hdc);
  495. }
  496. return 1;
  497. }
  498. /*
  499.  * Update the rects according
  500.  * to the new size of the window
  501.  *
  502.  */
  503. int Skin::UpdateSize(HWND hwnd)
  504. {
  505. int          sizeX, sizeY;
  506. RECT         clientRect;
  507. /*
  508.    * Get some info about the
  509.  * window size and all.
  510.  */
  511. GetClientRect(hwnd, &clientRect);
  512. sizeX = clientRect.right - clientRect.left;
  513. sizeY = clientRect.bottom - clientRect.top;
  514. this->menuButton.left   = 2;
  515. this->menuButton.right  = 14;
  516. this->menuButton.top    = 3;
  517. this->menuButton.bottom = 14;
  518. this->minimizeButton.left   = 266 + (sizeX - DEFAULT_SKIN_WIDTH);
  519. this->minimizeButton.right  = 278 + (sizeX - DEFAULT_SKIN_WIDTH);
  520. this->minimizeButton.top    = 3;
  521. this->minimizeButton.bottom = 14;
  522. this->closeButton.left   = 283 + (sizeX - DEFAULT_SKIN_WIDTH);
  523. this->closeButton.right  = 295 + (sizeX - DEFAULT_SKIN_WIDTH);
  524. this->closeButton.top    = 3;
  525. this->closeButton.bottom = 14;
  526. this->rewindButton.left   = 15;
  527. this->rewindButton.right  = 15+29;
  528. this->rewindButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  529. this->rewindButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  530. this->stopButton.left   = 52;
  531. this->stopButton.right  = 52+29;
  532. this->stopButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  533. this->stopButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  534. this->playButton.left   = 89;
  535. this->playButton.right  = 89+29;
  536. this->playButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  537. this->playButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  538. this->pauseButton.left   = 126;
  539. this->pauseButton.right  = 126+29;
  540. this->pauseButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  541. this->pauseButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  542. this->forwardButton.left   = 163;
  543. this->forwardButton.right  = 192;
  544. this->forwardButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  545. this->forwardButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  546. this->loadButton.left   = 236 + (sizeX - DEFAULT_SKIN_WIDTH);
  547. this->loadButton.right  = 236 + 44 + (sizeX - DEFAULT_SKIN_WIDTH);
  548. this->loadButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  549. this->loadButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  550. this->resizeButton.left   = 282 + (sizeX - DEFAULT_SKIN_WIDTH);
  551. this->resizeButton.right  = 282 + 15 + (sizeX - DEFAULT_SKIN_WIDTH);
  552. this->resizeButton.top    = 357 + (sizeY - DEFAULT_SKIN_HEIGHT);
  553. this->resizeButton.bottom = 357 + 15 + (sizeY - DEFAULT_SKIN_HEIGHT);
  554. this->progressBar.left   = 12;
  555. this->progressBar.right  = 281 + (sizeX - DEFAULT_SKIN_WIDTH);
  556. this->progressBar.top    = 325 + (sizeY - DEFAULT_SKIN_HEIGHT);
  557. this->progressBar.bottom = 332 + (sizeY - DEFAULT_SKIN_HEIGHT);
  558. this->volumeBar.left   = 212 + (sizeX - DEFAULT_SKIN_WIDTH);
  559. this->volumeBar.right  = 273 + (sizeX - DEFAULT_SKIN_WIDTH);
  560. this->volumeBar.top    = 296 + (sizeY - DEFAULT_SKIN_HEIGHT);
  561. this->volumeBar.bottom = 304 + (sizeY - DEFAULT_SKIN_HEIGHT);
  562. SetVolume(hwnd, this->volume);
  563. SetProgress(hwnd, this->progress);
  564. return 1;
  565. }
  566. /*
  567.  * Updates special zones upon action
  568.  *
  569.  */
  570. int Skin::SetActionStart(HWND hwnd, int action)
  571. {
  572. HDC          hdc, bdc;
  573. hdc = GetDC(hwnd);
  574. bdc = CreateCompatibleDC(hdc);
  575.  
  576. if(hdc == NULL || bdc == NULL) {
  577. MessageBox(NULL, "Cannot get appropriate DCs!", "Error", MB_OK);
  578. }
  579. SelectObject(bdc, this->controls);
  580. switch(action) {
  581. case ACTION_REWIND:
  582. BitBlt(hdc, rewindButton.left, rewindButton.top, (rewindButton.right - rewindButton.left), (rewindButton.bottom - rewindButton.top),
  583.    bdc, 2, 26, SRCCOPY);
  584. break;
  585. case ACTION_STOP:
  586. BitBlt(hdc, stopButton.left, stopButton.top, (stopButton.right - stopButton.left), (stopButton.bottom - stopButton.top),
  587.    bdc, 33, 26, SRCCOPY);
  588. break;
  589. case ACTION_PLAY:
  590. BitBlt(hdc, playButton.left, playButton.top, (playButton.right - playButton.left), (playButton.bottom - playButton.top),
  591.    bdc, 64, 26, SRCCOPY);
  592. break;
  593. case ACTION_PAUSE:
  594. BitBlt(hdc, pauseButton.left, pauseButton.top, (pauseButton.right - pauseButton.left), (pauseButton.bottom - pauseButton.top),
  595.    bdc, 95, 26, SRCCOPY);
  596. break;
  597. case ACTION_FORWARD:
  598. BitBlt(hdc, forwardButton.left, forwardButton.top, (forwardButton.right - forwardButton.left), (forwardButton.bottom - forwardButton.top),
  599.    bdc, 126, 26, SRCCOPY);
  600. break;
  601. case ACTION_LOAD:
  602. BitBlt(hdc, loadButton.left, loadButton.top, (loadButton.right - loadButton.left), (loadButton.bottom - loadButton.top),
  603.    bdc, 157, 26, SRCCOPY);
  604. break;
  605. default:
  606. break;
  607. }
  608. DeleteDC(bdc);
  609. ReleaseDC(hwnd, hdc);
  610. return 1;
  611. }
  612. int Skin::SetActionEnd(HWND hwnd, int action)
  613. {
  614. HDC          hdc, bdc;
  615. hdc = GetDC(hwnd);
  616. bdc = CreateCompatibleDC(hdc);
  617.  
  618. if(hdc == NULL || bdc == NULL) {
  619. MessageBox(NULL, "Cannot get appropriate DCs!", "Error", MB_OK);
  620. }
  621. SelectObject(bdc, this->skin);
  622. switch(action) {
  623. case ACTION_REWIND:
  624. BitBlt(hdc, rewindButton.left, rewindButton.top, (rewindButton.right - rewindButton.left), (rewindButton.bottom - rewindButton.top),
  625.    bdc, 15, 343, SRCCOPY);
  626. break;
  627. case ACTION_STOP:
  628. BitBlt(hdc, stopButton.left, stopButton.top, (stopButton.right - stopButton.left), (stopButton.bottom - stopButton.top),
  629.    bdc, 52, 343, SRCCOPY);
  630. break;
  631. case ACTION_PLAY:
  632. BitBlt(hdc, playButton.left, playButton.top, (playButton.right - playButton.left), (playButton.bottom - playButton.top),
  633.    bdc, 89, 343, SRCCOPY);
  634. break;
  635. case ACTION_PAUSE:
  636. BitBlt(hdc, pauseButton.left, pauseButton.top, (pauseButton.right - pauseButton.left), (pauseButton.bottom - pauseButton.top),
  637.    bdc, 126, 343, SRCCOPY);
  638. break;
  639. case ACTION_FORWARD:
  640. BitBlt(hdc, forwardButton.left, forwardButton.top, (forwardButton.right - forwardButton.left), (forwardButton.bottom - forwardButton.top),
  641.    bdc, 163, 343, SRCCOPY);
  642. break;
  643. case ACTION_LOAD:
  644. BitBlt(hdc, loadButton.left, loadButton.top, (loadButton.right - loadButton.left), (loadButton.bottom - loadButton.top),
  645.    bdc, 236, 343, SRCCOPY);
  646. break;
  647. default:
  648. break;
  649. }
  650. DeleteDC(bdc);
  651. ReleaseDC(hwnd, hdc);
  652. return 1;
  653. }
  654. /*
  655.  * Returns the action corresponding
  656.  * to the given mouse click inside 
  657.  * the skin
  658.  *
  659.  */
  660. int Skin::GetAction(int x, int y)
  661. {
  662. if(isInsideRect(x, y, this->menuButton))
  663. return ACTION_MENU;
  664. if(isInsideRect(x, y, this->minimizeButton))
  665. return ACTION_MINIMIZE;
  666. if(isInsideRect(x, y, this->closeButton))
  667. return ACTION_CLOSE;
  668. if(isInsideRect(x, y, this->rewindButton))
  669. return ACTION_REWIND;
  670. if(isInsideRect(x, y, this->stopButton))
  671. return ACTION_STOP;
  672. if(isInsideRect(x, y, this->playButton))
  673. return ACTION_PLAY;
  674. if(isInsideRect(x, y, this->pauseButton))
  675. return ACTION_PAUSE;
  676. if(isInsideRect(x, y, this->forwardButton))
  677. return ACTION_FORWARD;
  678. if(isInsideRect(x, y, this->loadButton))
  679. return ACTION_LOAD;
  680. if(isInsideRect(x, y, this->resizeButton))
  681. return ACTION_RESIZE;
  682. if(isInsideRect(x, y, this->volumeCursor))
  683. return ACTION_VOLUME_CURSOR;
  684. if(isInsideRect(x, y, this->progressCursor))
  685. return ACTION_PROGRESS_CURSOR;
  686. if(isInsideRect(x, y, this->volumeBar))
  687. return ACTION_VOLUME_BAR;
  688. if(isInsideRect(x, y, this->progressBar))
  689. return ACTION_PROGRESS_BAR;
  690. return ACTION_NONE;
  691. }