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

P2P编程

开发平台:

Visual C++

  1. // DragWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testBT.h"
  5. #include "DragWnd.h"
  6. #include "FileBase.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. #define WS_EX_LAYERED           0x00080000
  13. #define LWA_ALPHA 0x00000002
  14. #define DISPLAY_TIMEOUT_ID 2 
  15. const CString CDragWnd::m_strSection = "dragwnd";
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CDragWnd
  18. CDragWnd::CDragWnd() : m_defSize(150, 50)
  19. {
  20. m_pMainFrame = 0;
  21. m_pCategoryDownload = 0;
  22. m_bShowText = false;
  23. m_iEdge = 5;
  24. m_nOpacity = 150;
  25. m_bTransparent = false;
  26. SetLayeredWindowAttributes = 0;
  27. HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
  28. if (hUser32)
  29. {
  30. SetLayeredWindowAttributes = (pSetLayeredWindowAttributes)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
  31. }
  32. }
  33. CDragWnd::~CDragWnd()
  34. {
  35. }
  36. BEGIN_MESSAGE_MAP(CDragWnd, CWnd)
  37. //{{AFX_MSG_MAP(CDragWnd)
  38. ON_WM_PAINT()
  39. ON_WM_CONTEXTMENU()
  40. ON_WM_LBUTTONDBLCLK()
  41. ON_WM_LBUTTONDOWN()
  42. ON_WM_NCPAINT()
  43. ON_WM_CREATE()
  44. ON_WM_SIZE()
  45. //}}AFX_MSG_MAP
  46. ON_WM_GETMINMAXINFO()
  47. ON_WM_NCHITTEST()
  48. ON_WM_NCCALCSIZE()
  49. ON_WM_ERASEBKGND()
  50. ON_WM_TIMER()
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CDragWnd message handlers
  54. BOOL CDragWnd::CreateExtend(CWnd* pMainFrame, CCategoryDownload* pCategoryDownload)
  55. {
  56. ASSERT(pMainFrame && pCategoryDownload);
  57. m_pMainFrame = pMainFrame;
  58. m_pCategoryDownload = pCategoryDownload;
  59. CMonitorSpeedbase::CreateEx(pCategoryDownload, 12);
  60. const char* myWndClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS, ::LoadCursor(0, IDC_ARROW));
  61. BOOL bRet = CWnd::CreateEx(WS_EX_TOPMOST|WS_EX_TOOLWINDOW, myWndClass, "", 
  62.  WS_OVERLAPPED|WS_POPUP|WS_THICKFRAME, CRect(0, 0, 100, 100), 0, NULL);
  63. LoadState();
  64. return bRet;
  65. }
  66. void CDragWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
  67. {
  68. lpMMI->ptMinTrackSize.x = 80;
  69.     lpMMI->ptMinTrackSize.y = 50;
  70.     lpMMI->ptMaxTrackSize.x = 250;
  71.     lpMMI->ptMaxTrackSize.y = 100;
  72. }
  73. void CDragWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  74. {
  75. SendMessage(WM_LBUTTONUP);
  76. SendMessage(WM_SYSCOMMAND, 0xF012);
  77. }
  78. BOOL CDragWnd::OnEraseBkgnd(CDC* pDC) 
  79. {
  80.     CBrush backBrush(RGB(225, 245, 255));
  81.     CBrush* pOldBrush = pDC->SelectObject(&backBrush);
  82.     CRect rect;
  83.     pDC->GetClipBox(&rect);
  84.     pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),
  85.          PATCOPY);
  86.     pDC->SelectObject(pOldBrush);
  87.     return TRUE;
  88. }
  89. void CDragWnd::OnNcPaint() 
  90. {
  91. CWindowDC dc(this);
  92.     CRect rcClient, rc;
  93.     GetClientRect(rcClient);
  94.     ClientToScreen(rcClient);
  95.     GetWindowRect(rc);
  96.     rcClient.OffsetRect(-rc.TopLeft());
  97.     rc.OffsetRect(-rc.TopLeft());
  98. int l = 230, r = 100;
  99. for (int i=0;i<m_iEdge - 1; i++)
  100. {
  101. l -= 10;
  102. r += 10;
  103. dc.Draw3dRect(rc, RGB(l, l+10, l + 10), RGB(r, r+10, r+10));
  104. rc.DeflateRect(1, 1);
  105. }
  106. dc.Draw3dRect(rc, RGB(0, 0, 0), RGB(0, 0, 0));
  107. }
  108. void CDragWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  109. {
  110.     CRect rcClient = lpncsp->rgrc[0];
  111.     rcClient.DeflateRect(m_iEdge, m_iEdge);
  112.     lpncsp->rgrc[0] = rcClient;
  113. }
  114. void CDragWnd::OnSize(UINT nType, int cx, int cy) 
  115. {
  116. if (cx < 20 || cy < 20)
  117. {
  118. cx = 20;
  119. cy = 20;
  120. }
  121. CWnd::OnSize(nType, cx, cy);
  122. }
  123. UINT CDragWnd::OnNcHitTest(CPoint point) 
  124. {
  125. CRect rc, rcBar, rcEdge;
  126. GetWindowRect(rcBar);
  127.     for (int i = 0; i < 8; i++)
  128.         if (GetEdgeRect(rcBar, GetEdgeHTCode(i), rcEdge))
  129.             if (rcEdge.PtInRect(point)) 
  130. return GetEdgeHTCode(i);
  131. UINT iRet = CWnd::OnNcHitTest(point);
  132. return iRet;
  133. }
  134. UINT CDragWnd::GetEdgeHTCode(int nEdge)
  135. {
  136.     if (nEdge == 0) return HTLEFT;
  137.     if (nEdge == 1) return HTTOP;
  138.     if (nEdge == 2) return HTRIGHT;
  139.     if (nEdge == 3) return HTBOTTOM;
  140. if (nEdge == 4) return HTTOPLEFT;
  141. if (nEdge == 5) return HTTOPRIGHT;
  142. if (nEdge == 6) return HTBOTTOMLEFT;
  143. if (nEdge == 7) return HTBOTTOMRIGHT;
  144.     ASSERT(FALSE); // invalid edge no
  145.     return HTNOWHERE;
  146. }
  147. BOOL CDragWnd::GetEdgeRect(CRect rcWnd, UINT nHitTest,
  148.                                     CRect& rcEdge)
  149. {
  150.     rcEdge = rcWnd;
  151.     switch (nHitTest)
  152.     {
  153.     case HTLEFT:
  154.         rcEdge.right = rcEdge.left + m_iEdge;
  155. rcEdge.DeflateRect(0, m_iEdge);
  156.         break;
  157.     case HTTOP:
  158.         rcEdge.bottom = rcEdge.top + m_iEdge;
  159. rcEdge.DeflateRect(m_iEdge, 0);
  160.         break;
  161.     case HTRIGHT:
  162.         rcEdge.left = rcEdge.right - m_iEdge;
  163. rcEdge.DeflateRect(0, m_iEdge);
  164.         break;
  165.     case HTBOTTOM:
  166.         rcEdge.top = rcEdge.bottom - m_iEdge;
  167. rcEdge.DeflateRect(m_iEdge, 0);
  168.         break;
  169. case HTTOPLEFT:
  170.         rcEdge.bottom = rcEdge.top + m_iEdge;
  171. rcEdge.right = rcEdge.left + m_iEdge;
  172. break;
  173. case HTTOPRIGHT:
  174.         rcEdge.bottom = rcEdge.top + m_iEdge;
  175. rcEdge.left = rcEdge.right - m_iEdge;
  176. break;
  177. case HTBOTTOMLEFT:
  178.         rcEdge.top = rcEdge.bottom - m_iEdge;
  179. rcEdge.right = rcEdge.left + m_iEdge;
  180. break;
  181. case HTBOTTOMRIGHT:
  182.         rcEdge.top = rcEdge.bottom - m_iEdge;
  183. rcEdge.left = rcEdge.right - m_iEdge;
  184. break;
  185.     default:
  186.         ASSERT(FALSE); // invalid hit test code
  187.     }
  188.     return TRUE;
  189. }
  190. ////////////////////////////////////////////////////////////////////////////////
  191. // normal message.
  192. int CDragWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  193. {
  194. if (CWnd::OnCreate(lpCreateStruct) == -1)
  195. return -1;
  196. m_font.CreateFont(-12, 0, 0, 0, 400, 0, 0, 0, 134, 0, 0, 0, 2, "宋体");
  197. BOOL bRet = SetTimer(DISPLAY_TIMEOUT_ID, 1000, 0);
  198. ASSERT(bRet);
  199. return 0;
  200. }
  201. BOOL CDragWnd::DestroyWindow()
  202. {
  203. SaveState();
  204. return CWnd::DestroyWindow();
  205. }
  206. void CDragWnd::OnContextMenu(CWnd* pWnd, CPoint point) 
  207. {
  208. m_pMainFrame->PostMessage(WM_DRAGWND_NOTIFY , WM_CONTEXTMENU, 0);
  209. }
  210. void CDragWnd::OnLButtonDblClk(UINT nFlags, CPoint point) 
  211. {
  212. m_pMainFrame->PostMessage(WM_DRAGWND_NOTIFY , WM_LBUTTONDBLCLK, 0);
  213. CWnd::OnLButtonDblClk(nFlags, point);
  214. }
  215. void CDragWnd::LoadState()
  216. {
  217. int cx = GetSystemMetrics(SM_CXSCREEN);
  218. int cy = GetSystemMetrics(SM_CYSCREEN);
  219. CRect rcDefault(0, 0, m_defSize.x, m_defSize.y);
  220. rcDefault.OffsetRect(cx-200, cy-200);
  221. CRect rc(rcDefault);
  222. CString strKey = "l";
  223. rc.left = AfxGetApp()->GetProfileInt(m_strSection, strKey, rc.left);
  224. strKey = "t";
  225. rc.top = AfxGetApp()->GetProfileInt(m_strSection, strKey, rc.top);
  226. strKey = "r";
  227. rc.right = AfxGetApp()->GetProfileInt(m_strSection, strKey, rc.right);
  228. strKey = "b";
  229. rc.bottom = AfxGetApp()->GetProfileInt(m_strSection, strKey, rc.bottom);
  230. strKey = "ShowText";
  231. m_bShowText = AfxGetApp()->GetProfileInt(m_strSection, strKey, m_bShowText) != 0;
  232. //
  233. // check window size parameter.
  234. //
  235. rc.NormalizeRect();
  236. if (rc.right > cx || rc.left < 0 || rc.bottom > cy || rc.top < 0)
  237. rc = rcDefault;
  238. if (rc.Width() < 10)rc.right = rc.left + 20;
  239. if (rc.Height() < 10) rc.bottom += rc.top + 20;
  240. strKey = "visible";
  241. bool bVisible = AfxGetApp()->GetProfileInt(m_strSection, strKey, true) != 0;
  242. SetWindowPos(NULL, rc.left, rc.top , rc.Width(), rc.Height(), bVisible ? SWP_SHOWWINDOW : SWP_HIDEWINDOW);
  243. strKey = "opacity";
  244. m_nOpacity = AfxGetApp()->GetProfileInt(m_strSection, strKey, m_nOpacity);
  245. if (m_nOpacity> 255 || m_nOpacity < 0) m_nOpacity = 150;
  246. SetTransparentEx(TRUE, m_nOpacity);
  247. }
  248. void CDragWnd::SaveState()
  249. {
  250. CRect rc;
  251. GetWindowRect(rc);
  252. CString strKey = "l";
  253. BOOL bRet = AfxGetApp()->WriteProfileInt(m_strSection, strKey, rc.left);
  254. ASSERT(bRet);
  255. strKey = "t";
  256. AfxGetApp()->WriteProfileInt(m_strSection, strKey, rc.top);
  257. strKey = "r";
  258. AfxGetApp()->WriteProfileInt(m_strSection, strKey, rc.right);
  259. strKey = "b";
  260. AfxGetApp()->WriteProfileInt(m_strSection, strKey, rc.bottom);
  261. strKey = "visible";
  262. AfxGetApp()->WriteProfileInt(m_strSection, strKey, IsWindowVisible());
  263. strKey = "opacity";
  264. AfxGetApp()->WriteProfileInt(m_strSection, strKey, m_nOpacity);
  265. strKey = "ShowText";
  266. AfxGetApp()->WriteProfileInt(m_strSection, strKey, m_bShowText);
  267. }
  268. void CDragWnd::ShowText(bool bShowText)
  269. {
  270. m_bShowText = bShowText;
  271. Invalidate();
  272. }
  273. bool CDragWnd::IsShowText()
  274. {
  275. return m_bShowText;
  276. }
  277. int CDragWnd::GetOpacity()
  278. {
  279. return m_nOpacity;
  280. }
  281. BOOL CDragWnd::SetOpacity(int nOpacity)
  282. {
  283. if (!SetLayeredWindowAttributes)
  284. return FALSE;
  285. // if (nOpacity >= 0 && nOpacity <= 255)
  286. {
  287. m_nOpacity = nOpacity;
  288. if (m_bTransparent)
  289. {
  290. // update the transparency
  291. ASSERT(::IsWindow(m_hWnd));
  292. SetLayeredWindowAttributes(m_hWnd, 0, m_nOpacity, LWA_ALPHA);
  293. }
  294. return true;
  295. }
  296. return false;
  297. }
  298. void CDragWnd::SetTransparent(BOOL bTransparent)
  299. {
  300. if (!SetLayeredWindowAttributes)
  301. return ;
  302. if (bTransparent)
  303. {
  304. // make sure they have set it up properly
  305. ASSERT(m_nOpacity >= 0 && m_nOpacity <= 255);
  306. ASSERT(m_hWnd && ::IsWindow(m_hWnd));
  307. // make it transparent
  308. long l = GetWindowLong(m_hWnd, GWL_EXSTYLE);
  309. l |= WS_EX_LAYERED;
  310. SetWindowLong(m_hWnd, GWL_EXSTYLE, l);
  311. SetLayeredWindowAttributes(m_hWnd, 0, m_nOpacity, LWA_ALPHA);
  312. m_bTransparent = true;
  313. }
  314. else
  315. {
  316. long l = GetWindowLong(m_hWnd, GWL_EXSTYLE);
  317. l ^= WS_EX_LAYERED;
  318. SetWindowLong(m_hWnd, GWL_EXSTYLE, l);
  319. CRect r;
  320. ::GetWindowRect(m_hWnd, r);
  321. ::InvalidateRect(m_hWnd, r, true);
  322. m_bTransparent = false;
  323. }
  324. }
  325. BOOL CDragWnd::SetTransparentEx(BOOL bTransparent, int nOpacity)
  326. {
  327. // set members
  328. if (!SetOpacity(nOpacity)) return false;
  329. SetTransparent(bTransparent);
  330. return true;
  331. }
  332. bool CDragWnd::CanSetTransparent()
  333. {
  334. return SetLayeredWindowAttributes != 0;
  335. }
  336. void CDragWnd::SetStandardSize()
  337. {
  338. CRect rc;
  339. GetWindowRect(rc);
  340. rc.right = rc.left + m_defSize.x;
  341. rc.bottom = rc.top + m_defSize.y;
  342. MoveWindow(rc);
  343. }
  344. void CDragWnd::OnPaint() 
  345. {
  346. CPaintDC dc(this); // device context for painting
  347. CRect rc;
  348.     GetClientRect(rc);
  349. CMonitorSpeedbase::OnPaint(dc, rc, m_bShowText);
  350. }
  351. void CDragWnd::OnTimer(UINT nIDEvent) 
  352. {
  353. if (DISPLAY_TIMEOUT_ID != nIDEvent)
  354. return;
  355. CMonitorSpeedbase::OnTimer();
  356. Invalidate();
  357. }