StateButton.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #include "stdafx.h"
  2. #include "StateButton.h"
  3. IMPLEMENT_DYNAMIC(CStateButton, CButton)
  4. CStateButton::CStateButton() :
  5. btnState(0)
  6. , colorState(0)
  7. , lastColorState(0)
  8. , chooseState(0)
  9. , strInfo("")
  10. {
  11. }
  12. CStateButton::~CStateButton()
  13. {
  14. }
  15. BEGIN_MESSAGE_MAP(CStateButton, CButton)
  16. END_MESSAGE_MAP()
  17. void CStateButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  18. {
  19. drawButton();
  20. }
  21. void CStateButton::drawButton()
  22. {
  23. CClientDC dc(this);
  24. dc.SetBkMode(TRANSPARENT);
  25. CRect rc;
  26. GetClientRect(rc);
  27. CFont BigFont, NozFont, ItemFont;
  28. CFont *pFont = NULL;
  29. int nBigFontH = 30;
  30. int nNozFontH = 24;
  31. int nItemFoldH = 17;
  32. if (0 != NozFont.CreateFont(nNozFontH, 0, 0, 0, FW_SEMIBOLD, 0, 0, 0, DEFAULT_CHARSET,
  33. OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY,
  34. VARIABLE_PITCH | FF_SWISS, _T("微软雅黑")))
  35. {
  36. pFont = dc.SelectObject(&NozFont);
  37. }
  38. ItemFont.CreateFont(-MulDiv(int(nItemFoldH), 72, 72),
  39. 0, 0, 0, FW_MEDIUM, 0, 0, 0, GB2312_CHARSET,
  40. OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, PROOF_QUALITY,
  41. FIXED_PITCH | FF_SWISS, "微软雅黑");
  42. CFont font;
  43. font.CreateFont(-MulDiv(int(16), 72, 72),
  44. 0, 0, 0, FW_SEMIBOLD, 0, 0, 0, GB2312_CHARSET,
  45. OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, PROOF_QUALITY,
  46. FIXED_PITCH | FF_SWISS, "微软雅黑");
  47. CPen bgPen;
  48. bgPen.CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
  49. CPen* pOldPen = dc.SelectObject(&bgPen);
  50. CBrush brh1;
  51. if (colorState == 0)
  52. {
  53. brh1.CreateSolidBrush(RGB(255, 255, 255));
  54. }
  55. else if (colorState == 1)
  56. {
  57. brh1.CreateSolidBrush(RGB(117, 197, 240));
  58. }
  59. CBrush *pOldBrush = dc.SelectObject(&brh1);
  60. CBrush brh2;
  61. COLORREF color;
  62. color = RGB(38, 45, 49);
  63. TRIVERTEX vert[2];
  64. GRADIENT_RECT gRect;
  65. vert[0].x = rc.left;
  66. vert[0].y = rc.top;
  67. vert[1].x = rc.right;
  68. vert[1].y = rc.bottom;
  69. if (state == 0)
  70. {
  71. vert[0].Red = 0xe500;
  72. vert[0].Green = 0xe500;
  73. vert[0].Blue = 0xe500;
  74. vert[0].Alpha = 0xff00;
  75. vert[1].Red = 0xa900;
  76. vert[1].Green = 0xa900;
  77. vert[1].Blue = 0xa900;
  78. vert[1].Alpha = 0xff00;
  79. brh2.CreateSolidBrush(RGB(252, 152, 0));
  80. }
  81. else if (state == 1)
  82. {
  83. vert[0].Red = 0xc600;
  84. vert[0].Green = 0xe700;
  85. vert[0].Blue = 0xf900;
  86. vert[0].Alpha = 0xff00;
  87. vert[1].Red = 0x2600;
  88. vert[1].Green = 0xb200;
  89. vert[1].Blue = 0xff00;
  90. vert[1].Alpha = 0xff00;
  91. brh2.CreateSolidBrush(RGB(231, 159, 67));
  92. }
  93. else if (state == 2)
  94. {
  95. vert[0].Red = 0xf300;
  96. vert[0].Green = 0xc400;
  97. vert[0].Blue = 0x6b00;
  98. vert[0].Alpha = 0xff00;
  99. vert[1].Red = 0xfc00;
  100. vert[1].Green = 0x9800;
  101. vert[1].Blue = 0x0000;
  102. vert[1].Alpha = 0xff00;
  103. brh2.CreateSolidBrush(RGB(137, 160, 175));
  104. }
  105. /*
  106. else if (index >= 10 && index <= 12)
  107. {
  108. vert[0].Red = 0xf300;
  109. vert[0].Green = 0xc400;
  110. vert[0].Blue = 0x6b00;
  111. vert[0].Alpha = 0xff00;
  112. vert[1].Red = 0xfc00;
  113. vert[1].Green = 0x9800;
  114. vert[1].Blue = 0x0000;
  115. vert[1].Alpha = 0xff00;
  116. brh2.CreateSolidBrush(RGB(137, 160, 175));
  117. }
  118. else
  119. {
  120. //灰 229 169
  121. vert[0].Red = 0xe500;
  122. vert[0].Green = 0xe500;
  123. vert[0].Blue = 0xe500;
  124. vert[0].Alpha = 0xff00;
  125. vert[1].Red = 0xa900;
  126. vert[1].Green = 0xa900;
  127. vert[1].Blue = 0xa900;
  128. vert[1].Alpha = 0xff00;
  129. brh2.CreateSolidBrush(RGB(169, 169, 169));
  130. }
  131. */
  132. gRect.UpperLeft = 0;
  133. gRect.LowerRight = 1;
  134. GradientFill(dc.m_hDC, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_V);
  135. CBrush brh3(0xffffff);//RGB(51, 55, 68)
  136. pOldBrush = dc.SelectObject(&brh3);
  137. CRgn rgn;
  138. rgn.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 15, 15);
  139. dc.FrameRgn(&rgn, &brh3, 1, 1);
  140. CRgn rgn3;
  141. int al = 5;
  142. rgn3.CreateRoundRectRgn(rc.left - al, rc.top - al, rc.right + al, rc.bottom + al, 15, 15);
  143. dc.FrameRgn(&rgn3, &brh3, al, al);
  144. CRect rcBlank(13, 75, 162, 102);
  145. //CBrush brh4(RGB(255, 255, 255));
  146. CBrush brh4(0xdddddd); //0xf3d191//0xdfddd90xc7ddc0
  147. CBrush brh5(0xf1f9ec); //0xf3d191//0xdfddd90xc7ddc0
  148. if (state == 0)
  149. {
  150. pOldBrush = dc.SelectObject(&brh4);
  151. }
  152. else
  153. {
  154. pOldBrush = dc.SelectObject(&brh5);
  155. }
  156. if (type == 0)
  157. {
  158. //dc.RoundRect(rcBlank, CPoint(8, 8));
  159. }
  160. //CBrush brh(RGB(57, 171, 229));
  161. //pOldBrush = dc.SelectObject(&brh);
  162. dc.SetTextColor(color);
  163. CRect rcname(rc);
  164. rcname.left = 40;
  165. rcname.right -= 4;
  166. rcname.bottom = 25;
  167. CRect rcamout(rcname);
  168. CRect rcvol(rcname);
  169. CRect rcprice(rcname);
  170. rcamout.OffsetRect(0, 30);
  171. rcvol.OffsetRect(0, 30*2);
  172. rcprice.OffsetRect(0, 30*3);
  173. CRect rca(rcamout);
  174. rca.left = rc.left + 3;
  175. rca.right = 38;
  176. CRect rcv(rca);
  177. CRect rcp(rca);
  178. rcv.OffsetRect(0, 30);
  179. rcp.OffsetRect(0, 30 * 2);
  180. //if (type == 0)
  181. {
  182. /*
  183. if (strInfo != "")
  184. {
  185. CRect rcText(rcBlank);
  186. rcText.OffsetRect(0, 2);
  187. dc.DrawText(strInfo, rcText, DT_CENTER | DT_VCENTER);
  188. }*/
  189. }
  190. dc.RoundRect(rcamout, CPoint(8, 8));
  191. dc.RoundRect(rcvol, CPoint(8, 8));
  192. dc.RoundRect(rcprice, CPoint(8, 8));
  193. rcname.left = rc.left+3;
  194. dc.SelectObject(&NozFont);
  195. dc.DrawText(name, rcname, DT_CENTER | DT_VCENTER);
  196. dc.SelectObject(&font);
  197. dc.DrawText(amount, rcamout, DT_CENTER | DT_VCENTER);
  198. dc.DrawText(vol, rcvol, DT_CENTER | DT_VCENTER);
  199. dc.DrawText(price, rcprice, DT_CENTER | DT_VCENTER);
  200. dc.SelectObject(&ItemFont);
  201. dc.DrawText("金额", rca, DT_CENTER | DT_VCENTER);
  202. dc.DrawText("数量" , rcv,DT_CENTER | DT_VCENTER);
  203. dc.DrawText("单价", rcp, DT_CENTER | DT_VCENTER);
  204. //drawlines(&dc, name, rcStr, 14, 3, 22);
  205. dc.SelectObject(pOldBrush);
  206. dc.SelectObject(pOldPen);
  207. bgPen.DeleteObject();
  208. brh1.DeleteObject();
  209. brh2.DeleteObject();
  210. //brh.DeleteObject();
  211. NozFont.DeleteObject();
  212. font.DeleteObject();
  213. ItemFont.DeleteObject();
  214. }
  215. void CStateButton::drawlines(CDC* pDC, CString str, CRect rc, UINT charNumOfLine, UINT linenum, UINT rowHeight)
  216. {
  217. vector<CString> vStrs;
  218. CString tmpStr = str;
  219. while (tmpStr != "" && vStrs.size() < linenum)
  220. {
  221. int pos = 10;// getDividePos(tmpStr, charNumOfLine);
  222. CString tmpStr1 = tmpStr.Left(pos);
  223. vStrs.push_back(tmpStr1);
  224. if (tmpStr1 == tmpStr)
  225. {
  226. tmpStr = "";
  227. }
  228. else
  229. {
  230. tmpStr = tmpStr.Mid(pos);
  231. }
  232. }
  233. UINT headAlign = (rc.bottom - rc.top - vStrs.size() * rowHeight) / 2;
  234. CRect rc1(rc);
  235. rc1.top += headAlign;
  236. rc1.left += 5;
  237. rc1.right -= 5;
  238. for (size_t i = 0; i < vStrs.size(); i++)
  239. {
  240. rc1.bottom = rc1.top + rowHeight;
  241. pDC->DrawText(vStrs[i], rc1, DT_CENTER | DT_VCENTER);
  242. rc1.top += rowHeight;
  243. }
  244. }
  245. void CStateButton::changeColor(bool change)
  246. {
  247. if (change)
  248. {
  249. chooseState = 1;
  250. colorState = 1;
  251. }
  252. else
  253. {
  254. chooseState = 0;
  255. colorState = 0;
  256. }
  257. if (lastColorState != colorState)
  258. {
  259. Invalidate(false);
  260. lastColorState = colorState;
  261. }
  262. }