PeerInfo.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:18k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // PeerInfo.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "PeerInfo.h"
  6. #include "PeersListCtrl.h"
  7. #include "FileBase.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define ID_MENUITEM_PAUSE_PEERS 52834
  14. #define ID_MENUITEM_CONTINUE_PEERS ID_MENUITEM_PAUSE_PEERS+1
  15. #define ID_MENUITEM_STOP_PEERS ID_MENUITEM_PAUSE_PEERS+2
  16. #define ID_MENUITEM_SHOW_PEERS_LIST ID_MENUITEM_PAUSE_PEERS+3
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CPeerInfo
  19. CPeerInfo::CPeerInfo() : CScrollWndbase(CRect (0, 0, 600, 260))
  20. {
  21. m_pPeersListCtrl = 0;
  22. m_lGridWidth = 5;
  23. memset(m_bRefreshItem, false, eAllCount);
  24. m_bAbort = false;
  25. m_bMonitoring = false;
  26. }
  27. CPeerInfo::~CPeerInfo()
  28. {
  29. }
  30. BEGIN_MESSAGE_MAP(CPeerInfo, CScrollWndbase)
  31. //{{AFX_MSG_MAP(CPeerInfo)
  32. ON_WM_PAINT()
  33. ON_WM_LBUTTONDBLCLK()
  34. ON_WM_LBUTTONDOWN()
  35. ON_WM_CREATE()
  36. ON_WM_ERASEBKGND()
  37. ON_WM_CONTEXTMENU()
  38. ON_WM_RBUTTONDOWN()
  39. //}}AFX_MSG_MAP
  40. ON_COMMAND_RANGE(ID_MENUITEM_PAUSE_PEERS, ID_MENUITEM_SHOW_PEERS_LIST, OnMenuItemPeers)
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CPeerInfo message handlers
  44. BOOL CPeerInfo::CreateEx(CWnd *pParent, CRect rc, CPeersListCtrl * pPeersListCtrl, long lID, long lParam)
  45. {
  46. m_pPeersListCtrl = pPeersListCtrl;
  47. return Create(0, 0, WS_CHILD|WS_BORDER|WS_VISIBLE, rc, pParent, lID);
  48. }
  49. int CPeerInfo::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  50. {
  51. if (CScrollWndbase::OnCreate(lpCreateStruct) == -1)
  52. return -1;
  53. m_font.CreateFont(-12, 0, 0, 0, 400, 0, 0, 0, 134, 0, 0, 0, 2, "宋体");
  54. m_graphHaveData.Create(CRect(20, 220, 600, 240), this);
  55. m_IPLocator.Create(GetDefaultModulePath());
  56. return 0;
  57. }
  58. void CPeerInfo::OnScrollEx()
  59. {
  60. CRect rc;
  61. GetClientRect(rc);
  62. CClientDC dc(this); // device context for painting
  63. CBitmap bmp;
  64. bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
  65. CDC memdc;
  66. memdc.CreateCompatibleDC(&dc);
  67. CGdiObject* pold = memdc.SelectObject(&bmp);
  68. EraseBk(memdc, rc);
  69. DrawItem(memdc);
  70. dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);
  71. memdc.SelectObject(pold);
  72. // OnPaint();
  73. // Invalidate();
  74. }
  75. void CPeerInfo::OnPaint() 
  76. {
  77. CPaintDC dc(this); // device context for painting
  78. DrawItem(dc);
  79. TRACE("rn Peer Info npaintrn");
  80. }
  81. BOOL CPeerInfo::OnEraseBkgnd(CDC* pDC) 
  82. {
  83. CRect rc;
  84.     pDC->GetClipBox(&rc);
  85. EraseBk(*pDC, rc);
  86. return TRUE;
  87. return CScrollWndbase::OnEraseBkgnd(pDC);
  88. }
  89. void CPeerInfo::EraseBk(CDC & dc, CRect rc) 
  90. {
  91. dc.FillRect(rc, &CBrush(RGB(255, 255, 255)));
  92. }
  93. void CPeerInfo::DrawItem(CDC & dc, bool bPart) 
  94. {
  95. CPoint ptTopLeft = GetTopLeft();
  96. dc.SetBkMode(TRANSPARENT);
  97. CFont* pOldFont = dc.SelectObject(&m_font);
  98. CRect rc;
  99. // GetClientRect(rc);
  100. // dc.FillRect(rc, &CBrush(RGB(255, 255, 255)));
  101. CRect rcTitle(20, 20, 170, 40);
  102. CRect rcContent(170, 20, 450, 40);
  103. rcTitle.OffsetRect(-ptTopLeft.x, -ptTopLeft.y);
  104. rcContent.OffsetRect(-ptTopLeft.x, -ptTopLeft.y);
  105. CString szText;
  106. //
  107. if (!bPart || (bPart && m_bRefreshItem[eAddr]))
  108. {
  109. if (bPart)
  110. {
  111. EraseBk(dc, rcTitle);
  112. EraseBk(dc, rcContent);
  113. }
  114. CFont fontHead;
  115. fontHead.CreateFont(-12, 0, 0, 0, FW_BOLD, 0, 0, 0, 134, 0, 0, 0, 2, "宋体");
  116. CFont* poldfont = dc.SelectObject(&fontHead);
  117. in_addr inaddress;
  118. inaddress.S_un.S_addr = m_conData.m_lAddr;
  119. szText.Format("%s:%d", inet_ntoa(inaddress), ntohs(m_conData.m_sPort));
  120. dc.DrawText(szText, rcTitle, DT_LEFT);
  121. dc.DrawText(m_strIPName, rcContent, DT_LEFT);
  122. dc.SelectObject(poldfont);
  123. }
  124. //
  125. rcTitle.OffsetRect(0, rcTitle.Height());
  126. rcContent.OffsetRect(0, rcContent.Height());
  127. if (!bPart || (bPart && m_bRefreshItem[ePeerId]))
  128. {
  129. if (bPart)
  130. {
  131. EraseBk(dc, rcTitle);
  132. EraseBk(dc, rcContent);
  133. }
  134. dc.DrawText("PeerId", rcTitle, DT_LEFT);
  135. szText = m_conData.m_strPeerId.data();
  136. dc.DrawText(szText, rcContent, DT_LEFT);
  137. }
  138. rcTitle.OffsetRect(0, rcTitle.Height());
  139. rcContent.OffsetRect(0, rcContent.Height());
  140. if (!bPart)
  141. {
  142. dc.MoveTo(GetRect().left + 20 - ptTopLeft.x, rcTitle.top);
  143. dc.LineTo(GetRect().right, rcTitle.top);
  144. }
  145. //
  146. rcTitle.OffsetRect(0, rcTitle.Height());
  147. rcContent.OffsetRect(0, rcContent.Height());
  148. if (!bPart || (bPart && m_bRefreshItem[eDownRate]))
  149. {
  150. if (bPart)
  151. {
  152. EraseBk(dc, rcTitle);
  153. EraseBk(dc, rcContent);
  154. }
  155. dc.DrawText("下载速度", rcTitle, DT_LEFT);
  156. szText = FormatSizeK(m_conData.m_lDownRate).data();
  157. dc.DrawText(szText, rcContent, DT_LEFT);
  158. }
  159. //
  160. rcTitle.OffsetRect(0, rcTitle.Height());
  161. rcContent.OffsetRect(0, rcContent.Height());
  162. if (!bPart || (bPart && m_bRefreshItem[eUpRate]))
  163. {
  164. if (bPart)
  165. {
  166. EraseBk(dc, rcTitle);
  167. EraseBk(dc, rcContent);
  168. }
  169. dc.DrawText("上传速度", rcTitle, DT_LEFT);
  170. szText = FormatSizeK(m_conData.m_lUpRate).data();
  171. dc.DrawText(szText, rcContent, DT_LEFT);
  172. }
  173. //
  174. rcTitle.OffsetRect(0, rcTitle.Height());
  175. rcContent.OffsetRect(0, rcContent.Height());
  176. if (!bPart || (bPart && m_bRefreshItem[eInterested]))
  177. {
  178. if (bPart)
  179. {
  180. EraseBk(dc, rcTitle);
  181. EraseBk(dc, rcContent);
  182. }
  183. if (m_conData.m_bInterested)
  184. {
  185. szText = "该点需要你的数据";
  186. dc.DrawText(szText, rcTitle, DT_LEFT);
  187. if (m_conData.m_bChoking)
  188. szText = "你拒绝传输数据";
  189. else
  190. szText = "你同意传输数据";
  191. dc.DrawText(szText, rcContent, DT_LEFT);
  192. }
  193. else
  194. {
  195. szText = "该点不需要你的数据";
  196. dc.DrawText(szText, rcTitle, DT_LEFT);
  197. }
  198. }
  199. rcTitle.OffsetRect(0, rcTitle.Height());
  200. rcContent.OffsetRect(0, rcContent.Height());
  201. if (!bPart || (bPart && m_bRefreshItem[eInteresting]))
  202. {
  203. if (bPart)
  204. {
  205. EraseBk(dc, rcTitle);
  206. EraseBk(dc, rcContent);
  207. }
  208. if (m_conData.m_bInteresting)
  209. {
  210. szText = "你需要该点的数据";
  211. dc.DrawText(szText, rcTitle, DT_LEFT);
  212. if (m_conData.m_bChoked)
  213. szText = "该点拒绝传输数据";
  214. else
  215. szText = "该点同意传输数据";
  216. dc.DrawText(szText, rcContent, DT_LEFT);
  217. }
  218. else
  219. {
  220. szText = "你不需要该点的数据";
  221. dc.DrawText(szText, rcTitle, DT_LEFT);
  222. }
  223. }
  224. //
  225. rcTitle.OffsetRect(0, rcTitle.Height());
  226. rcContent.OffsetRect(0, rcContent.Height());
  227. if (!bPart || (bPart && m_bRefreshItem[eState]))
  228. {
  229. if (bPart)
  230. {
  231. EraseBk(dc, rcTitle);
  232. EraseBk(dc, rcContent);
  233. }
  234. dc.DrawText("当前状态", rcTitle, DT_LEFT);
  235. if (m_bAbort)
  236. {
  237. szText = "已经中断";
  238. COLORREF colold = dc.SetTextColor(RGB(255, 0, 0));
  239. dc.DrawText(szText, rcContent, DT_LEFT);
  240. dc.SetTextColor(colold);
  241. }
  242. else
  243. {
  244. if (m_conData.m_bPaused)
  245. {
  246. szText = "暂停";
  247. }
  248. else if (m_conData.m_lDownRate > 0)
  249. {
  250. szText = "正在下载数据";
  251. }
  252. else if (m_conData.m_lUpRate > 0)
  253. {
  254. szText = "正在上传数据";
  255. }
  256. else
  257. {
  258. szText = "等待传送数据...";
  259. }
  260. // szText.Format("%.0f%%", m_conData.m_fPeerHavePercent*100);
  261. dc.DrawText(szText, rcContent, DT_LEFT);
  262. }
  263. }
  264. //
  265. rcTitle.OffsetRect(0, rcTitle.Height());
  266. rcContent.OffsetRect(0, rcContent.Height());
  267. if (!bPart)
  268. {
  269. dc.MoveTo(GetRect().left + 20 - ptTopLeft.x, rcTitle.top);
  270. dc.LineTo(GetRect().right, rcTitle.top);
  271. }
  272. //
  273. rcTitle.OffsetRect(0, rcTitle.Height());
  274. rcContent.OffsetRect(0, rcContent.Height());
  275. if (!bPart || (bPart && m_bRefreshItem[eDownCount]))
  276. {
  277. if (bPart)
  278. {
  279. EraseBk(dc, rcTitle);
  280. EraseBk(dc, rcContent);
  281. }
  282. dc.DrawText("已经下载", rcTitle, DT_LEFT);
  283. szText.Format("%.0f%%", m_conData.m_fPeerHavePercent*100);
  284. dc.DrawText(szText, rcContent, DT_LEFT);
  285. }
  286. dc.SelectObject(pOldFont);
  287. //
  288. // draw graph.
  289. //
  290. if (!bPart || (bPart && m_bRefreshItem[eSpeed]))
  291. {
  292. CRect rcSpeedGraph(450, 20, 600, 60);
  293. rcSpeedGraph.OffsetRect(-ptTopLeft.x, -ptTopLeft.y);
  294. // EraseBk(dc, rcSpeedGraph);
  295. PaintSpeedGraph(dc, rcSpeedGraph, false);
  296. }
  297. if (!bPart || (bPart && m_bRefreshItem[eHaves]))
  298. {
  299. // EraseBk(dc, rcSpeedGraph);
  300. m_graphHaveData.Draw(dc, CPoint(-ptTopLeft.x, -ptTopLeft.y));
  301. }
  302. }
  303. void CPeerInfo::OnLButtonDblClk(UINT nFlags, CPoint point) 
  304. {
  305. m_bMonitoring = false;
  306. ShowWindow(false);
  307. m_pPeersListCtrl->ShowWindow(true);
  308. m_pPeersListCtrl->SetFocus();
  309. CScrollWndbase::OnLButtonDblClk(nFlags, point);
  310. CScrollWndbase::OnLButtonDblClk(nFlags, point);
  311. }
  312. void CPeerInfo::OnLButtonDown(UINT nFlags, CPoint point) 
  313. {
  314. /*
  315. m_bMonitoring = false;
  316. ShowWindow(false);
  317. m_pPeersListCtrl->ShowWindow(true);
  318. m_pPeersListCtrl->SetFocus();
  319. CScrollWndbase::OnLButtonDblClk(nFlags, point);
  320. //*/
  321. SetFocus();
  322. CScrollWndbase::OnLButtonDown(nFlags, point);
  323. }
  324. void CPeerInfo::OnRButtonDown(UINT nFlags, CPoint point) 
  325. {
  326. SetFocus();
  327. CScrollWndbase::OnRButtonDown(nFlags, point);
  328. }
  329. void CPeerInfo::ClosePeer()
  330. {
  331. if (!m_bMonitoring)
  332. assert(false);
  333. if (m_bAbort) return;
  334. m_bAbort = true;
  335. // memset(m_bRefreshItem, false, eAllCount);
  336. Invalidate();
  337. }
  338. void CPeerInfo::ShowPeer(const CConncetionData& conData)
  339. {
  340. m_bAbort = false;
  341. if (m_bMonitoring)
  342. {
  343. memset(m_bRefreshItem, false, eAllCount);
  344. m_bRefreshItem[eSpeed] = true;
  345. m_bRefreshItem[eState] = true;
  346. if (m_conData.m_vHave.size() != conData.m_vHave.size() ||
  347. (long)(m_conData.m_fPeerHavePercent * 100) != (long)(conData.m_fPeerHavePercent * 100))
  348. {
  349. m_bRefreshItem[eHaves] = true;
  350. m_graphHaveData.SetData(conData.m_vHave);
  351. }
  352. if (m_conData.m_lAddr != conData.m_lAddr)
  353. {
  354. m_bRefreshItem[eAddr] = true;
  355. m_bRefreshItem[ePeerId] = true;
  356. if (m_IPLocator.IsCreate())
  357. {
  358. m_strIPName.Empty();
  359. if (!m_IPLocator.FindIPName(ntohl(conData.m_lAddr), m_strIPName))
  360. {
  361. m_strIPName = "未知IP地址";
  362. }
  363. }
  364. }
  365. if (m_conData.m_lDownRate != conData.m_lDownRate )
  366. {
  367. m_bRefreshItem[eDownRate] = true;
  368. }
  369. if (m_conData.m_lUpRate != conData.m_lUpRate)
  370. {
  371. m_bRefreshItem[eUpRate] = true;
  372. }
  373. if (m_conData.m_lDownCount != conData.m_lDownCount)
  374. {
  375. m_bRefreshItem[eDownCount] = true;
  376. }
  377. if (m_conData.m_lDownRate != conData.m_lDownRate )
  378. {
  379. m_bRefreshItem[eDownRate] = true;
  380. }
  381. if (m_conData.m_lDownRate != conData.m_lDownRate )
  382. {
  383. m_bRefreshItem[eDownRate] = true;
  384. }
  385. if (m_conData.m_bInterested != conData.m_bInterested ||
  386. m_conData.m_bChoking != conData.m_bChoking)
  387. {
  388. m_bRefreshItem[eInterested] = true;
  389. }
  390. if (m_conData.m_bInteresting != conData.m_bInteresting ||
  391. m_conData.m_bChoked != conData.m_bChoked)
  392. {
  393. m_bRefreshItem[eInteresting] = true;
  394. }
  395. }
  396. //*/
  397. m_conData = conData;
  398. if (!m_bMonitoring)
  399. {
  400. if (m_IPLocator.IsCreate())
  401. {
  402. m_strIPName.Empty();
  403. if (!m_IPLocator.FindIPName(ntohl(conData.m_lAddr), m_strIPName))
  404. {
  405. m_strIPName = "未知IP地址";
  406. }
  407. }
  408. m_graphHaveData.SetData(m_conData.m_vHave);
  409. Invalidate();
  410. if (GetTopLeft() != CPoint(0, 0))
  411. ResetPos();
  412. }
  413. else
  414. {
  415. CClientDC dc(this);
  416. DrawItem(dc, true);
  417. }
  418. m_bMonitoring = true;
  419. }
  420. bool CPeerInfo::IsMonitoring()
  421. {
  422. return m_bMonitoring;
  423. }
  424. void CPeerInfo::PaintSpeedGraph(CDC& dc, CRect rc, bool bShowText) 
  425. {
  426. //
  427. // Get rect.
  428. //
  429. CRect rcText = rc;
  430. rcText.bottom = rcText .top + 10;
  431. DrawFace(RGB(255, 255, 255), RGB(213, 232, 245), rc, rc, &dc);
  432. CRect rcUp = rc;
  433. rcUp.top += 10;
  434. rcUp.bottom -= 2;
  435. if (rc.Width() < 100)
  436. bShowText = false;
  437. if (bShowText)
  438. {
  439. rcUp.bottom -= 20;
  440. }
  441. // rcUp.right = rcUp.left + rcUp.Width()/2;
  442. CRect rcDown = rcUp;
  443. // rcUp.OffsetRect(rcUp.Width(), 0);
  444. CRect rcSpeed = rc;
  445. rcSpeed.top = rcSpeed.bottom - 20;
  446. CRect rcSpeedFrame = rcSpeed;
  447. rcSpeed.right = rcSpeed.left + rcSpeed.Width()/2;
  448. //
  449. // Get max value.
  450. //
  451. int iVisibleCount = rcUp.Width()/m_lGridWidth + 1;
  452. long lMax = 5;
  453. long lRet = GetMaxValue(m_conData.m_lValueUp, iVisibleCount);
  454. if (lRet > lMax ) lMax = lRet;
  455. lRet = GetMaxValue(m_conData.m_lValueDown, iVisibleCount);
  456. if (lRet > lMax ) lMax = lRet;
  457. if (lMax %5)
  458. lMax = (lMax/5 + 1) * 5;
  459. assert (lMax > 0);
  460. //
  461. // ShowText
  462. //
  463. dc.SetBkMode(TRANSPARENT);
  464. CFont* pOldFont = dc.SelectObject(&m_font);
  465. CString strText;
  466. strText.Format("%dK/S", lMax);
  467. dc.SetTextColor(RGB(0, 0, 0));
  468. dc.DrawText(strText, rcText, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
  469. dc.SelectObject(pOldFont);
  470. //
  471. // draw graph.
  472. //
  473. DrawLine(m_conData.m_lValueDown, dc, RGB(125, 172, 249), rcDown, lMax , iVisibleCount);
  474. DrawLine(m_conData.m_lValueUp, dc, RGB(249, 152, 111), rcUp, lMax, iVisibleCount);
  475. //
  476. // draw splitter.
  477. //
  478. CPen curPen;
  479. curPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
  480. CPen* pOldPen = dc.SelectObject(&curPen);
  481. if (bShowText)
  482. {
  483. dc.MoveTo(rcSpeedFrame.left, rcSpeedFrame.top);
  484. dc.LineTo(rcSpeedFrame.right, rcSpeedFrame.top);
  485. }
  486. dc.MoveTo(rcUp.right, rcUp.bottom);
  487. dc.LineTo(rcUp.right, rc.top);
  488. dc.SelectObject(pOldPen);
  489. dc.Draw3dRect(rc, RGB(0, 0, 0), RGB(0,0,0));
  490. }
  491. long CPeerInfo::GetMaxValue( long lValue[], long lCount)
  492. {
  493. long lMax = 5;
  494. long lDone = 0;
  495. for (int i=m_conData.m_lIndex; i<CConnection::eCount; i++)
  496. {
  497. if (lValue[i] > lMax)
  498. lMax = lValue[i];
  499. if (++lDone > lCount)
  500. return lMax;
  501. }
  502. for (i=0; i<m_conData.m_lIndex; i++)
  503. {
  504. if (lValue[i] > lMax)
  505. lMax = lValue[i];
  506. if (++lDone > lCount)
  507. return lMax;
  508. }
  509. return lMax;
  510. }
  511. void CPeerInfo::DrawLine(long lValue[], CDC& dc, COLORREF cor, CRect& rc, long lMax, long iVisibleCount) 
  512. {
  513. if (lMax <= 0)
  514. {
  515. assert(false);
  516. return;
  517. }
  518. long lDone = 0;
  519. long ileft = rc.left;
  520. int iHeight = rc.Height();
  521. float fUnit = (float)iHeight / lMax ;
  522. if (iHeight < 0)
  523. return;
  524. CPen curPen;
  525. curPen.CreatePen(PS_SOLID, 1, cor);
  526. CPen* pOldPen = dc.SelectObject(&curPen);
  527. dc.MoveTo(ileft, rc.bottom - (long)(lValue[m_conData.m_lIndex] * fUnit));
  528. ileft += m_lGridWidth;
  529. for (int i=m_conData.m_lIndex + 1; i<CConnection::eCount; i++)
  530. {
  531. if (lDone++ > iVisibleCount)
  532. break;
  533. dc.LineTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  534. dc.MoveTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  535. ileft += m_lGridWidth;
  536. }
  537. for (i=0; i<m_conData.m_lIndex; i++)
  538. {
  539. if (lDone++ > iVisibleCount)
  540. break;
  541. dc.LineTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  542. dc.MoveTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  543. ileft += m_lGridWidth;
  544. }
  545. dc.SelectObject(pOldPen);
  546. }
  547. void CPeerInfo::DrawFace(COLORREF Top, COLORREF Bottom, CRect& rc, CRect CalRc, CDC* pDC)
  548. {
  549. if (!CalRc.Height())
  550. return;
  551. int R, G, B;
  552. R = (GetRValue(Top) - GetRValue(Bottom)) / CalRc.Height();
  553. G = (GetGValue(Top) - GetGValue(Bottom)) / CalRc.Height();
  554. B = (GetBValue(Top) - GetBValue(Bottom)) / CalRc.Height();
  555. int ColR = GetRValue(Top), ColG = GetGValue(Top), ColB = GetBValue(Top);
  556. COLORREF ColMax = Top > Bottom ? Top : Bottom;
  557. COLORREF ColMin = Top > Bottom ? Bottom: Top;
  558. for(int i=0; i<rc.Height(); i++)
  559. {
  560. ColR -= R;
  561. ColG -= G;
  562. ColB -= B;
  563. CPen Pen;
  564. Pen.CreatePen(PS_SOLID, 1, RGB(ColR, ColG, ColB));
  565. CPen* pOldPen = pDC->SelectObject(&Pen);
  566. // pDC->SelectObject(&Pen);
  567. pDC->MoveTo(rc.left, rc.top+i);
  568. pDC->LineTo(rc.right, rc.top+i);
  569. pDC->SelectObject(pOldPen);
  570. Pen.DeleteObject();
  571. }
  572. }
  573. CString CPeerInfo::GetDefaultModulePath()
  574. {
  575. // get the directory in which the exe file exist.
  576. char szModuleFileName[1024] = {0};
  577. if (!GetModuleFileName(AfxGetApp()->m_hInstance, szModuleFileName, 1024))
  578. {
  579. assert(false);
  580. return "";
  581. }
  582. char path_buffer[_MAX_PATH];
  583. char drive[_MAX_DRIVE];
  584. char dir[_MAX_DIR];
  585. char fname[_MAX_FNAME];
  586. char ext[_MAX_EXT];
  587. _splitpath(szModuleFileName, drive, dir, fname, ext );
  588. _makepath(path_buffer, drive, dir, 0, 0);
  589. string strDatabasePath = path_buffer;
  590. if (strDatabasePath.size() <= 0)
  591. {
  592. assert(false);
  593. return "";
  594. }
  595. if (strDatabasePath[strDatabasePath.size() - 1] != '\')
  596. strDatabasePath+= '\';
  597. strDatabasePath += "ip.dat";
  598. return strDatabasePath.data();
  599. }
  600. void CPeerInfo::OnContextMenu(CWnd* pWnd, CPoint point) 
  601. {
  602. bool bContinue = false, bPause = false, bClose = false;
  603. CMenu menu_bar;
  604. menu_bar.CreatePopupMenu();
  605. if (m_bMonitoring)
  606. {
  607. if (!m_bAbort)
  608. {
  609. bContinue = m_conData.m_bPaused ? true : false;
  610. bPause = m_conData.m_bPaused ? false : true;
  611. bClose = true;
  612. }
  613. else
  614. {
  615. bContinue = bPause  = bClose = false;
  616. }
  617. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_SHOW_PEERS_LIST, "返回到连接列表(&B)t");
  618. menu_bar.AppendMenu(MF_SEPARATOR);
  619. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_CONTINUE_PEERS, "继续选中的连接(&X)t");
  620. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_PAUSE_PEERS, "暂停选中的连接(&P)t");
  621. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_STOP_PEERS, "关闭选中的连接(&Q)t");
  622. menu_bar.EnableMenuItem(ID_MENUITEM_SHOW_PEERS_LIST, MF_BYCOMMAND | MF_ENABLED);
  623. menu_bar.EnableMenuItem(ID_MENUITEM_CONTINUE_PEERS, MF_BYCOMMAND | 
  624. (bContinue ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  625. menu_bar.EnableMenuItem(ID_MENUITEM_PAUSE_PEERS, MF_BYCOMMAND | 
  626. (bPause ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  627. menu_bar.EnableMenuItem(ID_MENUITEM_STOP_PEERS, MF_BYCOMMAND | 
  628. (bClose ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  629. }
  630. CPoint posMouse;
  631. GetCursorPos(&posMouse);
  632. menu_bar.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,posMouse.x,posMouse.y,this);
  633. }
  634. void CPeerInfo::OnMenuItemPeers(UINT uID)
  635. {
  636. if (!m_bMonitoring || !m_pPeersListCtrl || (m_bAbort&& uID != ID_MENUITEM_SHOW_PEERS_LIST))
  637. {
  638. assert(false);
  639. return;
  640. }
  641. switch (uID)
  642. {
  643. case ID_MENUITEM_CONTINUE_PEERS:
  644. {
  645. assert(m_conData.m_bPaused);
  646. m_conData.m_bPaused = false;
  647. ShowPeer(m_conData);
  648. }
  649. break;
  650. case ID_MENUITEM_PAUSE_PEERS:
  651. {
  652. assert(!m_conData.m_bPaused);
  653. m_conData.m_bPaused = true;
  654. ShowPeer(m_conData);
  655. }
  656. break;
  657. case ID_MENUITEM_STOP_PEERS:
  658. {
  659. ClosePeer();
  660. }
  661. break;
  662. case ID_MENUITEM_SHOW_PEERS_LIST:
  663. {
  664. m_bMonitoring = false;
  665. ShowWindow(false);
  666. m_pPeersListCtrl->ShowWindow(true);
  667. m_pPeersListCtrl->SetFocus();
  668. return;
  669. }
  670. break;
  671. default:
  672. {
  673. assert(false);
  674. return;
  675. }
  676. }
  677. m_pPeersListCtrl->OnMenuItemPeerInfo(uID, m_conData);
  678. }