Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
5.8 KiB

  1. /*
  2. * t h u m b . c p
  3. *
  4. * Purpose:
  5. * ThumbNail control
  6. *
  7. * History
  8. * August '96: brettm - created
  9. *
  10. * Copyright (C) Microsoft Corp. 1995, 1996.
  11. */
  12. #include <pch.hxx>
  13. #include <resource.h>
  14. #include "ourguid.h"
  15. #include "mshtml.h"
  16. #include "mshtmcid.h"
  17. #include "oleutil.h"
  18. #include "shlwapi.h"
  19. #include "thumb.h"
  20. #include "docobj.h"
  21. #include "shlobjp.h"
  22. ASSERTDATA
  23. /*
  24. * m a c r o s
  25. */
  26. /*
  27. * t y p e d e f s
  28. */
  29. typedef struct THUMBDATA_tag
  30. {
  31. HBITMAP hBmp;
  32. HPALETTE hPal;
  33. } THUMBDATA, * PTHUMBDATA;
  34. /*
  35. * c o n s t a n t s
  36. */
  37. /*
  38. * g l o b a l s
  39. */
  40. /*
  41. * f u n c t i o n p r o t y p e s
  42. */
  43. extern UINT GetCurColorRes(void);
  44. /*
  45. * f u n c t i o n s
  46. */
  47. LRESULT CALLBACK ThumbNailWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  48. {
  49. LPUNKNOWN pUnk;
  50. HBITMAP hBmp;
  51. PTHUMBDATA pThumbData;
  52. HDC hdc,
  53. hdcMem;
  54. PAINTSTRUCT ps;
  55. RECT rc;
  56. HPALETTE hPalPrev;
  57. switch(msg)
  58. {
  59. case WM_CREATE:
  60. if (!MemAlloc ((LPVOID *)&pThumbData, sizeof(THUMBDATA)))
  61. return -1;
  62. pThumbData->hBmp = NULL;
  63. pThumbData->hPal = NULL;
  64. hdc = GetDC(NULL);
  65. if (hdc)
  66. {
  67. if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
  68. pThumbData->hPal = SHCreateShellPalette(hdc);
  69. ReleaseDC(NULL, hdc);
  70. }
  71. SetWndThisPtr(hwnd, pThumbData);
  72. return 0;
  73. case WM_NCDESTROY:
  74. pThumbData = (PTHUMBDATA)GetWndThisPtr(hwnd);
  75. if (pThumbData)
  76. {
  77. if (pThumbData->hBmp)
  78. DeleteObject(pThumbData->hBmp);
  79. if (pThumbData->hPal)
  80. DeleteObject(pThumbData->hPal);
  81. MemFree(pThumbData);
  82. }
  83. break;
  84. case WM_PAINT:
  85. pThumbData = (PTHUMBDATA)GetWndThisPtr(hwnd);
  86. if (!pThumbData)
  87. break;
  88. hdc=BeginPaint(hwnd, &ps);
  89. if (hdc)
  90. {
  91. if (pThumbData->hBmp)
  92. {
  93. GetClientRect(hwnd, &rc);
  94. hdcMem = CreateCompatibleDC(hdc);
  95. if (hdcMem)
  96. {
  97. HBITMAP hBmpOld;
  98. hBmpOld = (HBITMAP)SelectObject(hdcMem, pThumbData->hBmp);
  99. hPalPrev=NULL;
  100. if (pThumbData->hPal)
  101. {
  102. hPalPrev = SelectPalette(hdc, pThumbData->hPal, TRUE);
  103. RealizePalette(hdc);
  104. }
  105. BitBlt(hdc, 0, 0, rc.right-rc.left, rc.bottom-rc.top, hdcMem, 0, 0, SRCCOPY);
  106. if (hPalPrev)
  107. {
  108. SelectPalette(hdc, hPalPrev, TRUE);
  109. RealizePalette(hdc);
  110. }
  111. SelectObject(hdcMem, hBmpOld);
  112. DeleteDC(hdcMem);
  113. }
  114. }
  115. EndPaint(hwnd, &ps);
  116. }
  117. return 0;
  118. case THM_LOADPAGE:
  119. if (lParam)
  120. {
  121. WCHAR _szPathW[MAX_PATH];
  122. LONG lRet=-1;
  123. // if we're already showing a bitmap, release it and get a new one...
  124. pThumbData = (PTHUMBDATA)GetWndThisPtr(hwnd);
  125. if (!pThumbData)
  126. return -1;
  127. if (pThumbData->hBmp)
  128. {
  129. DeleteObject(pThumbData->hBmp);
  130. pThumbData->hBmp=NULL;
  131. }
  132. if (!FAILED(CoCreateInstance(CLSID_HtmlThumbnailExtractor,
  133. NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
  134. IID_IUnknown, (LPVOID *)&pUnk)))
  135. {
  136. if (!FAILED(HrIPersistFileLoadW(pUnk, (LPWSTR)lParam)))
  137. {
  138. IExtractImage *pExtract;
  139. if (!FAILED(pUnk->QueryInterface(IID_IExtractImage, (LPVOID *)&pExtract)))
  140. {
  141. DWORD dwPri,
  142. dwFlags;
  143. dwPri = IEI_PRIORITY_MAX;
  144. dwFlags = 0;
  145. SIZE size;
  146. GetClientRect(hwnd, &rc);
  147. size.cx = rc.right - rc.left;
  148. size.cy = rc.bottom - rc.top;
  149. if (!FAILED(pExtract->GetLocation(_szPathW, MAX_PATH, &dwPri, &size, GetCurColorRes(), &dwFlags)))
  150. {
  151. if (!FAILED(pExtract->Extract(&hBmp)))
  152. {
  153. // set the bitmap and invalidate to update the view
  154. pThumbData->hBmp = hBmp;
  155. InvalidateRect(hwnd, NULL, TRUE);
  156. lRet=0;
  157. }
  158. }
  159. pExtract->Release();
  160. }
  161. }
  162. pUnk->Release();
  163. }
  164. return lRet;
  165. }
  166. return -1;
  167. }
  168. return DefWindowProc(hwnd, msg, wParam, lParam);
  169. }