Skin.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:29k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /**************************************************************************************
  2.  *                                                                                    *
  3.  *                                                                                    *
  4.  **************************************************************************************/
  5. #include "Skin.h"
  6. /*
  7.  * Constructor : 装载缺省的外壳
  8.  *
  9.  */
  10. Skin::Skin(HINSTANCE hInstance, HWND hwnd)
  11. {
  12. this->LoadDefault(hInstance, hwnd);
  13. if(this->skin == NULL ||this->controls == NULL) {
  14. MessageBox(NULL, "Cannot load default skin!", "Error", MB_OK);
  15. }
  16. this->menuButton.left   = 2;
  17. this->menuButton.right  = 14;
  18. this->menuButton.top    = 3;
  19. this->menuButton.bottom = 14;
  20. this->minimizeButton.left   = 266;
  21. this->minimizeButton.right  = 278;
  22. this->minimizeButton.top    = 3;
  23. this->minimizeButton.bottom = 14;
  24. this->closeButton.left   = 283;
  25. this->closeButton.right  = 295;
  26. this->closeButton.top    = 3;
  27. this->closeButton.bottom = 14;
  28. this->rewindButton.left   = 15;
  29. this->rewindButton.right  = 15+29;
  30. this->rewindButton.top    = 343;
  31. this->rewindButton.bottom = 360;
  32. this->stopButton.left   = 52;
  33. this->stopButton.right  = 52+29;
  34. this->stopButton.top    = 343;
  35. this->stopButton.bottom = 360;
  36. this->playButton.left   = 89;
  37. this->playButton.right  = 89+29;
  38. this->playButton.top    = 343;
  39. this->playButton.bottom = 360;
  40. this->pauseButton.left   = 126;
  41. this->pauseButton.right  = 126+29;
  42. this->pauseButton.top    = 343;
  43. this->pauseButton.bottom = 360;
  44. this->forwardButton.left   = 263;
  45. this->forwardButton.right  = 300;
  46. this->forwardButton.top    = 343;
  47. this->forwardButton.bottom = 360;
  48. this->loadButton.left   = 236;
  49. this->loadButton.right  = 263+44;
  50. this->loadButton.top    = 343;
  51. this->loadButton.bottom = 360;
  52. this->progressBar.left   = 12;
  53. this->progressBar.right  = 281;
  54. this->progressBar.top    = 325;
  55. this->progressBar.bottom = 332;
  56. this->volumeBar.left   = 212;
  57. this->volumeBar.right  = 273;
  58. this->volumeBar.top    = 296;
  59. this->volumeBar.bottom = 304;
  60. this->progressCursor.left   = 15;
  61. this->progressCursor.right  = 43;
  62. this->progressCursor.top    = 321;
  63. this->progressCursor.bottom = 336;
  64. this->volumeCursor.left   = 250;
  65. this->volumeCursor.right  = 270;
  66. this->volumeCursor.top    = 293;
  67. this->volumeCursor.bottom = 307;
  68. this->volume   = 100;
  69. this->progress = 0.0;
  70. this->compactMode = 0;
  71. }
  72. Skin::~Skin()
  73. {
  74. DeleteObject((HGDIOBJ) this->skin); 
  75. DeleteObject((HGDIOBJ) this->controls); 
  76. DeleteObject((HGDIOBJ) this->bottom); 
  77. DeleteObject((HGDIOBJ) this->logo); 
  78. }
  79. BOOL Skin::isInsideRect(int x, int y, RECT rect)
  80. {
  81. return (x > rect.left && x < rect.right && y > rect.top && y < rect.bottom);
  82. }
  83. int Skin::LoadDefault(HINSTANCE hInstance, HWND hwnd) {
  84. HDC   dc, sdc, ddc;
  85. DWORD i;
  86. this->skin     = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_SKIN)); 
  87. this->controls = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_CONTROLS));
  88. this->logo     = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_LOGO));
  89. dc = GetDC(hwnd);
  90. this->bottom = CreateCompatibleBitmap(dc, 256, 115);
  91. sdc = CreateCompatibleDC(dc);
  92. SelectObject(sdc, this->skin);
  93. ddc = CreateCompatibleDC(dc);
  94. SelectObject(ddc, this->bottom);
  95. for(i=0; i < 256; i++) {
  96. BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
  97. }
  98. ReleaseDC(hwnd, dc);
  99. DeleteDC(sdc);
  100. DeleteDC(ddc);
  101. this->skinColor = 0;
  102. return 1;
  103. }
  104. int Skin::Load(char *directory, HWND hwnd) {
  105. HDC   dc, sdc, ddc;
  106. DWORD i;
  107. if(directory != NULL) {
  108. char *mainc, *logoc, *controlsc;
  109. mainc     = (char *) new char[strlen(directory) + 10];
  110. strcpy(mainc, directory);
  111. logoc     = (char *) new char[strlen(directory) + 10];
  112. strcpy(logoc, directory);
  113. controlsc = (char *) new char[strlen(directory) + 20];
  114. strcpy(controlsc, directory);
  115. if(this->skin)
  116. DeleteObject((HGDIOBJ) this->skin);
  117. if(this->controls)
  118. DeleteObject((HGDIOBJ) this->controls);
  119. if(this->logo)
  120. DeleteObject((HGDIOBJ) this->logo);
  121. this->skin =     (HBITMAP) LoadImage(NULL, strcat(mainc, "\main.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  122. this->logo =     (HBITMAP) LoadImage(NULL, strcat(logoc, "\logo.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  123. this->controls = (HBITMAP) LoadImage(NULL, strcat(controlsc, "\controls.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
  124. free(mainc);
  125. free(logoc);
  126. free(controlsc);
  127. if(this->skin == 0 || this->logo == 0 || this->controls == 0) {
  128. this->LoadDefault(GetModuleHandle(NULL), hwnd);
  129. }
  130. else {
  131. dc = GetDC(hwnd);
  132. sdc = CreateCompatibleDC(dc);
  133. SelectObject(sdc, this->skin);
  134. ddc = CreateCompatibleDC(dc);
  135. SelectObject(ddc, this->bottom);
  136. for(i=0; i < 256; i++) {
  137. BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
  138. }
  139. ReleaseDC(hwnd, dc);
  140. DeleteDC(sdc);
  141. DeleteDC(ddc);
  142. SkinFile *skinFile = new SkinFile(directory);
  143. this->skinColor = skinFile->getColor("background");
  144. skinFile->Close();
  145. }
  146. }
  147. return 1;
  148. }
  149. int Skin::GetDefaultWidth()
  150. {
  151. return DEFAULT_SKIN_WIDTH;
  152. }
  153. int Skin::GetDefaultHeight()
  154. {
  155. return DEFAULT_SKIN_HEIGHT;
  156. }
  157. int Skin::SetVolume(HWND hwnd, int new_volume)
  158. {
  159. int          sizeX, sizeY;
  160. RECT         clientRect;
  161. GetClientRect(hwnd, &clientRect);
  162. sizeX = clientRect.right - clientRect.left;
  163. sizeY = clientRect.bottom - clientRect.top;
  164. this->volume = new_volume;
  165. this->volumeCursor.left   = 215 + (sizeX - DEFAULT_SKIN_WIDTH) + 35*this->volume/100;
  166. this->volumeCursor.right  = 235 + (sizeX - DEFAULT_SKIN_WIDTH) + 35*this->volume/100;
  167. this->volumeCursor.top    = 293 + (sizeY - DEFAULT_SKIN_HEIGHT);
  168. this->volumeCursor.bottom = 307 + (sizeY - DEFAULT_SKIN_HEIGHT);
  169. return 1;
  170. }
  171. int Skin::SetProgress(HWND hwnd, double new_progress)
  172. {
  173. int          sizeX, sizeY;
  174. RECT         clientRect;
  175. GetClientRect(hwnd, &clientRect);
  176. sizeX = clientRect.right - clientRect.left;
  177. sizeY = clientRect.bottom - clientRect.top;
  178. this->progress = new_progress;
  179. this->progressCursor.left   =  15 + (int)((double)(sizeX - DEFAULT_SKIN_WIDTH + 263 - 28)*this->progress)/100;
  180. this->progressCursor.right  =  43 + (int)((double)(sizeX - DEFAULT_SKIN_WIDTH + 263 - 28)*this->progress)/100;
  181. this->progressCursor.top    =  321 + (sizeY - DEFAULT_SKIN_HEIGHT);
  182. this->progressCursor.bottom =  336 + (sizeY - DEFAULT_SKIN_HEIGHT);
  183. return 1;
  184. }
  185. int Skin::SetVolumeCursorX(HWND hwnd, int x)
  186. {
  187. int  the_volume;
  188. int  sizeX, sizeY;
  189. RECT clientRect;
  190. HDC          hdc, bdc;
  191. hdc = GetDC(hwnd);
  192. bdc = CreateCompatibleDC(hdc);
  193.  
  194. if(hdc == NULL || bdc == NULL) {
  195. return 0;
  196. }
  197. SelectObject(bdc, this->skin);
  198. GetClientRect(hwnd, &clientRect);
  199. sizeX = clientRect.right - clientRect.left;
  200. sizeY = clientRect.bottom - clientRect.top;
  201. if(x < volumeBar.left)
  202. the_volume = 0;
  203. else {
  204. if(x > volumeBar.right)
  205. the_volume = 100;
  206. else {
  207. the_volume = (x - volumeBar.left)*100/(volumeBar.right - volumeBar.left);
  208. }
  209. }
  210. SetVolume(hwnd, the_volume);
  211. BitBlt(hdc, volumeBar.left, volumeBar.top - 5, (volumeBar.right - volumeBar.left), (volumeBar.bottom - volumeBar.top) + 10, 
  212.    bdc, 212, 291, SRCCOPY);
  213. SelectObject(bdc, this->controls);
  214. BitBlt(hdc, volumeCursor.left, volumeCursor.top, (volumeCursor.right - volumeCursor.left), (volumeCursor.bottom - volumeCursor.top), 
  215.    bdc, 32, 45, SRCCOPY);
  216. DeleteDC(bdc);
  217. ReleaseDC(hwnd, hdc);
  218. return 1;
  219. }
  220. int Skin::SetProgressCursorX(HWND hwnd, int x)
  221. {
  222. int  the_progress;
  223. int  sizeX, sizeY, i;
  224. RECT clientRect;
  225. HDC  hdc, bdc;
  226. hdc = GetDC(hwnd);
  227. bdc = CreateCompatibleDC(hdc);
  228.  
  229. if(hdc == NULL || bdc == NULL) {
  230. return 0;
  231. }
  232. SelectObject(bdc, this->skin);
  233. GetClientRect(hwnd, &clientRect);
  234. sizeX = clientRect.right - clientRect.left;
  235. sizeY = clientRect.bottom - clientRect.top;
  236. if(x < progressBar.left)
  237. the_progress = 0;
  238. else {
  239. if(x > progressBar.right)
  240. the_progress = 100;
  241. else {
  242. the_progress = (x - progressBar.left)*100/(progressBar.right - progressBar.left);
  243. }
  244. }
  245. SetProgress(hwnd, the_progress);
  246. BitBlt(hdc, 0, 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 20, bdc, 0, 320, SRCCOPY);
  247. for(i=0; i < (sizeX - DEFAULT_SKIN_WIDTH); i++) {
  248. BitBlt(hdc, 200 + i, 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 1, 20, bdc, 200, 320, SRCCOPY);
  249. }
  250. BitBlt(hdc, 200 + (sizeX - DEFAULT_SKIN_WIDTH), 320 + (sizeY - DEFAULT_SKIN_HEIGHT), 100, 20, bdc, 200, 320, SRCCOPY);
  251. SelectObject(bdc, this->controls);
  252. BitBlt(hdc, progressCursor.left, progressCursor.top, (progressCursor.right - progressCursor.left), (progressCursor.bottom - progressCursor.top), 
  253.    bdc, 2, 45, SRCCOPY);
  254. DeleteDC(bdc);
  255. ReleaseDC(hwnd, hdc);
  256. return 1;
  257. }
  258. int Skin::SetProgressValue(HWND hwnd, double progress)
  259. {
  260. int  sizeX, sizeY;
  261. RECT clientRect;
  262. HDC  hdc, bdc;
  263. if(progress != this->progress) {
  264. hdc = GetDC(this->hwnd);
  265. bdc = CreateCompatibleDC(hdc);
  266.  
  267. if(hdc == NULL) {
  268. return 0;
  269. }
  270. SelectObject(bdc, this->skin);
  271. GetClientRect(hwnd, &clientRect);
  272. sizeX = clientRect.right - clientRect.left;
  273. sizeY = clientRect.bottom - clientRect.top;
  274. BitBlt(hdc, progressCursor.left, progressCursor.top, 
  275.   (progressCursor.right - progressCursor.left), 
  276.   (progressCursor.bottom - progressCursor.top), 
  277.   bdc, 200, 321, SRCCOPY);
  278. SetProgress(hwnd, progress);
  279. SelectObject(bdc, this->controls);
  280. BitBlt(hdc, progressCursor.left, progressCursor.top, 
  281.   (progressCursor.right - progressCursor.left), 
  282.   (progressCursor.bottom - progressCursor.top), 
  283.   bdc, 2, 45, SRCCOPY);
  284. DeleteDC(bdc);
  285. ReleaseDC(hwnd, hdc);
  286. }
  287. return 1;
  288. }
  289. RECT *Skin::GetVideoRect()
  290. {
  291. if(this->hwnd) {
  292. GetClientRect(this->hwnd, &this->videoRect);
  293. if(this->compactMode) {
  294. return &this->videoRect;
  295. }
  296. else {
  297. this->videoRect.left    = 7;
  298. this->videoRect.right  -= 15;
  299. this->videoRect.top     = 22;
  300. this->videoRect.bottom -= 115;
  301. return &this->videoRect;
  302. }
  303. }
  304. return &this->videoRect;
  305. }
  306. int Skin::SetCompact(int compact)
  307. {
  308. this->compactMode = compact;
  309. return 0;
  310. }
  311. int Skin::GetProgress()
  312. {
  313. return (int) this->progress;
  314. }
  315. int Skin::GetVolume()
  316. {
  317. return this->volume;
  318. }
  319. Skin::Display(HWND hwnd, MediaPlayback *playback)
  320. {
  321. HDC          hdc, bdc;
  322. PAINTSTRUCT  ps;
  323. int          sizeX, sizeY, i;
  324. RECT         clientRect;
  325. HBRUSH       brush, oldBrush;
  326. /*
  327.    * 得到窗口的大小等信息
  328.  */
  329. GetClientRect(hwnd, &clientRect);
  330. sizeX = clientRect.right - clientRect.left;
  331. sizeY = clientRect.bottom - clientRect.top;
  332. this->hwnd = hwnd;
  333. if(!playback->IsInFullscreen() || playback->desktopMode) {
  334. hdc  = BeginPaint(hwnd, &ps);
  335. if(this->compactMode) {
  336. /*
  337.  * 简单显示logo
  338.  */
  339. bdc  = CreateCompatibleDC(hdc);
  340. SelectObject(bdc, this->logo);
  341. if(playback->IsOverlay()) {
  342. brush = CreateSolidBrush(DD_OVERLAY_COLORREF); 
  343. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  344. Rectangle(hdc, 0, 0, sizeX, sizeY); 
  345. SelectObject(hdc, oldBrush);
  346. DeleteObject((HGDIOBJ) brush);
  347. }
  348. else {
  349. if(!playback->IsPlaying()) {
  350. brush = CreateSolidBrush(this->skinColor); 
  351. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  352. Rectangle(hdc, 0, 0, DEFAULT_SKIN_WIDTH + (sizeX - DEFAULT_SKIN_WIDTH), 
  353.   DEFAULT_SKIN_HEIGHT + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  354. SelectObject(bdc, this->logo);
  355. if(sizeY > LOGO_HEIGHT)
  356. BitBlt(hdc, (sizeX - LOGO_WIDTH)/2, (sizeY - LOGO_HEIGHT)/2, LOGO_WIDTH, LOGO_HEIGHT, bdc, 0, 0, SRCCOPY);
  357. SelectObject(hdc, oldBrush);
  358. DeleteObject((HGDIOBJ) brush);
  359. }
  360. }
  361. DeleteDC(bdc);
  362. }
  363. else {
  364. /*
  365.  * 绘制标准外壳
  366.  */
  367. bdc  = CreateCompatibleDC(hdc);
  368. SelectObject(bdc, this->skin);
  369. if(hdc == NULL || bdc == NULL) {
  370. return 0;
  371. }
  372. /*
  373.  * 首先复制背景
  374.    */
  375. /*
  376.  * 标题
  377.  */
  378. BitBlt(hdc, 0, 0, 21, 22, bdc, 0, 0, SRCCOPY);
  379. for(i = 0; i < (sizeX - DEFAULT_SKIN_WIDTH) / 2; i++) {
  380. BitBlt(hdc, 21 + i, 0, 1, 22, bdc, 21, 0, SRCCOPY);
  381. }
  382. BitBlt(hdc, 21 + (sizeX - DEFAULT_SKIN_WIDTH) / 2, 0, 240, 22, bdc, 21, 0, SRCCOPY);
  383. for(i = 0; i < (sizeX - DEFAULT_SKIN_WIDTH) / 2 + ((sizeX - DEFAULT_SKIN_WIDTH) % 2); i++) {
  384. BitBlt(hdc, 261 + (sizeX - DEFAULT_SKIN_WIDTH) / 2 + i, 0, 1, 22, bdc, 261, 0, SRCCOPY);
  385. }
  386. BitBlt(hdc, 261 + (sizeX - DEFAULT_SKIN_WIDTH), 0, 39, 22, bdc, 261, 0, SRCCOPY);
  387. /*
  388.  * 播放面积
  389.  *
  390.  */
  391. for(i=0; i < 238 + (sizeY - DEFAULT_SKIN_HEIGHT); i++) {
  392. BitBlt(hdc, 0, 22 + i, 7, 1, bdc, 0, 22, SRCCOPY);
  393. BitBlt(hdc, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 22 + i, 8, 1, bdc, 292, 22, SRCCOPY);
  394. }
  395. /*
  396.  * 底
  397.  */
  398. BitBlt(hdc, 0, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 115, bdc, 0, 260, SRCCOPY);
  399. BitBlt(hdc, 200 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 100, 115, bdc, 200, 260, SRCCOPY);
  400. SelectObject(bdc, this->bottom);
  401. if(sizeX - DEFAULT_SKIN_WIDTH > 0) {
  402. int pass = (sizeX - DEFAULT_SKIN_WIDTH) / 256;
  403. for(i=0; i < pass; i++) {
  404. BitBlt(hdc, 200 + i*256, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 256, 115, bdc, 0, 0, SRCCOPY);
  405. }
  406. BitBlt(hdc, 200 + pass*256, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), (sizeX - DEFAULT_SKIN_WIDTH) - pass*256, 115, bdc, 0, 0, SRCCOPY);
  407. }
  408. /*
  409.  * 某些信息
  410.  */
  411. if(playback->HasVideo() && !this->compactMode) {
  412. HFONT font, oldFont;
  413. DWORD time, total;
  414. char  buffer[24];
  415. DWORD h, m, s, ht, mt, st;
  416. char *file;
  417. 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");
  418. oldFont = (HFONT) SelectObject(hdc, (HGDIOBJ) font);
  419. SetBkMode(hdc, TRANSPARENT);
  420. if(strrchr(playback->GetFilename(), '\') != NULL) {
  421. file = strrchr(playback->GetFilename(), '\')+1;
  422. }
  423. else {
  424. file = playback->GetFilename();
  425. }
  426. TextOut(hdc, 20, 282 + (sizeY - DEFAULT_SKIN_HEIGHT), file, strlen(file));
  427. time = playback->GetActualTime();
  428. total = playback->GetTotalTime();
  429. h = time / 3600;
  430. m = (time - h*3600) / 60;
  431. s = (time - h*3600 - m*60);
  432. ht = total / 3600;
  433. mt = (total - ht*3600) / 60;
  434. st = (total - ht*3600 - mt*60);
  435. sprintf(buffer, "%.2d:%.2d:%.2d / %.2d:%.2d:%.2d", h, m, s, ht, mt, st);
  436. TextOut(hdc, 20, 296 + (sizeY - DEFAULT_SKIN_HEIGHT), buffer, strlen(buffer));
  437. SelectObject(hdc, (HGDIOBJ) oldFont);
  438. DeleteObject((HGDIOBJ)font);
  439. }
  440. /*
  441.  * 控件
  442.  *
  443.  */
  444. SelectObject(bdc, this->controls);
  445. BitBlt(hdc, progressCursor.left, progressCursor.top, (progressCursor.right - progressCursor.left), (progressCursor.bottom - progressCursor.top), 
  446.    bdc, 2, 45, SRCCOPY);
  447. BitBlt(hdc, volumeCursor.left, volumeCursor.top, (volumeCursor.right - volumeCursor.left), (volumeCursor.bottom - volumeCursor.top), 
  448.    bdc, 32, 45, SRCCOPY);
  449. /*
  450.  * 时间信息
  451.  */
  452. if(!playback->desktopMode) {
  453. if(!playback->IsPlaying() && !playback->IsPaused()) {
  454. brush = CreateSolidBrush(this->skinColor); 
  455. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  456. Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  457. SelectObject(bdc, this->logo);
  458. if(sizeY > LOGO_HEIGHT + 135 + 22)
  459. BitBlt(hdc, (sizeX - LOGO_WIDTH)/2, 50 + (sizeY - DEFAULT_SKIN_HEIGHT)/2, LOGO_WIDTH, LOGO_HEIGHT, bdc, 0, 0, SRCCOPY);
  460. SelectObject(hdc, oldBrush);
  461. DeleteObject((HGDIOBJ) brush);
  462. }
  463. else {
  464. if(playback->IsOverlay()) {
  465. brush = CreateSolidBrush(DD_OVERLAY_COLORREF);
  466. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  467. Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  468. SelectObject(hdc, oldBrush);
  469. DeleteObject((HGDIOBJ) brush);
  470. }
  471. }
  472. if(playback->IsPaused()) {
  473. if(playback->IsOverlay()) {
  474. brush = CreateSolidBrush(DD_OVERLAY_COLORREF);
  475. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  476. Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  477. SelectObject(hdc, oldBrush);
  478. DeleteObject((HGDIOBJ) brush);
  479. }
  480. else {
  481. brush = CreateSolidBrush(0); 
  482.  
  483. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  484. Rectangle(hdc, 7, 22, 292 + (sizeX - DEFAULT_SKIN_WIDTH), 260 + (sizeY - DEFAULT_SKIN_HEIGHT)); 
  485. SelectObject(hdc, oldBrush);
  486. DeleteObject((HGDIOBJ) brush);
  487. }
  488. }
  489. }
  490. DeleteDC(bdc);
  491. }
  492. EndPaint(hwnd, &ps); 
  493. }
  494. else {
  495. if(playback->IsOverlay() && playback->HasVideo()) {
  496. RECT *fullRects;
  497. fullRects = playback->videoRenderer->GetFullscreenRects();
  498. if(fullRects != NULL) {
  499. GetClientRect(hwnd, &clientRect);
  500. hdc  = BeginPaint(hwnd, &ps);
  501. brush = CreateSolidBrush(0);
  502. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  503. Rectangle(hdc, fullRects[0].left, fullRects[0].top, fullRects[0].left + fullRects[0].right + 50, fullRects[0].top + fullRects[0].bottom); 
  504. Rectangle(hdc, fullRects[2].left, fullRects[2].top, fullRects[2].left + fullRects[2].right + 50, fullRects[2].top + fullRects[2].bottom + 50); 
  505. DeleteObject((HGDIOBJ) brush);
  506. brush = CreateSolidBrush(DD_OVERLAY_COLORREF_FULLSCREEN);
  507. (HBRUSH) SelectObject(hdc, brush);
  508. Rectangle(hdc, fullRects[1].left, fullRects[1].top, fullRects[1].left + fullRects[1].right + 50, fullRects[1].top + fullRects[1].bottom); 
  509. SelectObject(hdc, oldBrush);
  510. DeleteObject((HGDIOBJ) brush);
  511. EndPaint(hwnd, &ps); 
  512. }
  513. }
  514. else {
  515. if(playback->HasVideo()) {
  516. hdc  = BeginPaint(hwnd, &ps);
  517. brush = CreateSolidBrush(0);
  518. oldBrush = (HBRUSH) SelectObject(hdc, brush);
  519. Rectangle(hdc, 0, 0, sizeX, sizeY); 
  520. SelectObject(hdc, oldBrush);
  521. DeleteObject((HGDIOBJ) brush);
  522. EndPaint(hwnd, &ps); 
  523. }
  524. }
  525. }
  526. return 1;
  527. }
  528. /*
  529.  * 显示FPS
  530.  *
  531.  */
  532. int Skin::DisplayFps(HWND hwnd, MediaPlayback *playback)
  533. {
  534. HDC          hdc, bdc;
  535. int          sizeX, sizeY;
  536. RECT         clientRect;
  537. if(playback) {
  538. GetClientRect(hwnd, &clientRect);
  539. sizeX = clientRect.right - clientRect.left;
  540. sizeY = clientRect.bottom - clientRect.top;
  541. hdc  = GetDC(hwnd);
  542. bdc  = CreateCompatibleDC(hdc);
  543. SelectObject(bdc, this->skin);
  544. BitBlt(hdc, 0, 260 + (sizeY - DEFAULT_SKIN_HEIGHT), 200, 40, bdc, 0, 260, SRCCOPY);
  545. char msg[10];
  546. sprintf(msg, "%3.f FPS", playback->GetCurrentFps());
  547. SetBkMode(hdc, TRANSPARENT);
  548. TextOut(hdc, 15, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), msg, 7);
  549. DeleteDC(bdc);
  550. ReleaseDC(hwnd, hdc);
  551. }
  552. return 1;
  553. }
  554. int   Skin::DrawTime(HWND hwnd, MediaPlayback *playback) {
  555. HDC          hdc, bdc, ddc;
  556. int          sizeX, sizeY;
  557. RECT         clientRect;
  558. HFONT        font, oldFont;
  559. HBITMAP      buff;
  560. if(hwnd) {
  561. GetClientRect(hwnd, &clientRect);
  562. sizeX = clientRect.right - clientRect.left;
  563. sizeY = clientRect.bottom - clientRect.top;
  564. hdc  = GetDC(hwnd);
  565. bdc  = CreateCompatibleDC(hdc);
  566. ddc  = CreateCompatibleDC(hdc);
  567. buff = CreateCompatibleBitmap(hdc, 106, 28);
  568. SelectObject(bdc, this->skin);
  569. SelectObject(ddc, buff);
  570. BitBlt(ddc, 0, 0, 106, 28, bdc, 17, 280, SRCCOPY);
  571. HFONT font, oldFont;
  572. DWORD time, total;
  573. char  buffer[24];
  574. DWORD h, m, s, ht, mt, st;
  575. char *file;
  576. if(strrchr(playback->GetFilename(), '\') != NULL) {
  577. file = strrchr(playback->GetFilename(), '\')+1;
  578. }
  579. else {
  580. file = playback->GetFilename();
  581. }
  582. 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");
  583. oldFont = (HFONT) SelectObject(ddc, (HGDIOBJ) font);
  584. SetBkMode(ddc, TRANSPARENT);
  585. TextOut(ddc, 3, 2, file, strlen(file));
  586. time = playback->GetActualTime();
  587. total = playback->GetTotalTime();
  588. h = time / 3600;
  589. m = (time - h*3600) / 60;
  590. s = (time - h*3600 - m*60);
  591. ht = total / 3600;
  592. mt = (total - ht*3600) / 60;
  593. st = (total - ht*3600 - mt*60);
  594. sprintf(buffer, "%.2d:%.2d:%.2d / %.2d:%.2d:%.2d", h, m, s, ht, mt, st);
  595. TextOut(ddc, 3, 16, buffer, strlen(buffer));
  596. SelectObject(ddc, (HGDIOBJ) oldFont);
  597. DeleteObject((HGDIOBJ)font);
  598. BitBlt(hdc, 17, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), 106, 28, ddc, 0, 0, SRCCOPY);
  599. DeleteObject((HGDIOBJ) buff);
  600. DeleteDC(bdc);
  601. DeleteDC(ddc);
  602. ReleaseDC(hwnd, hdc);
  603. }
  604. return 0;
  605. }
  606. int   Skin::DrawBufferingState(HWND hwnd, DWORD state)
  607. {
  608. HDC          hdc, bdc;
  609. int          sizeX, sizeY;
  610. RECT         clientRect;
  611. HFONT        font, oldFont;
  612. if(hwnd && state > 0) {
  613. GetClientRect(hwnd, &clientRect);
  614. sizeX = clientRect.right - clientRect.left;
  615. sizeY = clientRect.bottom - clientRect.top;
  616. hdc  = GetDC(hwnd);
  617. bdc  = CreateCompatibleDC(hdc);
  618. SelectObject(bdc, this->skin);
  619. BitBlt(hdc, 17, 280 + (sizeY - DEFAULT_SKIN_HEIGHT), 106, 28, bdc, 17, 280, SRCCOPY);
  620. 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");
  621. oldFont = (HFONT) SelectObject(hdc, (HGDIOBJ) font);
  622. SetBkMode(hdc, TRANSPARENT);
  623. TextOut(hdc, 20, 282 + (sizeY - DEFAULT_SKIN_HEIGHT), "Buffering...", 12);
  624. SelectObject(hdc, (HGDIOBJ) oldFont);
  625. DeleteObject((HGDIOBJ)font);
  626. MoveToEx(hdc, 20, 295 + (sizeY - DEFAULT_SKIN_HEIGHT), NULL);
  627. LineTo(hdc, 120, 295 + (sizeY - DEFAULT_SKIN_HEIGHT));
  628. LineTo(hdc, 120, 305 + (sizeY - DEFAULT_SKIN_HEIGHT));
  629. LineTo(hdc, 20, 305 + (sizeY - DEFAULT_SKIN_HEIGHT));
  630. LineTo(hdc, 20, 295 + (sizeY - DEFAULT_SKIN_HEIGHT));
  631. Rectangle(hdc, 20, 295 + (sizeY - DEFAULT_SKIN_HEIGHT), 20 + state, 305 + (sizeY - DEFAULT_SKIN_HEIGHT));
  632. DeleteDC(bdc);
  633. ReleaseDC(hwnd, hdc);
  634. }
  635. return 1;
  636. }
  637. int Skin::UpdateSize(HWND hwnd)
  638. {
  639. int          sizeX, sizeY;
  640. RECT         clientRect;
  641. GetClientRect(hwnd, &clientRect);
  642. sizeX = clientRect.right - clientRect.left;
  643. sizeY = clientRect.bottom - clientRect.top;
  644. this->menuButton.left   = 2;
  645. this->menuButton.right  = 14;
  646. this->menuButton.top    = 3;
  647. this->menuButton.bottom = 14;
  648. this->minimizeButton.left   = 266 + (sizeX - DEFAULT_SKIN_WIDTH);
  649. this->minimizeButton.right  = 278 + (sizeX - DEFAULT_SKIN_WIDTH);
  650. this->minimizeButton.top    = 3;
  651. this->minimizeButton.bottom = 14;
  652. this->closeButton.left   = 283 + (sizeX - DEFAULT_SKIN_WIDTH);
  653. this->closeButton.right  = 295 + (sizeX - DEFAULT_SKIN_WIDTH);
  654. this->closeButton.top    = 3;
  655. this->closeButton.bottom = 14;
  656. this->rewindButton.left   = 15;
  657. this->rewindButton.right  = 15+29;
  658. this->rewindButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  659. this->rewindButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  660. this->stopButton.left   = 52;
  661. this->stopButton.right  = 52+29;
  662. this->stopButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  663. this->stopButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  664. this->playButton.left   = 89;
  665. this->playButton.right  = 89+29;
  666. this->playButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  667. this->playButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  668. this->pauseButton.left   = 126;
  669. this->pauseButton.right  = 126+29;
  670. this->pauseButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  671. this->pauseButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  672. this->forwardButton.left   = 163;
  673. this->forwardButton.right  = 192;
  674. this->forwardButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  675. this->forwardButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  676. this->loadButton.left   = 236 + (sizeX - DEFAULT_SKIN_WIDTH);
  677. this->loadButton.right  = 236 + 44 + (sizeX - DEFAULT_SKIN_WIDTH);
  678. this->loadButton.top    = 343 + (sizeY - DEFAULT_SKIN_HEIGHT);
  679. this->loadButton.bottom = 360 + (sizeY - DEFAULT_SKIN_HEIGHT);
  680. this->resizeButton.left   = 282 + (sizeX - DEFAULT_SKIN_WIDTH);
  681. this->resizeButton.right  = 282 + 15 + (sizeX - DEFAULT_SKIN_WIDTH);
  682. this->resizeButton.top    = 357 + (sizeY - DEFAULT_SKIN_HEIGHT);
  683. this->resizeButton.bottom = 357 + 15 + (sizeY - DEFAULT_SKIN_HEIGHT);
  684. this->progressBar.left   = 12;
  685. this->progressBar.right  = 281 + (sizeX - DEFAULT_SKIN_WIDTH);
  686. this->progressBar.top    = 325 + (sizeY - DEFAULT_SKIN_HEIGHT);
  687. this->progressBar.bottom = 332 + (sizeY - DEFAULT_SKIN_HEIGHT);
  688. this->volumeBar.left   = 212 + (sizeX - DEFAULT_SKIN_WIDTH);
  689. this->volumeBar.right  = 273 + (sizeX - DEFAULT_SKIN_WIDTH);
  690. this->volumeBar.top    = 296 + (sizeY - DEFAULT_SKIN_HEIGHT);
  691. this->volumeBar.bottom = 304 + (sizeY - DEFAULT_SKIN_HEIGHT);
  692. SetVolume(hwnd, this->volume);
  693. SetProgress(hwnd, this->progress);
  694. return 1;
  695. }
  696. int Skin::SetActionStart(HWND hwnd, int action)
  697. {
  698. HDC          hdc, bdc;
  699. hdc = GetDC(hwnd);
  700. bdc = CreateCompatibleDC(hdc);
  701.  
  702. if(hdc == NULL || bdc == NULL) {
  703. return 0;
  704. }
  705. SelectObject(bdc, this->controls);
  706. switch(action) {
  707. case ACTION_REWIND:
  708. BitBlt(hdc, rewindButton.left, rewindButton.top, (rewindButton.right - rewindButton.left), (rewindButton.bottom - rewindButton.top),
  709.    bdc, 2, 26, SRCCOPY);
  710. break;
  711. case ACTION_STOP:
  712. BitBlt(hdc, stopButton.left, stopButton.top, (stopButton.right - stopButton.left), (stopButton.bottom - stopButton.top),
  713.    bdc, 33, 26, SRCCOPY);
  714. break;
  715. case ACTION_PLAY:
  716. BitBlt(hdc, playButton.left, playButton.top, (playButton.right - playButton.left), (playButton.bottom - playButton.top),
  717.    bdc, 64, 26, SRCCOPY);
  718. break;
  719. case ACTION_PAUSE:
  720. BitBlt(hdc, pauseButton.left, pauseButton.top, (pauseButton.right - pauseButton.left), (pauseButton.bottom - pauseButton.top),
  721.    bdc, 95, 26, SRCCOPY);
  722. break;
  723. case ACTION_FORWARD:
  724. BitBlt(hdc, forwardButton.left, forwardButton.top, (forwardButton.right - forwardButton.left), (forwardButton.bottom - forwardButton.top),
  725.    bdc, 126, 26, SRCCOPY);
  726. break;
  727. case ACTION_LOAD:
  728. BitBlt(hdc, loadButton.left, loadButton.top, (loadButton.right - loadButton.left), (loadButton.bottom - loadButton.top),
  729.    bdc, 157, 26, SRCCOPY);
  730. break;
  731. default:
  732. break;
  733. }
  734. DeleteDC(bdc);
  735. ReleaseDC(hwnd, hdc);
  736. return 1;
  737. }
  738. int Skin::SetActionEnd(HWND hwnd, int action)
  739. {
  740. HDC          hdc, bdc;
  741. hdc = GetDC(hwnd);
  742. bdc = CreateCompatibleDC(hdc);
  743.  
  744. if(hdc == NULL || bdc == NULL) {
  745. return 0;
  746. }
  747. SelectObject(bdc, this->skin);
  748. switch(action) {
  749. case ACTION_REWIND:
  750. BitBlt(hdc, rewindButton.left, rewindButton.top, (rewindButton.right - rewindButton.left), (rewindButton.bottom - rewindButton.top),
  751.    bdc, 15, 343, SRCCOPY);
  752. break;
  753. case ACTION_STOP:
  754. BitBlt(hdc, stopButton.left, stopButton.top, (stopButton.right - stopButton.left), (stopButton.bottom - stopButton.top),
  755.    bdc, 52, 343, SRCCOPY);
  756. break;
  757. case ACTION_PLAY:
  758. BitBlt(hdc, playButton.left, playButton.top, (playButton.right - playButton.left), (playButton.bottom - playButton.top),
  759.    bdc, 89, 343, SRCCOPY);
  760. break;
  761. case ACTION_PAUSE:
  762. BitBlt(hdc, pauseButton.left, pauseButton.top, (pauseButton.right - pauseButton.left), (pauseButton.bottom - pauseButton.top),
  763.    bdc, 126, 343, SRCCOPY);
  764. break;
  765. case ACTION_FORWARD:
  766. BitBlt(hdc, forwardButton.left, forwardButton.top, (forwardButton.right - forwardButton.left), (forwardButton.bottom - forwardButton.top),
  767.    bdc, 163, 343, SRCCOPY);
  768. break;
  769. case ACTION_LOAD:
  770. BitBlt(hdc, loadButton.left, loadButton.top, (loadButton.right - loadButton.left), (loadButton.bottom - loadButton.top),
  771.    bdc, 236, 343, SRCCOPY);
  772. break;
  773. default:
  774. break;
  775. }
  776. DeleteDC(bdc);
  777. ReleaseDC(hwnd, hdc);
  778. return 1;
  779. }
  780. int Skin::GetAction(int x, int y)
  781. {
  782. if(isInsideRect(x, y, this->menuButton))
  783. return ACTION_MENU;
  784. if(isInsideRect(x, y, this->minimizeButton))
  785. return ACTION_MINIMIZE;
  786. if(isInsideRect(x, y, this->closeButton))
  787. return ACTION_CLOSE;
  788. if(isInsideRect(x, y, this->rewindButton))
  789. return ACTION_REWIND;
  790. if(isInsideRect(x, y, this->stopButton))
  791. return ACTION_STOP;
  792. if(isInsideRect(x, y, this->playButton))
  793. return ACTION_PLAY;
  794. if(isInsideRect(x, y, this->pauseButton))
  795. return ACTION_PAUSE;
  796. if(isInsideRect(x, y, this->forwardButton))
  797. return ACTION_FORWARD;
  798. if(isInsideRect(x, y, this->loadButton))
  799. return ACTION_LOAD;
  800. if(isInsideRect(x, y, this->resizeButton))
  801. return ACTION_RESIZE;
  802. if(isInsideRect(x, y, this->volumeCursor))
  803. return ACTION_VOLUME_CURSOR;
  804. if(isInsideRect(x, y, this->progressCursor))
  805. return ACTION_PROGRESS_CURSOR;
  806. if(isInsideRect(x, y, this->volumeBar))
  807. return ACTION_VOLUME_BAR;
  808. if(isInsideRect(x, y, this->progressBar))
  809. return ACTION_PROGRESS_BAR;
  810. return ACTION_NONE;
  811. }