LabelEx.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. // LabelEx.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ylgl.h"
  5. #include "LabelEx.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. // caculate the logic x and y, change into physics x and y.(int printer DC)
  12. //#define CALCF(x) (-MulDiv(x, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 72))
  13. //#define CALCY(y) (MulDiv(y, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 72))
  14. //#define CALCX(x) (MulDiv(x, GetDeviceCaps(pDC->m_hDC, LOGPIXELSX), 72))
  15. #define CALCF2(x) (x)
  16. #define CALCY2(y) (y)
  17. #define CALCX2(x) (x)
  18. // each added font can have 4 attributes
  19. #define FACE_NORMAL 0
  20. #define FACE_NORMALBOLD 1
  21. #define FACE_BIG 2
  22. #define FACE_BIGBOLD 3
  23. // for Print text, you should let it by left or right, and up or bottom
  24. // these formats can be combined with the | operator
  25. #define FORMAT_NORMAL 0 //default should be by left and top
  26. #define FORMAT_HCENTER 1
  27. #define FORMAT_VCENTER 2
  28. #define FORMAT_RIGHT 4
  29. #define FORMAT_LEFT 8
  30. #define FORMAT_UP 16
  31. #define FORMAT_BOTTOM 32
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CLabelEx
  34. CLabelEx::CLabelEx()
  35. {
  36. m_bClicked=FALSE;
  37. m_bOver=FALSE;
  38. m_bUnderLine=FALSE;
  39. m_bAutoUnderLine=FALSE;
  40. m_bBorder=FALSE;
  41. m_bHighLight=TRUE;
  42. m_bBackUnderLine=FALSE;
  43. m_crText=RGB(0,0,0);
  44. m_crBorder=RGB(0,0,0);
  45. m_crBG=RGB(255,255,255);
  46. m_crUnderLine=RGB(0,0,255);
  47. m_hHandCur=AfxGetApp()->LoadCursor(IDC_HAND);
  48. }
  49. CLabelEx::~CLabelEx()
  50. {
  51. if(m_BGBm.GetSafeHandle()!=NULL)
  52. m_BGBm.DeleteObject();
  53. if(m_MouseOverBGBm.GetSafeHandle()!=NULL)
  54. m_MouseOverBGBm.DeleteObject();
  55. if(m_ClickedBGBm.GetSafeHandle()!=NULL)
  56. m_ClickedBGBm.DeleteObject();
  57. if(m_LabelBm.GetSafeHandle()!=NULL)
  58. m_LabelBm.DeleteObject();
  59. if(m_MouseOverLabelBm.GetSafeHandle()!=NULL)
  60. m_MouseOverLabelBm.DeleteObject();
  61. if(m_ClickedLabelBm.GetSafeHandle()!=NULL)
  62. m_ClickedLabelBm.DeleteObject();
  63. }
  64. BEGIN_MESSAGE_MAP(CLabelEx, CStatic)
  65. //{{AFX_MSG_MAP(CLabelEx)
  66. ON_WM_PAINT()
  67. ON_WM_MOUSEMOVE()
  68. ON_WM_LBUTTONDOWN()
  69. //}}AFX_MSG_MAP
  70. END_MESSAGE_MAP()
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CLabelEx message handlers
  73. void CLabelEx::AutoDraw2(CDC *pDC, CRect &StrRect, CString &str, float fscale)
  74. {//不支持换行
  75. CString tempbz,temp;
  76. BOOL bRun=0;
  77. CSize size;
  78. int fontsize=24;
  79. int i=0;
  80. LOGFONT log;
  81. ll: tempbz=str;
  82. i=0;
  83. SetFontFace(pDC, fontsize, 1, "宋体");
  84. while(1)
  85. {
  86. if(!tempbz.IsEmpty ())
  87. {
  88. temp=tempbz;
  89. GetStrSize(pDC, (LPTSTR)(LPCTSTR)temp, size);
  90. CRect temprc=StrRect;
  91. if(size.cx>temprc.Width ())break;
  92. tempbz="";
  93. if(bRun)
  94. {
  95. // pDC->DrawText (temp, temprc, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
  96. DrawText(pDC, (LPTSTR)(LPCTSTR)temp, temprc, 0, 0, FORMAT_LEFT | FORMAT_VCENTER);
  97. }
  98. }
  99. else
  100. break;
  101. }
  102. if(tempbz.IsEmpty ()==0)
  103. {
  104. fontsize--;
  105. goto ll;
  106. }
  107. if(bRun==0)
  108. {
  109. bRun=1;
  110. goto ll;
  111. }
  112. }
  113. void CLabelEx::AutoDraw(CDC *pDC, CRect &StrRect, CString &str, float fscale)
  114. {
  115. CString tempbz,temp;
  116. BOOL bRun=0;
  117. CSize size;
  118. int fontsize=24;
  119. int i=0;
  120. LOGFONT log;
  121. ll: tempbz=str;
  122. i=0;
  123. SetFontFace(pDC, fontsize, 1, "宋体");
  124. while(1)
  125. {
  126. if(!tempbz.IsEmpty ())
  127. {
  128. temp=tempbz;
  129. GetStrSize(pDC, (LPTSTR)(LPCTSTR)temp, size);
  130. int right=0;
  131. CRect temprc=StrRect;
  132. temprc.top += i*(fontsize*fscale);i++;
  133. temprc.bottom =temprc.top +fontsize;
  134. if(temprc.bottom >StrRect.bottom )break;
  135. while(size.cx>temprc.Width ())
  136. {
  137. right++;
  138. temp=tempbz.Left (tempbz.GetLength ()-(right));
  139. if(GIsHalfHZ(temp))
  140. {
  141. right++;
  142. temp.Delete (temp.GetLength ()-1);
  143. }
  144. GetStrSize(pDC, (LPTSTR)(LPCTSTR)temp, size);
  145. }
  146. if(temp.Find ("\r\n")!=-1)
  147. {
  148. temp=temp.Left (temp.Find ("\r\n"));//i++;
  149. tempbz=tempbz.Right (tempbz.GetLength ()-temp.GetLength ()-2);
  150. }
  151. else
  152. tempbz=tempbz.Right (tempbz.GetLength ()-temp.GetLength ());
  153. if(bRun)
  154. DrawText(pDC, (LPTSTR)(LPCTSTR)temp, temprc, 0, 0, FORMAT_LEFT | FORMAT_VCENTER);
  155. }
  156. else
  157. break;
  158. }
  159. if(tempbz.IsEmpty ()==0)
  160. {
  161. fontsize--;
  162. goto ll;
  163. }
  164. if(bRun==0)
  165. {
  166. bRun=1;
  167. goto ll;
  168. }
  169. }
  170. void CLabelEx::OnPaint()
  171. {
  172. CPaintDC dc(this);
  173. CDC *pDC=&dc;
  174. pDC->SetTextColor(m_crText);
  175. pDC->SetBkMode(TRANSPARENT);
  176. // pDC->SelectObject(this->GetFont());
  177. ///准备工作
  178. CRect rect;
  179. CDC MemDC;
  180. CPen BorderPen,*pOldPen,UnderLinePen;
  181. CBrush BGBrush,*pOldBrush;
  182. BITMAP bm;
  183. int nTextLeft=0,nTextTop=0; //文字输出的位置
  184. this->GetClientRect(&rect);
  185. MemDC.CreateCompatibleDC(pDC);
  186. MemDC.SetMapMode(pDC->GetMapMode());
  187. ///画边框
  188. if(m_bBorder)
  189. {
  190. BorderPen.CreatePen(PS_SOLID,1,m_crBorder);
  191. BGBrush.CreateSolidBrush(m_crBG);
  192. pOldPen=pDC->SelectObject(&BorderPen);
  193. pOldBrush=pDC->SelectObject(&BGBrush);
  194. pDC->Rectangle(&rect);
  195. pDC->SelectObject(pOldPen);
  196. pDC->SelectObject(pOldBrush);
  197. rect.DeflateRect(1,1);
  198. }
  199. ///贴背景图
  200. if(m_bClicked && m_ClickedBGBm.GetSafeHandle()!=NULL)
  201. {
  202. MemDC.SelectObject(m_ClickedBGBm);
  203. pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
  204. &MemDC,0,0,SRCCOPY);
  205. }
  206. else if(m_bOver && m_MouseOverBGBm.GetSafeHandle()!=NULL)//鼠标经过的时候
  207. {
  208. MemDC.SelectObject(m_MouseOverBGBm);
  209. pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
  210. &MemDC,0,0,SRCCOPY);
  211. }
  212. else if(m_BGBm.GetSafeHandle()!=NULL)
  213. {
  214. MemDC.SelectObject(m_BGBm);
  215. pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
  216. &MemDC,0,0,SRCCOPY);
  217. }
  218. ///贴标签图片
  219. if(m_bClicked && m_ClickedLabelBm.GetSafeHandle()!=NULL)
  220. {
  221. m_ClickedLabelBm.GetBitmap(&bm);
  222. double fScal=bm.bmWidth*1.0/bm.bmHeight;
  223. nTextLeft=int(rect.Height()*fScal)+4;
  224. MemDC.SelectObject(m_ClickedLabelBm);
  225. pDC->StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),
  226. &MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  227. }
  228. else if(m_bOver && m_MouseOverLabelBm.GetSafeHandle()!=NULL)
  229. {
  230. m_MouseOverLabelBm.GetBitmap(&bm);
  231. double fScal=bm.bmWidth*1.0/bm.bmHeight;
  232. nTextLeft=int(rect.Height()*fScal)+4;
  233. MemDC.SelectObject(m_MouseOverLabelBm);
  234. pDC->StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),
  235. &MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  236. }
  237. else if(m_LabelBm.GetSafeHandle()!=NULL)
  238. {
  239. m_LabelBm.GetBitmap(&bm);
  240. double fScal=bm.bmWidth*1.0/bm.bmHeight;
  241. nTextLeft=int(rect.Height()*fScal)+4;
  242. MemDC.SelectObject(m_LabelBm);
  243. pDC->StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),
  244. &MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  245. }
  246. else
  247. {
  248. nTextLeft=4;
  249. }
  250. ///输出文字
  251. TEXTMETRIC tm;
  252. pDC->GetTextMetrics(&tm);
  253. /* nTextTop=rect.top+(rect.Height()-tm.tmHeight)/2;
  254. if(strText.GetLength()>0)
  255. {
  256. pDC->TextOut(nTextLeft,nTextTop,strText);
  257. }*/
  258. CString strText;
  259. this->GetWindowText(strText);
  260. rect.left +=2;
  261. rect.top +=2;
  262. if(strText.Find ("\r\n")==-1)
  263. AutoDraw2(pDC, rect, strText, 1.1);
  264. else
  265. AutoDraw(pDC, rect, strText, 1.1);
  266. ///画下划线
  267. if(m_bUnderLine)
  268. {
  269. nTextLeft-=2;
  270. nTextTop=nTextTop+tm.tmHeight+1;
  271. UnderLinePen.CreatePen(PS_SOLID,1,m_crUnderLine);
  272. pOldPen=pDC->SelectObject(&UnderLinePen);
  273. pDC->MoveTo(nTextLeft,nTextTop);
  274. pDC->LineTo(nTextLeft+tm.tmAveCharWidth*strText.GetLength(),nTextTop);
  275. }
  276. MemDC.DeleteDC ();
  277. }
  278. void CLabelEx::PreSubclassWindow()
  279. {
  280. // TODO: Add your specialized code here and/or call the base class
  281. DWORD dwStyle = GetStyle();
  282. ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);
  283. SetFont(GetParent()->GetFont());
  284. CStatic::PreSubclassWindow();
  285. }
  286. void CLabelEx::OnMouseMove(UINT nFlags, CPoint point)
  287. {
  288. // TODO: Add your message handler code here and/or call default
  289. /* if (m_bOver) // Cursor is currently over control
  290. {
  291. CRect rect;
  292. GetClientRect(rect);
  293. if (!rect.PtInRect(point))
  294. {
  295. m_bOver = FALSE;
  296. if(m_bAutoUnderLine) ///自动下划线
  297. {
  298. this->SetUnderLine(FALSE,RGB(0,0,0));
  299. }
  300. if(m_bHighLight) //自动高亮
  301. {
  302. ///恢复原来的字体颜色
  303. this->SetTextColor(m_crBackText);
  304. }
  305. RedrawWindow();
  306. ReleaseCapture();
  307. return;
  308. }
  309. }
  310. else // Cursor has just moved over control
  311. {
  312. m_bOver = TRUE;
  313. if(m_bAutoUnderLine)
  314. {
  315. this->SetUnderLine(TRUE,RGB(0,0,255));
  316. }
  317. if(m_bHighLight)
  318. {
  319. m_crBackText=m_crText;
  320. this->SetTextColor(RGB(0,0,255));
  321. }
  322. RedrawWindow();
  323. SetCapture();
  324. // ::SetCursor(m_hHandCur);
  325. }*/
  326. CStatic::OnMouseMove(nFlags, point);
  327. }
  328. void CLabelEx::SetTextColor(COLORREF crText)
  329. {
  330. m_crText=crText;
  331. }
  332. void CLabelEx::SetUnderLine(BOOL bUnderLine, COLORREF crUnderLine)
  333. {
  334. m_bUnderLine=bUnderLine;
  335. m_crUnderLine=crUnderLine;
  336. }
  337. void CLabelEx::SetBorder(BOOL bBorder, COLORREF crBorder)
  338. {
  339. m_bBorder=bBorder;
  340. m_crBorder=crBorder;
  341. }
  342. void CLabelEx::SetBkColor(COLORREF crBkColor)
  343. {
  344. m_crBG=crBkColor;
  345. }
  346. void CLabelEx::EnableAutoUnderLine(BOOL bAutoUnderLine)
  347. {
  348. m_bAutoUnderLine=bAutoUnderLine;
  349. if(m_bAutoUnderLine) ///设置了自动下划线
  350. {
  351. m_bBackUnderLine=m_bUnderLine;//保存原来下划线的状态
  352. m_bUnderLine=FALSE;
  353. }
  354. else ///取消了自动下划线
  355. {
  356. m_bUnderLine=m_bBackUnderLine;//回复原来下划线的状态
  357. }
  358. }
  359. void CLabelEx::RedrawWindow()
  360. {
  361. CStatic::RedrawWindow();
  362. //RECT rect;
  363. //this->GetWindowRect(&rect);
  364. //GetParent()->ScreenToClient(&rect);
  365. //GetParent()->InvalidateRect(&rect);
  366. }
  367. void CLabelEx::SetBGBitmap(UINT ID)
  368. {
  369. if(m_BGBm.GetSafeHandle()!=NULL)
  370. m_BGBm.DeleteObject();
  371. m_BGBm.LoadBitmap(ID);
  372. }
  373. void CLabelEx::SetMouseOverBGBitmap(UINT ID)
  374. {
  375. if(m_MouseOverBGBm.GetSafeHandle()!=NULL)
  376. m_MouseOverBGBm.DeleteObject();
  377. m_MouseOverBGBm.LoadBitmap(ID);
  378. }
  379. void CLabelEx::SetClickedBGBitmap(UINT ID)
  380. {
  381. if(m_ClickedBGBm.GetSafeHandle()!=NULL)
  382. m_ClickedBGBm.DeleteObject();
  383. m_ClickedBGBm.LoadBitmap(ID);
  384. }
  385. void CLabelEx::SetLabelBitmap(UINT ID)
  386. {
  387. if(m_LabelBm.GetSafeHandle()!=NULL)
  388. m_LabelBm.DeleteObject();
  389. m_LabelBm.LoadBitmap(ID);
  390. }
  391. void CLabelEx::OnLButtonDown(UINT nFlags, CPoint point)
  392. {
  393. // TODO: Add your message handler code here and/or call default
  394. m_bClicked=!m_bClicked;
  395. RedrawWindow();
  396. CStatic::OnLButtonDown(nFlags, point);
  397. }
  398. void CLabelEx::SetMouseOverLabelBitmap(UINT ID)
  399. {
  400. if(m_MouseOverLabelBm.GetSafeHandle()!=NULL)
  401. m_MouseOverLabelBm.DeleteObject();
  402. m_MouseOverLabelBm.LoadBitmap(ID);
  403. }
  404. void CLabelEx::SetClickedLabelBitmap(UINT ID)
  405. {
  406. if(m_ClickedLabelBm.GetSafeHandle()!=NULL)
  407. m_ClickedLabelBm.DeleteObject();
  408. m_ClickedLabelBm.LoadBitmap(ID);
  409. }
  410. ///自动感应字体颜色
  411. void CLabelEx::EnableHighLight(BOOL bHighLight)
  412. {
  413. m_bHighLight=bHighLight;
  414. }
  415. int CLabelEx::SetFontFace(CDC *pDC, int iFont, BOOL bWeight, CString name)
  416. {
  417. LOGFONT log;
  418. log.lfHeight = CALCF2(iFont); //add a kind of fond,let height equles 13
  419. log.lfWidth = 0;
  420. log.lfEscapement = 0;
  421. log.lfOrientation = 0;
  422. if(bWeight)
  423. log.lfWeight = FW_BLACK;
  424. else
  425. log.lfWeight = FW_REGULAR;
  426. log.lfItalic = false;
  427. log.lfUnderline = false;
  428. log.lfStrikeOut = 0;
  429. log.lfCharSet = ANSI_CHARSET;
  430. log.lfOutPrecision = OUT_DEFAULT_PRECIS;
  431. log.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  432. log.lfQuality = DEFAULT_QUALITY;
  433. log.lfPitchAndFamily = DEFAULT_PITCH || FF_ROMAN;
  434. #ifdef VC60
  435. strcpy (log.lfFaceName,name);
  436. #else
  437. _tcscpy_s(log.lfFaceName, 32, name);
  438. #endif
  439. if(m_newfont.GetSafeHandle ())m_newfont.DeleteObject ();
  440. m_newfont.CreateFontIndirect(&log);
  441. pDC->SelectObject(&m_newfont);
  442. return 0;
  443. }
  444. int CLabelEx::GetStrSize(CDC *pDC, char *str, CSize &size)
  445. {
  446. int ret=GetTextExtentPoint32(pDC->GetSafeHdc(), str, strlen(str), &size);
  447. if(ret==0)return 0;
  448. // size.cx = MulDiv(size.cx, 72, GetDeviceCaps(pDC->m_hDC, LOGPIXELSX));
  449. // size.cy = MulDiv(size.cy, 72, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY));
  450. return 1;
  451. }
  452. int CLabelEx::DrawText(CDC *pDC, char *str, CRect &m_rt, int iFont, int iFace, int format)
  453. {
  454. SIZE Size;
  455. GetTextExtentPoint32(pDC->GetSafeHdc(), str, strlen(str), &Size);
  456. int left, top;
  457. if (format & FORMAT_HCENTER)
  458. {
  459. left = CALCX2(m_rt.left) + CALCX2(m_rt.Width())/2 - Size.cx/2;
  460. if (left < CALCX2(m_rt.left))
  461. left = CALCX2(m_rt.left);
  462. }
  463. else if(format & FORMAT_RIGHT)
  464. {
  465. left = CALCX2(m_rt.left) + CALCX2(m_rt.Width()) - Size.cx;
  466. if (left < CALCX2(m_rt.left))
  467. left = CALCX2(m_rt.left);
  468. }
  469. else
  470. left = CALCX2(m_rt.left);
  471. if (format & FORMAT_VCENTER)
  472. {
  473. top = CALCY2(m_rt.top) + CALCY2(m_rt.Height())/2 - Size.cy/2;
  474. if (top < CALCY2(m_rt.top))
  475. top = CALCY2(m_rt.top);
  476. }
  477. else top = CALCY2(m_rt.top);
  478. pDC->TextOut(left, top, str);
  479. return 1;
  480. }
  481. void CLabelEx::Paint()
  482. {
  483. CDC *pDC=GetDC();
  484. pDC->SetTextColor(m_crText);
  485. pDC->SetBkMode(TRANSPARENT);
  486. // pDC->SelectObject(this->GetFont());
  487. ///准备工作
  488. CRect rect;
  489. CDC MemDC;
  490. CPen BorderPen,*pOldPen,UnderLinePen;
  491. CBrush BGBrush,*pOldBrush;
  492. BITMAP bm;
  493. int nTextLeft=0,nTextTop=0; //文字输出的位置
  494. this->GetClientRect(&rect);
  495. MemDC.CreateCompatibleDC(pDC);
  496. MemDC.SetMapMode(pDC->GetMapMode());
  497. ///画边框
  498. if(m_bBorder)
  499. {
  500. BorderPen.CreatePen(PS_SOLID,1,m_crBorder);
  501. BGBrush.CreateSolidBrush(m_crBG);
  502. pOldPen=pDC->SelectObject(&BorderPen);
  503. pOldBrush=pDC->SelectObject(&BGBrush);
  504. pDC->Rectangle(&rect);
  505. pDC->SelectObject(pOldPen);
  506. pDC->SelectObject(pOldBrush);
  507. rect.DeflateRect(1,1);
  508. }
  509. ///贴背景图
  510. if(m_bClicked && m_ClickedBGBm.GetSafeHandle()!=NULL)
  511. {
  512. MemDC.SelectObject(m_ClickedBGBm);
  513. pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
  514. &MemDC,0,0,SRCCOPY);
  515. }
  516. else if(m_bOver && m_MouseOverBGBm.GetSafeHandle()!=NULL)//鼠标经过的时候
  517. {
  518. MemDC.SelectObject(m_MouseOverBGBm);
  519. pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
  520. &MemDC,0,0,SRCCOPY);
  521. }
  522. else if(m_BGBm.GetSafeHandle()!=NULL)
  523. {
  524. MemDC.SelectObject(m_BGBm);
  525. pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
  526. &MemDC,0,0,SRCCOPY);
  527. }
  528. ///贴标签图片
  529. if(m_bClicked && m_ClickedLabelBm.GetSafeHandle()!=NULL)
  530. {
  531. m_ClickedLabelBm.GetBitmap(&bm);
  532. double fScal=bm.bmWidth*1.0/bm.bmHeight;
  533. nTextLeft=int(rect.Height()*fScal)+4;
  534. MemDC.SelectObject(m_ClickedLabelBm);
  535. pDC->StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),
  536. &MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  537. }
  538. else if(m_bOver && m_MouseOverLabelBm.GetSafeHandle()!=NULL)
  539. {
  540. m_MouseOverLabelBm.GetBitmap(&bm);
  541. double fScal=bm.bmWidth*1.0/bm.bmHeight;
  542. nTextLeft=int(rect.Height()*fScal)+4;
  543. MemDC.SelectObject(m_MouseOverLabelBm);
  544. pDC->StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),
  545. &MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  546. }
  547. else if(m_LabelBm.GetSafeHandle()!=NULL)
  548. {
  549. m_LabelBm.GetBitmap(&bm);
  550. double fScal=bm.bmWidth*1.0/bm.bmHeight;
  551. nTextLeft=int(rect.Height()*fScal)+4;
  552. MemDC.SelectObject(m_LabelBm);
  553. pDC->StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),
  554. &MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  555. }
  556. else
  557. {
  558. nTextLeft=4;
  559. }
  560. ///输出文字
  561. TEXTMETRIC tm;
  562. pDC->GetTextMetrics(&tm);
  563. /* nTextTop=rect.top+(rect.Height()-tm.tmHeight)/2;
  564. if(strText.GetLength()>0)
  565. {
  566. pDC->TextOut(nTextLeft,nTextTop,strText);
  567. }*/
  568. CString strText;
  569. this->GetWindowText(strText);
  570. rect.left +=2;
  571. rect.top +=2;
  572. if(strText.Find ("\r\n")==-1)
  573. AutoDraw2(pDC, rect, strText, 1.1);
  574. else
  575. AutoDraw(pDC, rect, strText, 1.1);
  576. ///画下划线
  577. if(m_bUnderLine)
  578. {
  579. nTextLeft-=2;
  580. nTextTop=nTextTop+tm.tmHeight+1;
  581. UnderLinePen.CreatePen(PS_SOLID,1,m_crUnderLine);
  582. pOldPen=pDC->SelectObject(&UnderLinePen);
  583. pDC->MoveTo(nTextLeft,nTextTop);
  584. pDC->LineTo(nTextLeft+tm.tmAveCharWidth*strText.GetLength(),nTextTop);
  585. }
  586. MemDC.DeleteDC ();
  587. ReleaseDC(pDC);
  588. }