clrzwind.cpp
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:4k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. Windows Live Messenger Plugin Demo
  3. Copyright (C) 2008  Hern醤 Di Pietro
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  14. /*****************************************************************************/
  15. #include "clrzwind.h"
  16. #include "wlmplugin.h"
  17. ATOM RegisterColorizedWndClass()
  18. {
  19. WNDCLASSEX wcex;
  20. ZeroMemory(&wcex, sizeof(WNDCLASSEX));
  21. wcex.lpszClassName  = wszColorizedWndClass;
  22. wcex.cbSize = sizeof(WNDCLASSEX);
  23. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  24. wcex.hInstance = hDllInst;
  25. wcex.lpfnWndProc = (WNDPROC)ColorizedWndProc;
  26. wcex.style = CS_DROPSHADOW;
  27. wcex.cbClsExtra = sizeof(COLORREF); // Global base color for class
  28. return RegisterClassEx(&wcex);
  29. }
  30. // Returns the stored color base from the window class
  31. //
  32. COLORREF GetClrzBaseColor(HWND hwnd)
  33. {
  34. return (COLORREF) GetClassLongPtr(hwnd, 0);
  35. }
  36. // Sets the base color for a colorized window class
  37. //
  38. void SetClrzBaseColor (HWND hwnd, COLORREF crBase)
  39. {
  40. SetClassLongPtr (hwnd, 0, (LONG_PTR) crBase);
  41. }
  42. // Window procedure for colorized windows
  43. // Specific processing must be done through subclassing.
  44. //
  45. LRESULT ColorizedWndProc (HWND hwnd, UINT uMsg, WPARAM wparam, LPARAM lparam)
  46. {
  47. COLORREF crBase;
  48. static HRGN hRegion = NULL;
  49. RECT wndRect;
  50. HDC hdc, hdcClient;
  51. UINT uHitTest;
  52. switch (uMsg)
  53. {
  54. case WM_CREATE:
  55. {
  56. POINT pt;
  57. // Set rounded-rect shape for the window
  58. GetClientRect(hwnd, &wndRect);
  59. pt.x = wndRect.right;
  60. pt.y = wndRect.bottom;
  61. ClientToScreen(hwnd, &pt);
  62. hRegion = CreateRoundRectRgn(0, 0, pt.x, pt.y, CX_RR_ELLIPSE, CY_RR_ELLIPSE);
  63. SetWindowRgn(hwnd, hRegion, TRUE);
  64. return 0L;
  65. }
  66. case WM_ERASEBKGND:
  67. // Fill gradient background and draw frame around the window region
  68. hdc = (HDC)wparam;
  69. crBase = GetClrzBaseColor(hwnd);
  70. GetClientRect(hwnd, &wndRect);
  71. TRIVERTEX        vert[2];
  72. GRADIENT_RECT    gRect;
  73. vert [0] .x      = 0;
  74. vert [0] .y      = 0;
  75. vert [0] .Red    = GetRValue(crBase)<<8;
  76. vert [0] .Green  = GetGValue(crBase)<<8;
  77. vert [0] .Blue   = GetBValue(crBase)<<8;
  78. vert [0] .Alpha  = 0x0000;
  79. vert [1] .x      = wndRect.right;
  80. vert [1] .y      = wndRect.bottom;
  81. vert [1] .Red    = max( 0, (GetRValue(crBase)<<8) - 0x4000);
  82. vert [1] .Green  = max( 0, (GetGValue(crBase)<<8) - 0x4000);
  83. vert [1] .Blue   = max( 0, (GetBValue(crBase)<<8) - 0x4000);
  84. vert [1] .Alpha  = 0x0000;
  85. gRect.UpperLeft  = 0; 
  86. gRect.LowerRight = 1;
  87. GradientFill(hdc, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_V);
  88. // Draw WLM-like border
  89. SelectObject(hdc,GetStockObject(DC_PEN));
  90. SetDCPenColor(hdc, CR_OUTERBORDERCOLOR);
  91. SelectObject(hdc,GetStockObject(HOLLOW_BRUSH));
  92. RoundRect(hdc, 0,0, wndRect.right - 1, wndRect.bottom - 1, 
  93. CX_RR_ELLIPSE, CY_RR_ELLIPSE );
  94. SetDCPenColor(hdc, CR_INNERBORDERCOLOR(crBase) );
  95. RoundRect(hdc, 1, 1, wndRect.right - 2, wndRect.bottom - 2, 
  96. CX_RR_ELLIPSE, CY_RR_ELLIPSE);
  97. return 1L;
  98. case WM_DESTROY:
  99. if (hRegion)
  100. DeleteObject(hRegion);
  101. PostQuitMessage(0);
  102. return 0L;
  103. case WM_UPDATEBASECOLOR:
  104. // Sets the base color from the WLM window and repaints itself
  105. // Get a pixel color at (50,1) from the WLM client area border
  106. hdcClient = GetDCEx (g_wlmTopWindow.hwnd, 0, DCX_CACHE);
  107. SetClrzBaseColor(hwnd, GetPixel (hdcClient, COLORSAMPLE_X, COLORSAMPLE_Y));
  108. ReleaseDC(g_wlmTopWindow.hwnd, hdcClient);
  109. InvalidateRect(hwnd, NULL, TRUE);
  110. return 0L;
  111. case WM_NCHITTEST:
  112. uHitTest = DefWindowProc(hwnd, WM_NCHITTEST, wparam, lparam);
  113. if(uHitTest == HTCLIENT)
  114. return HTCAPTION;
  115. else
  116. return uHitTest;
  117. default:
  118. return DefWindowProc (hwnd, uMsg, wparam, lparam);
  119. }
  120. return 0L;
  121. }