DittoWindow.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. #include "stdafx.h"
  2. #include ".\dittowindow.h"
  3. #include "CP_Main.h"
  4. #include "Options.h"
  5. CDittoWindow::CDittoWindow(void)
  6. {
  7. m_lTopBorder = CAPTION_BORDER;
  8. m_lRightBorder = BORDER;
  9. m_lBottomBorder = BORDER;
  10. m_lLeftBorder = BORDER;
  11. m_bMouseOverChevron = false;
  12. m_bMouseDownOnChevron = false;
  13. m_bMouseDownOnClose = false;
  14. m_bMouseOverClose = false;
  15. m_bMouseDownOnCaption = false;
  16. m_bMouseDownOnMinimize = false;
  17. m_bMouseOverMinimize = false;
  18. m_bMouseDownOnMaximize = false;
  19. m_bMouseOverMaximize = false;
  20. m_bDrawClose = true;
  21. m_bDrawChevron = true;
  22. m_bDrawMaximize = true;
  23. m_bDrawMinimize = true;
  24. m_bMinimized = false;
  25. m_crCloseBT.SetRectEmpty();
  26. m_crChevronBT.SetRectEmpty();
  27. m_crMaximizeBT.SetRectEmpty();
  28. m_crMinimizeBT.SetRectEmpty();
  29. m_CaptionColorLeft = ::GetSysColor(COLOR_ACTIVECAPTION);
  30. m_CaptionColorRight = ::GetSysColor(COLOR_GRADIENTACTIVECAPTION);
  31. }
  32. CDittoWindow::~CDittoWindow(void)
  33. {
  34. }
  35. void CDittoWindow::DoCreate(CWnd *pWnd)
  36. {
  37. m_VertFont.CreateFont(14,0,-900,0,400,FALSE,FALSE,0,ANSI_CHARSET,
  38. OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  39. DEFAULT_PITCH|FF_SWISS, _T("Arial"));
  40. m_HorFont.CreateFont(14,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,
  41. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
  42. DEFAULT_PITCH|FF_SWISS, _T("Arial"));
  43. }
  44. void CDittoWindow::DoNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
  45. {
  46. //Decrease the client area
  47. lpncsp->rgrc[0].left+= m_lLeftBorder;
  48. lpncsp->rgrc[0].top+= m_lTopBorder;
  49. lpncsp->rgrc[0].right-= m_lRightBorder;
  50. lpncsp->rgrc[0].bottom-= m_lBottomBorder;
  51. }
  52. UINT CDittoWindow::DoNcHitTest(CWnd *pWnd, CPoint point)
  53. {
  54. CRect crWindow;
  55. pWnd->GetWindowRect(crWindow);
  56. if(crWindow.PtInRect(point) == false)
  57. {
  58. return -1;
  59. }
  60. if(m_bMinimized == false)
  61. {
  62. if ((point.y < crWindow.top + BORDER * 2) &&
  63. (point.x < crWindow.left + BORDER * 2))
  64. return HTTOPLEFT;
  65. else if ((point.y < crWindow.top + BORDER * 2) &&
  66. (point.x > crWindow.right - BORDER * 2))
  67. return HTTOPRIGHT;
  68. else if ((point.y > crWindow.bottom - BORDER * 2) &&
  69. (point.x > crWindow.right - BORDER * 2))
  70. return HTBOTTOMRIGHT;
  71. else if ((point.y > crWindow.bottom - BORDER * 2) &&
  72. (point.x < crWindow.left + BORDER * 2))
  73. return HTBOTTOMLEFT;
  74. }
  75. if((((m_lTopBorder == CAPTION_BORDER) || (m_lBottomBorder == CAPTION_BORDER)) &&
  76. (m_bMinimized)) == false)
  77. {
  78. if (point.y < crWindow.top + BORDER * 2)
  79. return HTTOP;
  80. if (point.y > crWindow.bottom - BORDER * 2)
  81. return HTBOTTOM;
  82. }
  83. if((((m_lLeftBorder == CAPTION_BORDER) || (m_lRightBorder == CAPTION_BORDER)) &&
  84. (m_bMinimized)) == false)
  85. {
  86. if (point.x > crWindow.right - BORDER * 2)
  87. return HTRIGHT;
  88. if (point.x < crWindow.left + BORDER * 2)
  89. return HTLEFT;
  90. }
  91. if(m_lRightBorder == CAPTION_BORDER)
  92. {
  93. if (point.x > crWindow.right - m_lRightBorder)
  94. return HTCAPTION;
  95. }
  96. else if(m_lBottomBorder == CAPTION_BORDER)
  97. {
  98. if(point.y > crWindow.bottom - m_lBottomBorder)
  99. return HTCAPTION;
  100. }
  101. else if(m_lLeftBorder == CAPTION_BORDER)
  102. {
  103. if (point.x < crWindow.left + m_lLeftBorder)
  104. return HTCAPTION;
  105. }
  106. else if(m_lTopBorder == CAPTION_BORDER)
  107. {
  108. if (point.y < crWindow.top + m_lTopBorder)
  109. return HTCAPTION;
  110. }
  111. return -1;
  112. }
  113. void CDittoWindow::DoNcPaint(CWnd *pWnd)
  114. {
  115. CWindowDC dc(pWnd);
  116. CRect rcFrame;
  117. pWnd->GetWindowRect(rcFrame);
  118. pWnd->ScreenToClient(rcFrame);
  119. CRect rc;
  120. pWnd->GetClientRect(rc);
  121. pWnd->ClientToScreen(rc);
  122. long lWidth = rcFrame.Width();
  123. // Draw the window border
  124. CRect rcBorder(0, 0, lWidth, rcFrame.Height());
  125. dc.Draw3dRect(rcBorder, m_CaptionColorLeft, m_CaptionColorLeft);
  126. rcBorder.DeflateRect(1, 1, 1, 1);
  127. dc.Draw3dRect(rcBorder, m_CaptionColorLeft, m_CaptionColorLeft);
  128. rcBorder.InflateRect(1, 1, 1, 1);
  129. BOOL bVertical = FALSE;
  130. if(m_lRightBorder == CAPTION_BORDER)
  131. {
  132. m_crCloseBT.SetRect(rcBorder.right - m_lRightBorder + 2, 7, rcBorder.right - m_lRightBorder + 14, 18);
  133. m_crChevronBT.SetRect(rcBorder.right - m_lRightBorder + 2, rcBorder.bottom - 18, rcBorder.right - m_lRightBorder + 14, rcBorder.bottom - 7);
  134. m_crMaximizeBT = m_crCloseBT;
  135. m_crMaximizeBT.top += m_crCloseBT.Height() + 5;
  136. m_crMaximizeBT.bottom += m_crCloseBT.Height() + 5;
  137. m_crMinimizeBT = m_crMaximizeBT;
  138. m_crMinimizeBT.top += m_crCloseBT.Height() + 5;
  139. m_crMinimizeBT.bottom += m_crCloseBT.Height() + 5;
  140. rcBorder.left = rcBorder.right - m_lRightBorder;
  141. bVertical = TRUE;
  142. }
  143. else if(m_lLeftBorder == CAPTION_BORDER)
  144. {
  145. m_crCloseBT.SetRect(2, 7, 14, 18);
  146. m_crChevronBT.SetRect(2, rcBorder.bottom - 18, 14, rcBorder.bottom - 7);
  147. m_crMaximizeBT = m_crCloseBT;
  148. m_crMaximizeBT.top += m_crCloseBT.Height() + 5;
  149. m_crMaximizeBT.bottom += m_crCloseBT.Height() + 5;
  150. m_crMinimizeBT = m_crMaximizeBT;
  151. m_crMinimizeBT.top += m_crCloseBT.Height() + 5;
  152. m_crMinimizeBT.bottom += m_crCloseBT.Height() + 5;
  153. rcBorder.right = rcBorder.left + m_lLeftBorder;
  154. bVertical = TRUE;
  155. }
  156. else if(m_lTopBorder == CAPTION_BORDER)
  157. {
  158. m_crCloseBT.SetRect(rcBorder.right - 18, 3, rcBorder.right - 6, 14);
  159. m_crChevronBT.SetRect(4, 2, 15, 14);
  160. m_crMaximizeBT = m_crCloseBT;
  161. m_crMaximizeBT.left -= m_crCloseBT.Width() + 5;
  162. m_crMaximizeBT.right -= m_crCloseBT.Width() + 5;
  163. m_crMinimizeBT = m_crMaximizeBT;
  164. m_crMinimizeBT.left -= m_crCloseBT.Width() + 5;
  165. m_crMinimizeBT.right -= m_crCloseBT.Width() + 5;
  166. rcBorder.bottom = rcBorder.top + m_lTopBorder;
  167. bVertical = FALSE;
  168. }
  169. else if(m_lBottomBorder == CAPTION_BORDER)
  170. {
  171. m_crCloseBT.SetRect(rcBorder.right - 18, rcBorder.bottom - 13, rcBorder.right - 6, rcBorder.bottom - 2);
  172. m_crChevronBT.SetRect(4, rcBorder.bottom - 14, 15, rcBorder.bottom - 2);
  173. m_crMaximizeBT = m_crCloseBT;
  174. m_crMaximizeBT.left -= m_crCloseBT.Width() + 5;
  175. m_crMaximizeBT.right -= m_crCloseBT.Width() + 5;
  176. m_crMinimizeBT = m_crMaximizeBT;
  177. m_crMinimizeBT.left -= m_crCloseBT.Width() + 5;
  178. m_crMinimizeBT.right -= m_crCloseBT.Width() + 5;
  179. rcBorder.top = rcBorder.bottom - m_lBottomBorder;
  180. bVertical = FALSE;
  181. }
  182. if(m_bDrawClose == false)
  183. {
  184. m_crCloseBT.SetRectEmpty();
  185. }
  186. if(m_bDrawChevron == false)
  187. {
  188. m_crChevronBT.SetRectEmpty();
  189. }
  190. if(m_bDrawMaximize == false)
  191. {
  192. m_crMaximizeBT.SetRectEmpty();
  193. }
  194. if(m_bDrawMinimize == false)
  195. {
  196. m_crMinimizeBT.SetRectEmpty();
  197. }
  198. float gR = 0;
  199. float gG = 0;
  200. float gB = 0;
  201. float sR = GetRValue(m_CaptionColorLeft);
  202. float sG = GetGValue(m_CaptionColorLeft);
  203. float sB = GetBValue(m_CaptionColorLeft);
  204. float eR = GetRValue(m_CaptionColorRight);
  205. float eG = GetGValue(m_CaptionColorRight);
  206. float eB = GetBValue(m_CaptionColorRight);
  207. bool bGradient = true;
  208. if(m_CaptionColorLeft == m_CaptionColorRight)
  209. {
  210. gR = eR;
  211. gG = eG;
  212. gB = eB;
  213. bGradient = false;
  214. }
  215. else if(bVertical)
  216. {
  217. gR = (eR - sR) / rcBorder.Height();
  218. gG = (eG - sG) / rcBorder.Height();
  219. gB = (eB - sB) / rcBorder.Height();
  220. }
  221. else
  222. {
  223. gR = (eR - sR) / rcBorder.Width();
  224. gG = (eG - sG) / rcBorder.Width();
  225. gB = (eB - sB) / rcBorder.Width();
  226. }
  227. HBRUSH color;
  228. long lHeight = rcBorder.Height();
  229. CRect cr = rcBorder;
  230. long lCount = rcBorder.Width();
  231. if(bVertical)
  232. lCount = lHeight;
  233. for(int i = 0; i < lCount; i++)
  234. {
  235. if(bVertical)
  236. {
  237. cr.top = i;
  238. cr.bottom = i + 1;
  239. }
  240. else
  241. {
  242. cr.left = i;
  243. cr.right = i + 1;
  244. }
  245. if(bGradient || i == 0)
  246. {
  247. color = CreateSolidBrush(RGB(int(gR * (float) i + gR),
  248. int(gG * (float) i + sG),
  249. int(gB * (float) i + sB)));
  250. }
  251. ::FillRect(dc, &cr, color);
  252. if(bGradient)
  253. DeleteObject(color);
  254. }
  255. if(bGradient == false)
  256. DeleteObject(color);
  257. int nOldBKMode = dc.SetBkMode(TRANSPARENT);
  258. COLORREF oldColor = dc.SetTextColor(RGB(255, 255, 255));
  259. CFont *pOldFont = NULL;
  260. if(bVertical)
  261. pOldFont=dc.SelectObject(&m_VertFont);
  262. else
  263. pOldFont=dc.SelectObject(&m_HorFont);
  264. CString csText;
  265. pWnd->GetWindowText(csText);
  266. if(m_lRightBorder == CAPTION_BORDER)
  267. {
  268. int nTop = 0;
  269. if(m_bDrawClose)
  270. nTop += 20;
  271. if(m_bDrawMaximize)
  272. nTop += 20;
  273. if(m_bDrawMaximize)
  274. nTop += 20;
  275. cr.SetRect(rcBorder.right-1, nTop, rcBorder.right - 13, rcBorder.bottom - 20);
  276. dc.DrawText(csText, cr, DT_SINGLELINE);
  277. }
  278. else if(m_lBottomBorder == CAPTION_BORDER)
  279. {
  280. cr.SetRect(20, rcBorder.bottom - 15, rcBorder.right - 20, rcBorder.bottom - 1);
  281. dc.DrawText(csText, cr, DT_SINGLELINE);
  282. }
  283. else if(m_lLeftBorder == CAPTION_BORDER)
  284. {
  285. int nTop = 0;
  286. if(m_bDrawClose)
  287. nTop += 20;
  288. if(m_bDrawMaximize)
  289. nTop += 20;
  290. if(m_bDrawMaximize)
  291. nTop += 20;
  292. cr.SetRect(15, nTop, 2, rcBorder.bottom - 20);
  293. dc.DrawText(csText, cr, DT_SINGLELINE);
  294. }
  295. else if(m_lTopBorder == CAPTION_BORDER)
  296. {
  297. cr.SetRect(20, 1, rcBorder.right - 20, 15);
  298. dc.DrawText(csText, cr, DT_SINGLELINE);
  299. }
  300. DrawCloseBtn(dc);
  301. DrawChevronBtn(dc);
  302. DrawMaximizeBtn(dc);
  303. DrawMinimizeBtn(dc);
  304. dc.SelectObject(pOldFont);
  305. dc.SetTextColor(oldColor);
  306. dc.SetBkMode(nOldBKMode);
  307. }
  308. void CDittoWindow::DoSetRegion(CWnd *pWnd)
  309. {
  310. //Create the region for drawing the rounded top edge
  311. CRect rect;
  312. CRgn rgnRect, rgnRect2, rgnRound, rgnFinalA, rgnFinalB;
  313. pWnd->GetWindowRect(rect);
  314. if((m_lRightBorder == CAPTION_BORDER) ||
  315. (m_lTopBorder == CAPTION_BORDER))
  316. {
  317. rgnRect.CreateRectRgn(0, 0, rect.Width() - 7, rect.Height());
  318. rgnRound.CreateRoundRectRgn(0, 0, rect.Width()+1, rect.Height(), 15, 15);
  319. rgnFinalB.CreateRectRgn(0, 0, 0, 0);
  320. rgnFinalB.CombineRgn(&rgnRect, &rgnRound, RGN_OR);
  321. rgnRect2.CreateRectRgn(0, 7, rect.Width(), rect.Height());
  322. rgnFinalA.CreateRectRgn(0, 0, 0, 0);
  323. rgnFinalA.CombineRgn(&rgnRect2, &rgnFinalB, RGN_OR);
  324. //Set the region
  325. pWnd->SetWindowRgn(rgnFinalA, TRUE);
  326. }
  327. else if(m_lLeftBorder == CAPTION_BORDER)
  328. {
  329. rgnRect.CreateRectRgn(0, 7, rect.Width(), rect.Height());
  330. rgnRound.CreateRoundRectRgn(0, 0, rect.Width(), rect.Height(), 15, 15);
  331. rgnFinalB.CreateRectRgn(0, 0, 0, 0);
  332. rgnFinalB.CombineRgn(&rgnRect, &rgnRound, RGN_OR);
  333. rgnRect2.CreateRectRgn(7, 0, rect.Width(), rect.Height());
  334. rgnFinalA.CreateRectRgn(0, 0, 0, 0);
  335. rgnFinalA.CombineRgn(&rgnRect2, &rgnFinalB, RGN_OR);
  336. pWnd->SetWindowRgn(rgnFinalA, TRUE);
  337. }
  338. else if(m_lBottomBorder == CAPTION_BORDER)
  339. {
  340. rgnRect.CreateRectRgn(0, 0, rect.Width(), rect.Height()-7);
  341. rgnRound.CreateRoundRectRgn(0, 0, rect.Width()+1, rect.Height()+1, 15, 15);
  342. rgnFinalB.CreateRectRgn(0, 0, 0, 0);
  343. rgnFinalB.CombineRgn(&rgnRect, &rgnRound, RGN_OR);
  344. rgnRect2.CreateRectRgn(0, 0, rect.Width()-15, rect.Height());
  345. rgnFinalA.CreateRectRgn(0, 0, 0, 0);
  346. rgnFinalA.CombineRgn(&rgnRect2, &rgnFinalB, RGN_OR);
  347. pWnd->SetWindowRgn(rgnFinalA, TRUE);
  348. }
  349. }
  350. void CDittoWindow::DrawChevronBtn(CWindowDC &dc)
  351. {
  352. if(m_bDrawChevron == false)
  353. {
  354. return;
  355. }
  356. bool bTopOrBottom = false;
  357. int Points[5][8];
  358. int Points2[8][5];
  359. if(((m_lRightBorder == CAPTION_BORDER) && (m_bMinimized == false)) ||
  360. ((m_lLeftBorder == CAPTION_BORDER) && (m_bMinimized)))
  361. {
  362. int nTemp[5][8] =
  363. {
  364. 1,1,0,0,1,1,0,0,
  365. 0,1,1,0,0,1,1,0,
  366. 0,0,1,1,0,0,1,1,
  367. 0,1,1,0,0,1,1,0,
  368. 1,1,0,0,1,1,0,0
  369. };
  370. memcpy(&Points, &nTemp, sizeof(nTemp));
  371. }
  372. else if(((m_lRightBorder == CAPTION_BORDER) && (m_bMinimized)) ||
  373. ((m_lLeftBorder == CAPTION_BORDER) && (m_bMinimized == false)))
  374. {
  375. int nTemp[5][8] =
  376. {
  377. 0,0,1,1,0,0,1,1,
  378. 0,1,1,0,0,1,1,0,
  379. 1,1,0,0,1,1,0,0,
  380. 0,1,1,0,0,1,1,0,
  381. 0,0,1,1,0,0,1,1
  382. };
  383. memcpy(&Points, &nTemp, sizeof(nTemp));
  384. }
  385. else if(((m_lTopBorder == CAPTION_BORDER) && (m_bMinimized == false)) ||
  386. ((m_lBottomBorder == CAPTION_BORDER) && (m_bMinimized)))
  387. {
  388. bTopOrBottom = true;
  389. int nTemp[8][5] =
  390. {
  391. 0,0,1,0,0,
  392. 0,1,1,1,0,
  393. 1,1,0,1,1,
  394. 1,0,0,0,1,
  395. 0,0,1,0,0,
  396. 0,1,1,1,0,
  397. 1,1,0,1,1,
  398. 1,0,0,0,1
  399. };
  400. memcpy(&Points2, &nTemp, sizeof(nTemp));
  401. }
  402. else if(((m_lTopBorder == CAPTION_BORDER) && (m_bMinimized)) ||
  403. ((m_lBottomBorder == CAPTION_BORDER) && (m_bMinimized == false)))
  404. {
  405. bTopOrBottom = true;
  406. int nTemp[8][5] =
  407. {
  408. 1,0,0,0,1,
  409. 1,1,0,1,1,
  410. 0,1,1,1,0,
  411. 0,0,1,0,0,
  412. 1,0,0,0,1,
  413. 1,1,0,1,1,
  414. 0,1,1,1,0,
  415. 0,0,1,0,0
  416. };
  417. memcpy(&Points2, &nTemp, sizeof(nTemp));
  418. }
  419. COLORREF shaddow = RGB(GetRValue(m_CaptionColorLeft) * 1.16, GetGValue(m_CaptionColorLeft) * 1.12, GetBValue(m_CaptionColorLeft) * 1.12);
  420. if(m_bMouseDownOnChevron)
  421. dc.Draw3dRect(m_crChevronBT, shaddow, RGB(255, 255, 255));
  422. else if(m_bMouseOverChevron)
  423. dc.Draw3dRect(m_crChevronBT, RGB(255, 255, 255), shaddow);
  424. if(bTopOrBottom == false)
  425. {
  426. CPoint ptShift = m_crChevronBT.TopLeft();
  427. ptShift.Offset(2, 3);
  428. for (int iRow = 0; iRow < 5; iRow++)
  429. {
  430. for (int iCol = 0; iCol < 8; iCol++)
  431. {
  432. if (Points[iRow][iCol] == 1)
  433. dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
  434. }
  435. }
  436. }
  437. else
  438. {
  439. CPoint ptShift = m_crChevronBT.TopLeft();
  440. ptShift.Offset(3, 2);
  441. for (int iRow = 0; iRow < 8; iRow++)
  442. {
  443. for (int iCol = 0; iCol < 5; iCol++)
  444. {
  445. if (Points2[iRow][iCol] == 1)
  446. dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
  447. }
  448. }
  449. }
  450. }
  451. void CDittoWindow::DrawCloseBtn(CWindowDC &dc)
  452. {
  453. if(m_bDrawClose == false)
  454. {
  455. return;
  456. }
  457. //rows first then columns
  458. int Points[5][6] =
  459. {
  460. 1,1,0,0,1,1,
  461. 0,1,1,1,1,0,
  462. 0,0,1,1,0,0,
  463. 0,1,1,1,1,0,
  464. 1,1,0,0,1,1
  465. };
  466. CPoint ptShift = m_crCloseBT.TopLeft();
  467. ptShift.Offset(3, 3);
  468. if(m_bMouseDownOnClose)
  469. {
  470. dc.Draw3dRect(m_crCloseBT, RGB(255, 255, 255), RGB(255, 255, 255));
  471. CRect cr(m_crCloseBT);
  472. cr.DeflateRect(1, 1, 1, 1);
  473. dc.Draw3dRect(cr, RGB(255, 255, 255), RGB(255, 255, 255));
  474. }
  475. else if(m_bMouseOverClose)
  476. {
  477. dc.Draw3dRect(m_crCloseBT, RGB(255, 255, 255), RGB(255, 255, 255));
  478. }
  479. for (int iRow = 0; iRow < 5; iRow++)
  480. {
  481. for (int iCol = 0; iCol < 6; iCol++)
  482. {
  483. if (Points[iRow][iCol] == 1)
  484. dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
  485. }
  486. }
  487. }
  488. void CDittoWindow::DrawMinimizeBtn(CWindowDC &dc)
  489. {
  490. if(m_bDrawMinimize == false)
  491. {
  492. return;
  493. }
  494. //rows first then columns
  495. int Points[5][6] =
  496. {
  497. 0,0,0,0,0,0,
  498. 0,0,0,0,0,0,
  499. 0,0,0,0,0,0,
  500. 1,1,1,1,1,0,
  501. 1,1,1,1,1,0
  502. };
  503. CPoint ptShift = m_crMinimizeBT.TopLeft();
  504. ptShift.Offset(3, 3);
  505. if(m_bMouseDownOnMinimize)
  506. {
  507. dc.Draw3dRect(m_crMinimizeBT, RGB(255, 255, 255), RGB(255, 255, 255));
  508. CRect cr(m_crMinimizeBT);
  509. cr.DeflateRect(1, 1, 1, 1);
  510. dc.Draw3dRect(cr, RGB(255, 255, 255), RGB(255, 255, 255));
  511. }
  512. else if(m_bMouseOverMinimize)
  513. {
  514. dc.Draw3dRect(m_crMinimizeBT, RGB(255, 255, 255), RGB(255, 255, 255));
  515. }
  516. for (int iRow = 0; iRow < 5; iRow++)
  517. {
  518. for (int iCol = 0; iCol < 6; iCol++)
  519. {
  520. if (Points[iRow][iCol] == 1)
  521. dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
  522. }
  523. }
  524. }
  525. void CDittoWindow::DrawMaximizeBtn(CWindowDC &dc)
  526. {
  527. if(m_bDrawMaximize == false)
  528. {
  529. return;
  530. }
  531. //rows first then columns
  532. int Points[6][7] =
  533. {
  534. 0,0,1,1,1,1,1,
  535. 1,1,1,1,1,1,1,
  536. 1,0,0,0,0,1,1,
  537. 1,0,0,0,0,1,1,
  538. 1,0,0,0,0,1,0,
  539. 1,1,1,1,1,1,0,
  540. };
  541. CPoint ptShift = m_crMaximizeBT.TopLeft();
  542. ptShift.Offset(3, 3);
  543. if(m_bMouseDownOnMaximize)
  544. {
  545. dc.Draw3dRect(m_crMaximizeBT, RGB(255, 255, 255), RGB(255, 255, 255));
  546. CRect cr(m_crMaximizeBT);
  547. cr.DeflateRect(1, 1, 1, 1);
  548. dc.Draw3dRect(cr, RGB(255, 255, 255), RGB(255, 255, 255));
  549. }
  550. else if(m_bMouseOverMaximize)
  551. {
  552. dc.Draw3dRect(m_crMaximizeBT, RGB(255, 255, 255), RGB(255, 255, 255));
  553. }
  554. for (int iRow = 0; iRow < 6; iRow++)
  555. {
  556. for (int iCol = 0; iCol < 7; iCol++)
  557. {
  558. if (Points[iRow][iCol] == 1)
  559. dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
  560. }
  561. }
  562. }
  563. void CDittoWindow::DoNcLButtonDown(CWnd *pWnd, UINT nHitTest, CPoint point)
  564. {
  565. CPoint clPoint(point);
  566. pWnd->ScreenToClient(&clPoint);
  567. clPoint.x += m_lLeftBorder;
  568. clPoint.y += m_lTopBorder;
  569. if(m_crCloseBT.PtInRect(clPoint))
  570. {
  571. pWnd->SetCapture();
  572. m_bMouseDownOnClose = true;
  573. CWindowDC dc(pWnd);
  574. DrawCloseBtn(dc);
  575. }
  576. else if(m_crChevronBT.PtInRect(clPoint))
  577. {
  578. pWnd->SetCapture();
  579. m_bMouseDownOnChevron = true;
  580. CWindowDC dc(pWnd);
  581. DrawChevronBtn(dc);
  582. }
  583. else if(m_crMinimizeBT.PtInRect(clPoint))
  584. {
  585. pWnd->SetCapture();
  586. m_bMouseDownOnMinimize = true;
  587. CWindowDC dc(pWnd);
  588. DrawMinimizeBtn(dc);
  589. }
  590. else if(m_crMaximizeBT.PtInRect(clPoint))
  591. {
  592. pWnd->SetCapture();
  593. m_bMouseDownOnMaximize = true;
  594. CWindowDC dc(pWnd);
  595. DrawMaximizeBtn(dc);
  596. }
  597. else if(m_bMinimized)
  598. {
  599. //MinMaxWindow(FORCE_MAX);
  600. }
  601. }
  602. long CDittoWindow::DoNcLButtonUp(CWnd *pWnd, UINT nHitTest, CPoint point)
  603. {
  604. long lRet = 0;
  605. if(m_bMouseDownOnClose)
  606. {
  607. ReleaseCapture();
  608. m_bMouseDownOnClose = false;
  609. m_bMouseOverClose = false;
  610. DoNcPaint(pWnd);
  611. CPoint clPoint(point);
  612. clPoint.x += m_lLeftBorder;
  613. clPoint.y += m_lTopBorder;
  614. if(m_crCloseBT.PtInRect(clPoint))
  615. {
  616. pWnd->SendMessage(WM_CLOSE, 0, 0);
  617. lRet = BUTTON_CLOSE;
  618. }
  619. }
  620. else if(m_bMouseDownOnChevron)
  621. {
  622. ReleaseCapture();
  623. m_bMouseDownOnChevron = false;
  624. m_bMouseOverChevron = false;
  625. DoNcPaint(pWnd);
  626. CPoint clPoint(point);
  627. clPoint.x += m_lLeftBorder;
  628. clPoint.y += m_lTopBorder;
  629. if(m_crChevronBT.PtInRect(clPoint))
  630. {
  631. lRet = BUTTON_CHEVRON;
  632. }
  633. }
  634. else if(m_bMouseDownOnMinimize)
  635. {
  636. ReleaseCapture();
  637. m_bMouseDownOnMinimize = false;
  638. m_bMouseOverMinimize = false;
  639. DoNcPaint(pWnd);
  640. CPoint clPoint(point);
  641. clPoint.x += m_lLeftBorder;
  642. clPoint.y += m_lTopBorder;
  643. if(m_crMinimizeBT.PtInRect(clPoint))
  644. {
  645. pWnd->ShowWindow(SW_MINIMIZE);
  646. lRet = BUTTON_MINIMIZE;
  647. }
  648. }
  649. else if(m_bMouseDownOnMaximize)
  650. {
  651. ReleaseCapture();
  652. m_bMouseDownOnMaximize = false;
  653. m_bMouseOverMaximize = false;
  654. DoNcPaint(pWnd);
  655. CPoint clPoint(point);
  656. clPoint.x += m_lLeftBorder;
  657. clPoint.y += m_lTopBorder;
  658. if(m_crMaximizeBT.PtInRect(clPoint))
  659. {
  660. if(pWnd->GetStyle() & WS_MAXIMIZE)
  661. pWnd->ShowWindow(SW_RESTORE);
  662. else
  663. pWnd->ShowWindow(SW_SHOWMAXIMIZED);
  664. lRet = BUTTON_MAXIMIZE;
  665. }
  666. }
  667. return lRet;
  668. }
  669. void CDittoWindow::DoNcMouseMove(CWnd *pWnd, UINT nHitTest, CPoint point)
  670. {
  671. CPoint clPoint(point);
  672. pWnd->ScreenToClient(&clPoint);
  673. clPoint.x += m_lLeftBorder;
  674. clPoint.y += m_lTopBorder;
  675. if(m_crCloseBT.PtInRect(clPoint))
  676. {
  677. m_bMouseOverClose = true;
  678. CWindowDC dc(pWnd);
  679. DrawCloseBtn(dc);
  680. }
  681. else if(m_bMouseOverClose)
  682. {
  683. m_bMouseOverClose = false;
  684. DoNcPaint(pWnd);
  685. }
  686. if(m_crChevronBT.PtInRect(clPoint))
  687. {
  688. m_bMouseOverChevron = true;
  689. CWindowDC dc(pWnd);
  690. DrawChevronBtn(dc);
  691. }
  692. else if(m_bMouseOverChevron)
  693. {
  694. m_bMouseOverChevron = false;
  695. DoNcPaint(pWnd);
  696. }
  697. if(m_crMinimizeBT.PtInRect(clPoint))
  698. {
  699. m_bMouseOverMinimize = true;
  700. CWindowDC dc(pWnd);
  701. DrawMinimizeBtn(dc);
  702. }
  703. else if(m_bMouseOverMinimize)
  704. {
  705. m_bMouseOverMinimize = false;
  706. DoNcPaint(pWnd);
  707. }
  708. if(m_crMaximizeBT.PtInRect(clPoint))
  709. {
  710. m_bMouseOverMaximize = true;
  711. CWindowDC dc(pWnd);
  712. DrawMaximizeBtn(dc);
  713. }
  714. else if(m_bMouseOverMaximize)
  715. {
  716. m_bMouseOverMaximize = false;
  717. DoNcPaint(pWnd);
  718. }
  719. }
  720. bool CDittoWindow::DoPreTranslateMessage(MSG* pMsg)
  721. {
  722. if (pMsg->message == WM_NCLBUTTONDOWN)
  723. {
  724. m_bMouseDownOnCaption = true;
  725. }
  726. if ((pMsg->message == WM_LBUTTONUP) && (m_bMouseDownOnCaption))
  727. {
  728. m_bMouseDownOnCaption = false;
  729. pMsg->message = WM_NCLBUTTONUP;
  730. }
  731. return true;
  732. }
  733. void CDittoWindow::SetCaptionOn(CWnd *pWnd, int nPos, bool bOnstartup)
  734. {
  735. m_lTopBorder = BORDER;
  736. m_lRightBorder = BORDER;
  737. m_lBottomBorder = BORDER;
  738. m_lLeftBorder = BORDER;
  739. if(nPos == CAPTION_RIGHT)
  740. m_lRightBorder = CAPTION_BORDER;
  741. if(nPos == CAPTION_BOTTOM)
  742. m_lBottomBorder = CAPTION_BORDER;
  743. if(nPos == CAPTION_LEFT)
  744. m_lLeftBorder = CAPTION_BORDER;
  745. if(nPos == CAPTION_TOP)
  746. m_lTopBorder = CAPTION_BORDER;
  747. DoSetRegion(pWnd);
  748. if(!bOnstartup)
  749. {
  750. pWnd->SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
  751. }
  752. pWnd->RedrawWindow();
  753. }
  754. bool CDittoWindow::SetCaptionColors(COLORREF left, COLORREF right)
  755. {
  756. if( left == m_CaptionColorLeft || right == m_CaptionColorRight )
  757. return false;
  758. m_CaptionColorLeft = left;
  759. m_CaptionColorRight = right;
  760. return true;
  761. }