XTFunctions.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:14k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTFunctions.cpp : global functions.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPVC80Helpers.h"
  23. #include "Common/XTPColorManager.h"
  24. #include "Common/XTPResourceManager.h"
  25. #include "XTHelpers.h"
  26. #ifdef _XTP_INCLUDE_COMMANDBARS
  27. #include "CommandBars/XTPPaintManager.h"
  28. #include "CommandBars/XTPCommandBars.h"
  29. #include "CommandBars/XTPPopupBar.h"
  30. #include "Common/XTPImageManager.h"
  31. #endif
  32. #ifdef _DEBUG
  33. #define new DEBUG_NEW
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #endif
  37. //-----------------------------------------------------------------------------
  38. // helper function which sets the font for a window and all its children
  39. // and also resizes everything according to the new font
  40. //-----------------------------------------------------------------------------
  41. _XTP_EXT_CLASS void  AFXAPI XTFuncChangeWindowFont(CWnd* pWnd, CFont* pFont)
  42. {
  43. CRect windowRect;
  44. // grab old and new text metrics
  45. TEXTMETRIC tmOld, tmNew;
  46. CDC * pDC = pWnd->GetDC();
  47. CFont * pSavedFont = pDC->SelectObject(pWnd->GetFont());
  48. pDC->GetTextMetrics(&tmOld);
  49. pDC->SelectObject(pFont);
  50. pDC->GetTextMetrics(&tmNew);
  51. pDC->SelectObject(pSavedFont);
  52. pWnd->ReleaseDC(pDC);
  53. long oldHeight = tmOld.tmHeight + tmOld.tmExternalLeading;
  54. long newHeight = tmNew.tmHeight + tmNew.tmExternalLeading;
  55. // calculate new dialog window rectangle
  56. CRect clientRect, newClientRect, newWindowRect;
  57. pWnd->GetWindowRect(windowRect);
  58. pWnd->GetClientRect(clientRect);
  59. long xDiff = windowRect.Width() - clientRect.Width();
  60. long yDiff = windowRect.Height() - clientRect.Height();
  61. newClientRect.left = newClientRect.top = 0;
  62. newClientRect.right = clientRect.right * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
  63. newClientRect.bottom = clientRect.bottom * newHeight / oldHeight;
  64. newWindowRect.left = windowRect.left -
  65. (newClientRect.right - clientRect.right)/2;
  66. newWindowRect.top = windowRect.top -
  67. (newClientRect.bottom - clientRect.bottom)/2;
  68. newWindowRect.right = newWindowRect.left + newClientRect.right + xDiff;
  69. newWindowRect.bottom = newWindowRect.top + newClientRect.bottom + yDiff;
  70. pWnd->MoveWindow(newWindowRect);
  71. pWnd->SetFont(pFont);
  72. // iterate through and move all child windows and change their font.
  73. CWnd* pChildWnd = pWnd->GetWindow(GW_CHILD);
  74. while (pChildWnd)
  75. {
  76. pChildWnd->SetFont(pFont);
  77. pChildWnd->GetWindowRect(windowRect);
  78. CString strClass;
  79. ::GetClassName(pChildWnd->m_hWnd, strClass.GetBufferSetLength(32), 31);
  80. strClass.MakeUpper();
  81. if (strClass == _T("COMBOBOX"))
  82. {
  83. CRect rect;
  84. pChildWnd->SendMessage(CB_GETDROPPEDCONTROLRECT, 0, (LPARAM) &rect);
  85. windowRect.right = rect.right;
  86. windowRect.bottom = rect.bottom;
  87. }
  88. pWnd->ScreenToClient(windowRect);
  89. windowRect.left = windowRect.left * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
  90. windowRect.right = windowRect.right * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
  91. windowRect.top = windowRect.top * newHeight / oldHeight;
  92. windowRect.bottom = windowRect.bottom * newHeight / oldHeight;
  93. pChildWnd->MoveWindow(windowRect);
  94. pChildWnd = pChildWnd->GetWindow(GW_HWNDNEXT);
  95. }
  96. }
  97. //-----------------------------------------------------------------------------
  98. // FUNCTION: XTFuncDrawEmbossed
  99. //-----------------------------------------------------------------------------
  100. _XTP_EXT_CLASS void AFXAPI XTFuncDrawEmbossed(CDC* pDC, CImageList& imageList, int nIndex, CPoint point, BOOL bInColor)
  101. {
  102. IMAGEINFO imgInfo;
  103. VERIFY(imageList.GetImageInfo(0, &imgInfo));
  104. CRect rcImage = imgInfo.rcImage;
  105. // create memory dc
  106. CDC memDC;
  107. memDC.CreateCompatibleDC(pDC);
  108. // create mono or color bitmap
  109. CBitmap bitmap;
  110. if (bInColor)
  111. {
  112. bitmap.CreateCompatibleBitmap(pDC, rcImage.Width(), rcImage.Height());
  113. }
  114. else
  115. {
  116. bitmap.CreateBitmap(rcImage.Width(), rcImage.Height(), 1, 1, NULL);
  117. }
  118. // draw image into memory DC--fill BG white first
  119. CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
  120. memDC.PatBlt(0, 0, rcImage.Width(), rcImage.Height(), WHITENESS);
  121. imageList.Draw(&memDC, nIndex, CPoint(0, 0), ILD_TRANSPARENT);
  122. // Draw using highlight offset by (1, 1), then shadow
  123. CBrush brShadow(GetXtremeColor(COLOR_3DSHADOW));
  124. CBrush brHilite(GetXtremeColor(COLOR_3DHIGHLIGHT));
  125. CBrush* pOldBrush = pDC->SelectObject(&brHilite);
  126. pDC->BitBlt(point.x + 1, point.y + 1, rcImage.Width(), rcImage.Height(), &memDC, 0, 0, 0xB8074A);
  127. pDC->SelectObject(&brShadow);
  128. pDC->BitBlt(point.x, point.y, rcImage.Width(), rcImage.Height(), &memDC, 0, 0, 0xB8074A);
  129. pDC->SelectObject(pOldBrush);
  130. memDC.SelectObject(pOldBitmap);
  131. bitmap.DeleteObject();
  132. }
  133. //-----------------------------------------------------------------------------
  134. // FUNCTION: XTFuncDrawShadedRect
  135. //-----------------------------------------------------------------------------
  136. _XTP_EXT_CLASS void AFXAPI XTFuncDrawShadedRect(CDC *pDC, CRect& rect)
  137. {
  138. // Bit pattern for a monochrome brush with every
  139. // other pixel turned off
  140. WORD bits[] =
  141. {
  142. 0x0055, 0x00AA, 0x0055, 0x00AA,
  143. 0x0055, 0x00AA, 0x0055, 0x00AA
  144. };
  145. // Need a monochrome pattern bitmap
  146. CBitmap bitmap;
  147. bitmap.CreateBitmap(8, 8, 1, 1, &bits);
  148. // Create the pattern brush
  149. CBrush brush;
  150. brush.CreatePatternBrush(&bitmap);
  151. CBrush* pOldBrush = pDC->SelectObject(&brush);
  152. COLORREF crBack = pDC->SetBkColor(GetXtremeColor(COLOR_3DFACE));
  153. COLORREF crText = pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  154. pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
  155. // Restore the device context
  156. pDC->SelectObject(pOldBrush);
  157. pDC->SetBkColor(crBack);
  158. pDC->SetTextColor(crText);
  159. brush.DeleteObject();
  160. }
  161. //-----------------------------------------------------------------------------
  162. //  DIBs use RGBQUAD format:
  163. //      0xbb 0xgg 0xrr 0x00
  164. //
  165. //  Reasonably efficient code to convert a COLORREF into an
  166. //  RGBQUAD is byte-order-dependent, so we need different
  167. //  code depending on the byte order we're targeting.
  168. //-----------------------------------------------------------------------------
  169. #define RGB_TO_RGBQUAD(r, g, b) (RGB(b, g, r))
  170. #define RGBQUAD_INIT(r, g, b) (RGB_TO_RGBQUAD(r, g, b)), (RGB(r, g, b))
  171. #define CLR_TO_RGBQUAD(clr) (RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)))
  172. //-----------------------------------------------------------------------------
  173. // CXTReplaceColorHandler - Helper object to replace color in a given DC
  174. //-----------------------------------------------------------------------------
  175. class CXTReplaceColorHandler
  176. {
  177. public:
  178. // Input: pTargetDC - DC in which to replace colors
  179. //        nWidth - width of the rectangle to replace (starting from (0, 0))
  180. //        nHeight - height of the rectangle to replace the color (starting from (0, 0))
  181. // Summary: Constructor takes parameters common for the operation.
  182. CXTReplaceColorHandler(CDC* pTargetDC, int nWidth, int nHeight);
  183. // Summary:
  184. virtual ~CXTReplaceColorHandler();
  185. // Summary: Initialization, returns false if fails to initialize
  186. bool Init();
  187. // Summary: Replaces one color with another
  188. bool ReplaceColor(COLORREF clrFrom, COLORREF clrTo);
  189. protected:
  190. int         m_nWidth;
  191. int         m_nHeight;
  192. bool        m_bOldBitmap;   // true if m_pOldBitmap was initialized
  193. CDC         m_dcMask;       //
  194. CDC*        m_pTargetDC;    // a DC to replace colors in place
  195. CBitmap     m_bitmapMask;   // monochrome bitmap to work with
  196. CBitmap*    m_pOldBitmap;   // previously selected bitmap
  197. COLORREF    m_clrOldText;
  198. COLORREF    m_clrOldBk;
  199. };
  200. CXTReplaceColorHandler::CXTReplaceColorHandler(CDC* pTargetDC, int nWidth, int nHeight)
  201. : m_pOldBitmap(NULL)
  202. , m_bOldBitmap(false)
  203. , m_pTargetDC(pTargetDC)
  204. , m_clrOldBk(pTargetDC->GetBkColor())
  205. , m_clrOldText(pTargetDC->GetTextColor())
  206. , m_nWidth(nWidth)
  207. , m_nHeight(nHeight)
  208. {
  209. }
  210. CXTReplaceColorHandler::~CXTReplaceColorHandler()
  211. {
  212. if (m_bOldBitmap)
  213. {
  214. m_dcMask.SelectObject(m_pOldBitmap);
  215. }
  216. m_pTargetDC->SetBkColor(m_clrOldBk);
  217. m_pTargetDC->SetTextColor(m_clrOldText);
  218. }
  219. bool CXTReplaceColorHandler::Init()
  220. {
  221. if (!m_dcMask.CreateCompatibleDC(m_pTargetDC))
  222. {
  223. return false;
  224. }
  225. if (!m_bitmapMask.CreateBitmap(m_nWidth, m_nHeight, 1, 1, NULL))
  226. {
  227. return false;
  228. }
  229. m_pOldBitmap = m_dcMask.SelectObject(&m_bitmapMask);
  230. m_bOldBitmap = true;
  231. return true;
  232. }
  233. bool CXTReplaceColorHandler::ReplaceColor(COLORREF clrFrom, COLORREF clrTo)
  234. {
  235. // filter out trivial case
  236. if (clrFrom == clrTo)
  237. {
  238. return true;
  239. }
  240. // Initialize the mask:
  241. // 1. Set the background color of the source DC to the color to translate.
  242. // so 1s would be the bits where color match has been found
  243. // 2. Create the object mask for the bitmap by performing a BitBlt
  244. // from the source bitmap to a monochrome bitmap.
  245. m_pTargetDC->SetBkColor(clrFrom);
  246. if (!m_dcMask.BitBlt(0, 0, m_nWidth, m_nHeight, m_pTargetDC, 0, 0, SRCCOPY))
  247. {
  248. return false;
  249. }
  250. // zero out destination pixels we would want to replace with another color
  251. m_pTargetDC->SetTextColor(RGB(255, 255, 255));
  252. m_pTargetDC->SetBkColor(RGB(0, 0, 0));
  253. if (!m_pTargetDC->BitBlt(0, 0, m_nWidth, m_nHeight, &m_dcMask, 0, 0, SRCAND))
  254. {
  255. return false;
  256. }
  257. // now, replace zeroed pixels with destination color
  258. if (clrTo != RGB(0, 0, 0))
  259. {
  260. m_pTargetDC->SetBkColor(clrTo);
  261. m_pTargetDC->SetTextColor(RGB(0, 0, 0));
  262. if (!m_pTargetDC->BitBlt(0, 0, m_nWidth, m_nHeight, &m_dcMask, 0, 0, SRCPAINT))
  263. {
  264. return false;
  265. }
  266. }
  267. // done
  268. return true;
  269. }
  270. //-----------------------------------------------------------------------------
  271. // FUNCTION: XTFuncChildWindowFromPoint()
  272. //-----------------------------------------------------------------------------
  273. _XTP_EXT_CLASS HWND AFXAPI XTFuncChildWindowFromPoint(HWND hWnd, POINT point)
  274. {
  275. ASSERT(hWnd != NULL);
  276. if (!hWnd)
  277. return 0;
  278. // check child windows
  279. ::ClientToScreen(hWnd, &point);
  280. HWND hWndChild = ::GetWindow(hWnd, GW_CHILD);
  281. for (; hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
  282. {
  283. if ((UINT)(WORD)::GetDlgCtrlID(hWndChild) != (WORD)-1 &&
  284. (::GetWindowLong(hWndChild, GWL_STYLE) & WS_VISIBLE))
  285. {
  286. // see if point hits the child window
  287. CRect rect;
  288. ::GetWindowRect(hWndChild, rect);
  289. if (rect.PtInRect(point))
  290. return hWndChild;
  291. }
  292. }
  293. return NULL;    // not found
  294. }
  295. //-----------------------------------------------------------------------------
  296. // FUNCTION: XTFuncPathExists()
  297. //-----------------------------------------------------------------------------
  298. _XTP_EXT_CLASS BOOL AFXAPI XTFuncPathExists(LPCTSTR lpszFileName)
  299. {
  300. WIN32_FIND_DATA fd;
  301. HANDLE hFind = ::FindFirstFile(lpszFileName, &fd);
  302. if (hFind != INVALID_HANDLE_VALUE)
  303. {
  304. ::FindClose(hFind);
  305. return TRUE;
  306. }
  307. return FALSE;
  308. }
  309. //-----------------------------------------------------------------------------
  310. // FUNCTION: XTFuncCreateView()
  311. //-----------------------------------------------------------------------------
  312. _XTP_EXT_CLASS CWnd* AFXAPI XTFuncCreateView(CWnd* pParentWnd, CRuntimeClass *pViewClass, CDocument *pDocument/*= NULL*/, CCreateContext *pContext/*= NULL*/, DWORD dwStyle/*= AFX_WS_DEFAULT_VIEW*/, CWnd* pOwnerWnd/*= NULL*/, UINT nID/*= AFX_IDW_PANE_FIRST*/)
  313. {
  314. if (!pContext && !pViewClass)
  315. return NULL;
  316. #ifdef _DEBUG
  317. ASSERT(pContext != NULL || pViewClass != NULL);
  318. ASSERT(pContext != NULL || pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
  319. ASSERT(pContext != NULL || AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));
  320. #endif
  321. if (pOwnerWnd == NULL)
  322. pOwnerWnd = pParentWnd;
  323. CCreateContext contextT;
  324. if (pContext == NULL)
  325. {
  326. // if no context specified, generate one from the
  327. // currently selected client if possible.
  328. contextT.m_pLastView = NULL;
  329. contextT.m_pCurrentFrame = NULL;
  330. contextT.m_pNewDocTemplate = NULL;
  331. contextT.m_pCurrentDoc = pDocument;
  332. contextT.m_pNewViewClass = pViewClass;
  333. if (pDocument != NULL)
  334. contextT.m_pNewDocTemplate = pDocument->GetDocTemplate();
  335. pContext = &contextT;
  336. }
  337. if (!pContext->m_pNewViewClass)
  338. return NULL;
  339. CWnd* pWnd = NULL;
  340. TRY
  341. {
  342. pWnd = (CWnd*)pContext->m_pNewViewClass->CreateObject();
  343. if (pWnd == NULL)
  344. AfxThrowMemoryException();
  345. }
  346. CATCH_ALL(e)
  347. {
  348. TRACE0("Out of memory creating a view.n"); // Note: DELETE_EXCEPTION(e) not required
  349. return NULL;
  350. }
  351. END_CATCH_ALL
  352. ASSERT_KINDOF(CWnd, pWnd);
  353. ASSERT(pWnd->m_hWnd == NULL); // not yet created.
  354. // Create with the right size (wrong position)
  355. CRect rect(0, 0, 0, 0);
  356. if (!pWnd->Create(NULL, NULL, dwStyle,
  357. rect, pParentWnd, nID, pContext))
  358. {
  359. TRACE0("Failed to create docking window view.n");
  360. return NULL;
  361. }
  362. pWnd->SetOwner(pOwnerWnd);
  363. return pWnd;
  364. }
  365. _XTP_EXT_CLASS BOOL AFXAPI XTFuncContextMenu(CMenu* pPopup, UINT nFlags, int x, int y, CWnd* pWnd, int nIDBitmap, BOOL bNoNotify)
  366. {
  367. BOOL bResult = FALSE;
  368. nIDBitmap;
  369. bNoNotify;
  370. #ifdef _XTP_INCLUDE_COMMANDBARS
  371. if (XTPPaintManager())
  372. {
  373. CXTPPopupBar* pPopupBar = CXTPPopupBar::CreatePopupBar(NULL);
  374. if (nIDBitmap > 0)
  375. {
  376. CXTPImageManager* pImageManager = new CXTPImageManager();
  377. pImageManager->SetIcons(nIDBitmap);
  378. pPopupBar->SetImageManager(pImageManager);
  379. }
  380. if (!pPopupBar->LoadMenu(pPopup))
  381. {
  382. pPopupBar->InternalRelease();
  383. return bResult;
  384. }
  385. bResult = CXTPCommandBars::TrackPopupMenu(pPopupBar, nFlags | (bNoNotify ? TPM_NONOTIFY : 0), x, y, pWnd);
  386. pPopupBar->InternalRelease();
  387. }
  388. else
  389. {
  390. bResult = pPopup->TrackPopupMenu(nFlags, x, y, pWnd);
  391. }
  392. #else // Toolkit Standard
  393. bResult = pPopup->TrackPopupMenu(nFlags, x, y, pWnd);
  394. #endif
  395. return bResult;
  396. }