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

VC书籍

开发平台:

Visual C++

  1. #include "Resizer.h"
  2. aspect_ratio_factors_t aspectRatios[] = {
  3. {1,  1},
  4. {1,  1},
  5. {4,  3},
  6. {16, 9},
  7. {1,  1},
  8. };
  9. Resizer::Resizer() {
  10. this->lastPt.x = -1;
  11. this->lastPt.y = -1;
  12. }
  13. Resizer::~Resizer() {
  14. }
  15. void Resizer::Start(POINT *pt, DWORD originalWidth, DWORD originalHeight) {
  16. this->lastPt.x = -1;
  17. this->lastPt.y = -1;
  18. this->originalWidth  = originalWidth;
  19. this->originalHeight = originalHeight;
  20. }
  21. void Resizer::DrawFree(HWND hwnd, POINT *pt1) {
  22. POINT p, pt;
  23. RECT  rect;
  24. HPEN  pen, oldPen;
  25. HDC   dc;
  26. int   oldMode;
  27. pt.x = pt1->x;
  28. pt.y = pt1->y;
  29. GetClientRect(hwnd, &rect);
  30. p.x = rect.left;
  31. p.y = rect.top;
  32. ClientToScreen(hwnd, &p);
  33. dc = GetDC(NULL);
  34. pen    = CreatePen(PS_SOLID, 2, 0);
  35. oldPen = (HPEN) SelectObject(dc, pen);
  36. oldMode = SetROP2(dc, R2_NOT);
  37. if(this->lastPt.x != -1 && this->lastPt.y != -1) {
  38. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  39. LineTo(dc, this->lastPt.x, p.y + 2);
  40. LineTo(dc, this->lastPt.x, this->lastPt.y);
  41. LineTo(dc, p.x + 2, this->lastPt.y);
  42. LineTo(dc, p.x + 2, p.y + 2);
  43. }
  44. if(pt1->x > 32768 || pt1->y > 32768) {
  45. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  46. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  47. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_HEIGHT);
  48. LineTo(dc, p.x + 2, p.y + DEFAULT_SKIN_HEIGHT);
  49. LineTo(dc, p.x + 2, p.y + 2);
  50. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  51. this->lastPt.y = p.y + DEFAULT_SKIN_HEIGHT;
  52. goto end;
  53. }
  54. ClientToScreen(hwnd, &pt);
  55. if((pt.x - p.x) >= DEFAULT_SKIN_WIDTH && (pt.y - p.y) >= DEFAULT_SKIN_HEIGHT) {
  56. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  57. LineTo(dc, pt.x + 5, p.y + 2);
  58. LineTo(dc, pt.x + 5, pt.y + 5);
  59. LineTo(dc, p.x + 2,  pt.y + 5);
  60. LineTo(dc, p.x + 2, p.y + 2);
  61. this->lastPt.x = pt.x + 5;
  62. this->lastPt.y = pt.y + 5;
  63. }
  64. else {
  65. if((pt.x - p.x) >= DEFAULT_SKIN_WIDTH) {
  66. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  67. LineTo(dc, pt.x + 5, p.y + 2);
  68. LineTo(dc, pt.x + 5, p.y + DEFAULT_SKIN_HEIGHT);
  69. LineTo(dc, p.x + 2,  p.y + DEFAULT_SKIN_HEIGHT);
  70. LineTo(dc, p.x + 2, p.y + 2);
  71. this->lastPt.x = pt.x + 5;
  72. this->lastPt.y = p.y + DEFAULT_SKIN_HEIGHT;
  73. }
  74. else {
  75. if((pt.y - p.y) >= DEFAULT_SKIN_HEIGHT) {
  76. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  77. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  78. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, pt.y + 5);
  79. LineTo(dc, p.x + 2, pt.y + 5);
  80. LineTo(dc, p.x + 2, p.y + 2);
  81. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  82. this->lastPt.y = pt.y + 5;
  83. }
  84. else {
  85. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  86. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  87. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_HEIGHT);
  88. LineTo(dc, p.x + 2, p.y + DEFAULT_SKIN_HEIGHT);
  89. LineTo(dc, p.x + 2, p.y + 2);
  90. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  91. this->lastPt.y = p.y + DEFAULT_SKIN_HEIGHT;
  92. }
  93. }
  94. }
  95. end:
  96. SetROP2(dc, oldMode);
  97. SelectObject(dc, oldPen);
  98. DeleteObject(pen);
  99. ReleaseDC(NULL, dc);
  100. }
  101. void Resizer::DrawOriginal(HWND hwnd, POINT *pt1)
  102. {
  103. POINT p, pt;
  104. RECT  rect;
  105. HPEN  pen, oldPen;
  106. HDC   dc;
  107. int   oldMode;
  108. pt.x = pt1->x;
  109. pt.y = pt1->y;
  110. GetClientRect(hwnd, &rect);
  111. p.x = rect.left;
  112. p.y = rect.top;
  113. ClientToScreen(hwnd, &p);
  114. dc = GetDC(NULL);
  115. pen    = CreatePen(PS_SOLID, 2, 0);
  116. oldPen = (HPEN) SelectObject(dc, pen);
  117. oldMode = SetROP2(dc, R2_NOT);
  118. if(this->lastPt.x != -1 && this->lastPt.y != -1) {
  119. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  120. LineTo(dc, this->lastPt.x, p.y + 2);
  121. LineTo(dc, this->lastPt.x, this->lastPt.y);
  122. LineTo(dc, p.x + 2, this->lastPt.y);
  123. LineTo(dc, p.x + 2, p.y + 2);
  124. }
  125. if(pt1->x > 32768 || pt1->y > 32768) {
  126. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  127. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  128. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*this->originalHeight/this->originalWidth + 115 + 22);
  129. LineTo(dc, p.x + 2, p.y + DEFAULT_SKIN_WIDTH*this->originalHeight/this->originalWidth + 115 + 22);
  130. LineTo(dc, p.x + 2, p.y + 2);
  131. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  132. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*this->originalHeight/this->originalWidth + 115 + 22;
  133. goto endTV;
  134. }
  135. ClientToScreen(hwnd, &pt);
  136. if((pt.x - p.x) >= DEFAULT_SKIN_WIDTH) {
  137. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  138. LineTo(dc, pt.x + 5, p.y + 2);
  139. LineTo(dc, pt.x + 5, p.y + (pt.x - p.x - 10)*this->originalHeight/this->originalWidth + 115 + 22);
  140. LineTo(dc, p.x + 2,  p.y + (pt.x - p.x - 10)*this->originalHeight/this->originalWidth + 115 + 22);
  141. LineTo(dc, p.x + 2, p.y + 2);
  142. this->lastPt.x = pt.x + 5;
  143. this->lastPt.y = p.y + (pt.x - p.x - 10)*this->originalHeight/this->originalWidth + 115 + 22;
  144. }
  145. else {
  146. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  147. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  148. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*this->originalHeight/this->originalWidth + 115 + 22);
  149. LineTo(dc, p.x + 2,  p.y + DEFAULT_SKIN_WIDTH*this->originalHeight/this->originalWidth + 115 + 22);
  150. LineTo(dc, p.x + 2, p.y + 2);
  151. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  152. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*this->originalHeight/this->originalWidth + 115 + 22;
  153. }
  154. endTV:
  155. SetROP2(dc, oldMode);
  156. SelectObject(dc, oldPen);
  157. DeleteObject(pen);
  158. ReleaseDC(NULL, dc);
  159. }
  160. void Resizer::DrawTV(HWND hwnd, POINT *pt1)
  161. {
  162. POINT p, pt;
  163. RECT  rect;
  164. HPEN  pen, oldPen;
  165. HDC   dc;
  166. int   oldMode;
  167. pt.x = pt1->x;
  168. pt.y = pt1->y;
  169. GetClientRect(hwnd, &rect);
  170. p.x = rect.left;
  171. p.y = rect.top;
  172. ClientToScreen(hwnd, &p);
  173. dc = GetDC(NULL);
  174. pen    = CreatePen(PS_SOLID, 2, 0);
  175. oldPen = (HPEN) SelectObject(dc, pen);
  176. oldMode = SetROP2(dc, R2_NOT);
  177. if(this->lastPt.x != -1 && this->lastPt.y != -1) {
  178. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  179. LineTo(dc, this->lastPt.x, p.y + 2);
  180. LineTo(dc, this->lastPt.x, this->lastPt.y);
  181. LineTo(dc, p.x + 2, this->lastPt.y);
  182. LineTo(dc, p.x + 2, p.y + 2);
  183. }
  184. if(pt1->x > 32768 || pt1->y > 32768) {
  185. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  186. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  187. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*3/4 + 115 + 22);
  188. LineTo(dc, p.x + 2, p.y + DEFAULT_SKIN_WIDTH*3/4 + 115 + 22);
  189. LineTo(dc, p.x + 2, p.y + 2);
  190. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  191. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*3/4 + 115 + 22;
  192. goto endTV;
  193. }
  194. ClientToScreen(hwnd, &pt);
  195. if((pt.x - p.x) >= DEFAULT_SKIN_WIDTH) {
  196. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  197. LineTo(dc, pt.x + 5, p.y + 2);
  198. LineTo(dc, pt.x + 5, p.y + (pt.x - p.x - 10)*3/4 + 115 + 22);
  199. LineTo(dc, p.x + 2,  p.y + (pt.x - p.x - 10)*3/4 + 115 + 22);
  200. LineTo(dc, p.x + 2, p.y + 2);
  201. this->lastPt.x = pt.x + 5;
  202. this->lastPt.y = p.y + (pt.x - p.x - 10)*3/4 + 115 + 22;
  203. }
  204. else {
  205. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  206. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  207. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*3/4 + 115 + 22);
  208. LineTo(dc, p.x + 2,  p.y + DEFAULT_SKIN_WIDTH*3/4 + 115 + 22);
  209. LineTo(dc, p.x + 2, p.y + 2);
  210. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  211. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*3/4 + 115 + 22;
  212. }
  213. endTV:
  214. SetROP2(dc, oldMode);
  215. SelectObject(dc, oldPen);
  216. DeleteObject(pen);
  217. ReleaseDC(NULL, dc);
  218. }
  219. void Resizer::DrawWide(HWND hwnd, POINT *pt1)
  220. {
  221. POINT p, pt;
  222. RECT  rect;
  223. HPEN  pen, oldPen;
  224. HDC   dc;
  225. int   oldMode;
  226. pt.x = pt1->x;
  227. pt.y = pt1->y;
  228. GetClientRect(hwnd, &rect);
  229. p.x = rect.left;
  230. p.y = rect.top;
  231. ClientToScreen(hwnd, &p);
  232. dc = GetDC(NULL);
  233. pen    = CreatePen(PS_SOLID, 2, 0);
  234. oldPen = (HPEN) SelectObject(dc, pen);
  235. oldMode = SetROP2(dc, R2_NOT);
  236. if(this->lastPt.x != -1 && this->lastPt.y != -1) {
  237. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  238. LineTo(dc, this->lastPt.x, p.y + 2);
  239. LineTo(dc, this->lastPt.x, this->lastPt.y);
  240. LineTo(dc, p.x + 2, this->lastPt.y);
  241. LineTo(dc, p.x + 2, p.y + 2);
  242. }
  243. if(pt1->x > 32768 || pt1->y > 32768) {
  244. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  245. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  246. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*9/16 + 115 + 22);
  247. LineTo(dc, p.x + 2, p.y + DEFAULT_SKIN_WIDTH*9/16 + 115 + 22);
  248. LineTo(dc, p.x + 2, p.y + 2);
  249. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  250. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*9/16 + 115 + 22;
  251. goto endWide;
  252. }
  253. ClientToScreen(hwnd, &pt);
  254. if((pt.x - p.x) >= DEFAULT_SKIN_WIDTH) {
  255. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  256. LineTo(dc, pt.x + 5, p.y + 2);
  257. LineTo(dc, pt.x + 5, p.y + (pt.x - p.x - 10)*9/16 + 115 + 22);
  258. LineTo(dc, p.x + 2,  p.y + (pt.x - p.x - 10)*9/16 + 115 + 22);
  259. LineTo(dc, p.x + 2, p.y + 2);
  260. this->lastPt.x = pt.x + 5;
  261. this->lastPt.y = p.y + (pt.x - p.x - 10)*9/16 + 115 + 22;
  262. }
  263. else {
  264. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  265. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  266. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*9/16 + 115 + 22);
  267. LineTo(dc, p.x + 2,  p.y + DEFAULT_SKIN_WIDTH*9/16 + 115 + 22);
  268. LineTo(dc, p.x + 2, p.y + 2);
  269. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  270. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*9/16 + 115 + 22;
  271. }
  272. endWide:
  273. SetROP2(dc, oldMode);
  274. SelectObject(dc, oldPen);
  275. DeleteObject(pen);
  276. ReleaseDC(NULL, dc);
  277. }
  278. void Resizer::DrawCustom(HWND hwnd, POINT *pt1)
  279. {
  280. POINT p, pt;
  281. RECT  rect;
  282. HPEN  pen, oldPen;
  283. HDC   dc;
  284. int   oldMode;
  285. pt.x = pt1->x;
  286. pt.y = pt1->y;
  287. GetClientRect(hwnd, &rect);
  288. p.x = rect.left;
  289. p.y = rect.top;
  290. ClientToScreen(hwnd, &p);
  291. dc = GetDC(NULL);
  292. pen    = CreatePen(PS_SOLID, 2, 0);
  293. oldPen = (HPEN) SelectObject(dc, pen);
  294. oldMode = SetROP2(dc, R2_NOT);
  295. if(this->lastPt.x != -1 && this->lastPt.y != -1) {
  296. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  297. LineTo(dc, this->lastPt.x, p.y + 2);
  298. LineTo(dc, this->lastPt.x, this->lastPt.y);
  299. LineTo(dc, p.x + 2, this->lastPt.y);
  300. LineTo(dc, p.x + 2, p.y + 2);
  301. }
  302. if(pt1->x > 32768 || pt1->y > 32768) {
  303. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  304. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  305. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22);
  306. LineTo(dc, p.x + 2, p.y + DEFAULT_SKIN_WIDTH*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22);
  307. LineTo(dc, p.x + 2, p.y + 2);
  308. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  309. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22;
  310. goto endCustom;
  311. }
  312. ClientToScreen(hwnd, &pt);
  313. if((pt.x - p.x) >= DEFAULT_SKIN_WIDTH) {
  314. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  315. LineTo(dc, pt.x + 5, p.y + 2);
  316. LineTo(dc, pt.x + 5, p.y + (pt.x - p.x - 10)*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22);
  317. LineTo(dc, p.x + 2,  p.y + (pt.x - p.x - 10)*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22);
  318. LineTo(dc, p.x + 2, p.y + 2);
  319. this->lastPt.x = pt.x + 5;
  320. this->lastPt.y = p.y + (pt.x - p.x - 10)*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22;
  321. }
  322. else {
  323. MoveToEx(dc, p.x + 2, p.y + 2, NULL);
  324. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + 2);
  325. LineTo(dc, p.x + DEFAULT_SKIN_WIDTH, p.y + DEFAULT_SKIN_WIDTH*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22);
  326. LineTo(dc, p.x + 2,  p.y + DEFAULT_SKIN_WIDTH*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22);
  327. LineTo(dc, p.x + 2, p.y + 2);
  328. this->lastPt.x = p.x + DEFAULT_SKIN_WIDTH;
  329. this->lastPt.y = p.y + DEFAULT_SKIN_WIDTH*aspectRatios[ASPECT_RATIO_CUSTOM].yFactor/aspectRatios[ASPECT_RATIO_CUSTOM].xFactor + 115 + 22;
  330. }
  331. endCustom:
  332. SetROP2(dc, oldMode);
  333. SelectObject(dc, oldPen);
  334. DeleteObject(pen);
  335. ReleaseDC(NULL, dc);
  336. }
  337. void Resizer::Draw(HWND hwnd, POINT *pt1, aspect_ratio_t aspectRatio) {
  338. switch(aspectRatio) {
  339. case ASPECT_RATIO_FREE:
  340. this->DrawFree(hwnd, pt1);
  341. break;
  342. case ASPECT_RATIO_ORIGINAL:
  343. this->DrawOriginal(hwnd, pt1);
  344. break;
  345. case ASPECT_RATIO_TV:
  346. this->DrawTV(hwnd, pt1);
  347. break;
  348. case ASPECT_RATIO_WIDE:
  349. this->DrawWide(hwnd, pt1);
  350. break;
  351. case ASPECT_RATIO_CUSTOM:
  352. this->DrawCustom(hwnd, pt1);
  353. break;
  354. }
  355. }
  356. POINT *Resizer::GetLastPoint()
  357. {
  358. return &this->lastPt;
  359. }
  360. void Resizer::Stop() {
  361. }