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

对话框与窗口

开发平台:

Visual C++

  1. // TipWindowDlg.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO 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 "TipWindow.h"
  22. #include "TipWindowDlg.h"
  23. #include "AboutDlg.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CTipWindowDlg dialog
  31. CTipWindowDlg::CTipWindowDlg(CWnd* pParent /*=NULL*/)
  32. : CDialog(CTipWindowDlg::IDD, pParent)
  33. {
  34. //{{AFX_DATA_INIT(CTipWindowDlg)
  35. m_strTipText = _T("This is where you would display your tip text message...nThis is where you would display the second line of your tip text message.");
  36. m_strTipTitle = _T("Tip Message Title");
  37. m_nMillisecs = 5000;
  38. m_nDelayMillisecs = 0;
  39. m_cx = 1;
  40. m_cy = 1;
  41. m_nLineSpacing = 1;
  42. m_bThickBorder = FALSE;
  43. m_bAlphaShadow = TRUE;
  44. m_bDropShadow = TRUE;
  45. m_bMoveTipBelowCursor = FALSE;
  46. //}}AFX_DATA_INIT
  47. m_tipWindow.SetMargins(CSize(m_cx,m_cy));
  48. m_tipWindow.SetLineSpace(m_nLineSpacing);
  49. m_clrTipBack = ::GetSysColor(COLOR_INFOBK);
  50. m_clrTipText = ::GetSysColor(COLOR_INFOTEXT);
  51. UpdateStyle();
  52. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  53. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  54. }
  55. void CTipWindowDlg::DoDataExchange(CDataExchange* pDX)
  56. {
  57. CDialog::DoDataExchange(pDX);
  58. //{{AFX_DATA_MAP(CTipWindowDlg)
  59. DDX_Control(pDX, IDC_LIST, m_cListCtrl);
  60. DDX_Control(pDX, IDC_EDIT_CY, m_editCY);
  61. DDX_Control(pDX, IDC_EDIT_CX, m_editCX);
  62. DDX_Control(pDX, IDC_SPIN_CY, m_spinCY);
  63. DDX_Control(pDX, IDC_SPIN_CX, m_spinCX);
  64. DDX_Control(pDX, IDC_CLR_TEXT, m_cpTipText);
  65. DDX_Control(pDX, IDC_CLR_BACK, m_cpTipBack);
  66. DDX_Control(pDX, IDC_BTN_SHOWTIP, m_btnShowTip);
  67. DDX_Text(pDX, IDC_EDIT_TIPTEXT, m_strTipText);
  68. DDX_Text(pDX, IDC_EDIT_TIPTITLE, m_strTipTitle);
  69. DDX_Text(pDX, IDC_EDIT_TIMEOUT, m_nMillisecs);
  70. DDX_Text(pDX, IDC_EDIT_DELAY, m_nDelayMillisecs);
  71. DDX_Text(pDX, IDC_EDIT_CX, m_cx);
  72. DDX_Text(pDX, IDC_EDIT_CY, m_cy);
  73. DDX_Text(pDX, IDC_EDIT_LINESPACE, m_nLineSpacing);
  74. DDX_Check(pDX, IDC_CHK_THICKBORDER, m_bThickBorder);
  75. DDX_Check(pDX, IDC_CHK_ALPHASHADOWING, m_bAlphaShadow);
  76. DDX_Check(pDX, IDC_CHK_SHADOW, m_bDropShadow);
  77. DDX_Check(pDX, IDC_CHK_MOVEBELOWCURSOR, m_bMoveTipBelowCursor);
  78. //}}AFX_DATA_MAP
  79. DDX_XTColorPicker(pDX, IDC_CLR_TEXT, m_clrTipText);
  80. DDX_XTColorPicker(pDX, IDC_CLR_BACK, m_clrTipBack);
  81. }
  82. BEGIN_MESSAGE_MAP(CTipWindowDlg, CDialog)
  83. //{{AFX_MSG_MAP(CTipWindowDlg)
  84. ON_WM_SYSCOMMAND()
  85. ON_WM_PAINT()
  86. ON_WM_QUERYDRAGICON()
  87. ON_BN_CLICKED(IDC_BTN_SHOWTIP, OnBtnShowTip)
  88. ON_EN_CHANGE(IDC_EDIT_TIPTEXT, OnChangeEditTiptext)
  89. ON_EN_CHANGE(IDC_EDIT_TIPTITLE, OnChangeEditTiptitle)
  90. ON_BN_CLICKED(IDC_CHK_ALPHASHADOWING, OnChkAlphaShadowing)
  91. ON_BN_CLICKED(IDC_CHK_THICKBORDER, OnChkThickBorder)
  92. ON_BN_CLICKED(IDC_CHK_SHADOW, OnChkShadow)
  93. //}}AFX_MSG_MAP
  94. ON_CPN_XT_SELENDOK(IDC_CLR_TEXT, OnSelEndOkTextColor)
  95. ON_CPN_XT_SELENDOK(IDC_CLR_BACK, OnSelEndOkBackColor)
  96. END_MESSAGE_MAP()
  97. /////////////////////////////////////////////////////////////////////////////
  98. // CTipWindowDlg message handlers
  99. BOOL CTipWindowDlg::OnInitDialog()
  100. {
  101. CDialog::OnInitDialog();
  102. m_tipWindow.Create(this);
  103. m_tipWindow.ShowWindow(SW_HIDE);
  104. // Add "About..." menu item to system menu.
  105. // IDM_ABOUTBOX must be in the system command range.
  106. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  107. ASSERT(IDM_ABOUTBOX < 0xF000);
  108. CMenu* pSysMenu = GetSystemMenu(FALSE);
  109. if (pSysMenu != NULL)
  110. {
  111. CString strAboutMenu;
  112. strAboutMenu.LoadString(IDS_ABOUTBOX);
  113. if (!strAboutMenu.IsEmpty())
  114. {
  115. pSysMenu->AppendMenu(MF_SEPARATOR);
  116. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  117. }
  118. }
  119. // Set the icon for this dialog.  The framework does this automatically
  120. //  when the application's main window is not a dialog
  121. SetIcon(m_hIcon, TRUE);         // Set big icon
  122. SetIcon(m_hIcon, FALSE);        // Set small icon
  123. // TODO: Add extra initialization here
  124. m_cpTipText.SetColor (m_clrTipText);
  125. m_cpTipText.SetDefaultColor (m_clrTipText);
  126. m_cpTipBack.SetColor (m_clrTipBack);
  127. m_cpTipBack.SetDefaultColor (m_clrTipBack);
  128. m_spinCY.SetBuddy(&m_editCY);
  129. m_spinCY.SetRange(0,15);
  130. m_spinCX.SetBuddy(&m_editCX);
  131. m_spinCX.SetRange(0,25);
  132. m_cListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_GRIDLINES);
  133. m_cListCtrl.InsertColumn(0, _T("First name"), LVCFMT_LEFT, 50, 0);
  134. m_cListCtrl.InsertColumn(1, _T("Last name"), LVCFMT_LEFT, 50, 1);
  135. m_cListCtrl.InsertColumn(2, _T("Address"), LVCFMT_LEFT, 50, 2);
  136. m_cListCtrl.InsertColumn(3, _T("City"), LVCFMT_LEFT, 50, 3);
  137. m_cListCtrl.InsertItem(0, _T("Michael"));
  138. m_cListCtrl.SetItemText(0, 1, _T("abcdefghijklmnopqrstuvwxyz"));
  139. m_cListCtrl.SetItemText(0, 2, _T("Street 1234"));
  140. m_cListCtrl.SetItemText(0, 3, _T("Munichnnnn(Germany)"));
  141. m_cListCtrl.InsertItem(0, _T("RobertnRaabn123"));
  142. m_cListCtrl.SetItemText(0, 1, _T("Einsteinnjunior"));
  143. m_cListCtrl.SetItemText(0, 2, _T("Road ABCDEFG"));
  144. m_cListCtrl.SetItemText(0, 3, _T("Miami"));
  145. m_cListCtrl.InsertItem(0, _T("Sandra"));
  146. m_cListCtrl.SetItemText(0, 1, _T("Test"));
  147. m_cListCtrl.SetItemText(0, 2, _T("1234567890nabcdefghij"));
  148. m_cListCtrl.SetItemText(0, 3, _T("Nowhere city"));
  149. return TRUE;  // return TRUE  unless you set the focus to a control
  150. }
  151. void CTipWindowDlg::OnSysCommand(UINT nID, LPARAM lParam)
  152. {
  153. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  154. {
  155. CAboutDlg dlgAbout;
  156. dlgAbout.DoModal();
  157. }
  158. else
  159. {
  160. CDialog::OnSysCommand(nID, lParam);
  161. }
  162. }
  163. // If you add a minimize button to your dialog, you will need the code below
  164. //  to draw the icon.  For MFC applications using the document/view model,
  165. //  this is automatically done for you by the framework.
  166. void CTipWindowDlg::OnPaint()
  167. {
  168. if (IsIconic())
  169. {
  170. CPaintDC dc(this); // device context for painting
  171. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  172. // Center icon in client rectangle
  173. int cxIcon = GetSystemMetrics(SM_CXICON);
  174. int cyIcon = GetSystemMetrics(SM_CYICON);
  175. CRect rect;
  176. GetClientRect(&rect);
  177. int x = (rect.Width() - cxIcon + 1) / 2;
  178. int y = (rect.Height() - cyIcon + 1) / 2;
  179. // Draw the icon
  180. dc.DrawIcon(x, y, m_hIcon);
  181. }
  182. else
  183. {
  184. CDialog::OnPaint();
  185. }
  186. }
  187. // The system calls this to obtain the cursor to display while the user drags
  188. //  the minimized window.
  189. HCURSOR CTipWindowDlg::OnQueryDragIcon()
  190. {
  191. return (HCURSOR) m_hIcon;
  192. }
  193. void CTipWindowDlg::OnBtnShowTip()
  194. {
  195. UpdateData();
  196. if (::IsWindow(m_tipWindow.m_hWnd))
  197. {
  198. //Do not destroy this window -> hide it
  199. m_tipWindow.HideTipWindow();
  200. }
  201. CXTStringHelper sTemp(m_strTipText);
  202. sTemp.Replace(_T("\n"), _T("n"));
  203. m_tipWindow.SetTipText(m_strTipTitle, sTemp);
  204. CRect rect;
  205. m_btnShowTip.GetWindowRect(&rect);
  206. m_tipWindow.SetMargins (CSize(m_cx,m_cy));
  207. m_tipWindow.SetLineSpace (m_nLineSpacing);
  208. m_tipWindow.ShowTipWindow(CPoint(rect.left-5, rect.bottom+5), m_dwTipStyle, m_nDelayMillisecs, m_nMillisecs);
  209. }
  210. void CTipWindowDlg::OnChangeEditTiptext()
  211. {
  212. UpdateData();
  213. }
  214. void CTipWindowDlg::OnChangeEditTiptitle()
  215. {
  216. UpdateData();
  217. }
  218. void CTipWindowDlg::OnSelEndOkTextColor()
  219. {
  220. UpdateData();
  221. m_tipWindow.SetTipColors(m_clrTipBack,
  222. m_clrTipText);
  223. }
  224. void CTipWindowDlg::OnSelEndOkBackColor()
  225. {
  226. UpdateData();
  227. m_tipWindow.SetTipColors(m_clrTipBack,
  228. m_clrTipText);
  229. }
  230. void CTipWindowDlg::UpdateStyle()
  231. {
  232. m_dwTipStyle = 0L;
  233. if (m_bAlphaShadow) {
  234. m_dwTipStyle |= TWS_XT_ALPHASHADOW;
  235. }
  236. if (m_bThickBorder) {
  237. m_dwTipStyle |= TWS_XT_THICKBORDER;
  238. }
  239. if (m_bDropShadow) {
  240. m_dwTipStyle |= TWS_XT_DROPSHADOW;
  241. }
  242. }
  243. void CTipWindowDlg::OnChkAlphaShadowing()
  244. {
  245. // TODO: Add your control notification handler code here
  246. UpdateData();
  247. UpdateStyle();
  248. }
  249. void CTipWindowDlg::OnChkThickBorder()
  250. {
  251. // TODO: Add your control notification handler code here
  252. UpdateData();
  253. UpdateStyle();
  254. }
  255. void CTipWindowDlg::OnChkShadow()
  256. {
  257. // TODO: Add your control notification handler code here
  258. UpdateData();
  259. UpdateStyle();
  260. }
  261. BOOL CTipWindowDlg::PreTranslateMessage(MSG* pMsg)
  262. {
  263. if(pMsg->message == WM_MOUSEMOVE && pMsg->wParam == 0)
  264. {
  265. int id = ::GetDlgCtrlID(pMsg->hwnd);
  266. CPoint point;
  267. point.x = LOWORD(pMsg->lParam);
  268. point.y = HIWORD(pMsg->lParam);
  269. if(id == IDC_LIST)
  270. MouseOverListCtrl(point);
  271. MouseOverCtrl(point, pMsg->hwnd);
  272. }
  273. return CDialog::PreTranslateMessage(pMsg);
  274. }
  275. void CTipWindowDlg::MouseOverCtrl(CPoint point, HWND hWnd)
  276. {
  277. CWnd* pWnd = FromHandle(hWnd);
  278. if(!pWnd)
  279. return;
  280. int id = pWnd->GetDlgCtrlID();
  281. if(id == IDC_EDIT_DELAY || id == IDC_CHK_MOVEBELOWCURSOR)
  282. {
  283. //Show the tip window
  284. UpdateData();
  285. CRect rect;
  286. pWnd->GetClientRect(&rect);
  287. //Calculate the client coordinates of the dialog window
  288. pWnd->ClientToScreen(&rect);
  289. pWnd->ClientToScreen(&point);
  290. ScreenToClient(&rect);
  291. ScreenToClient(&point);
  292. if(id == IDC_EDIT_DELAY)
  293. m_tipWindow.SetTipText(m_strTipTitle, _T("Please enter tip window delay time (ms)nn------- tabbed text output -------na:t123nab:t1234nabc:t12345nabcd:t123456"));
  294. if(id == IDC_CHK_MOVEBELOWCURSOR)
  295. m_tipWindow.SetTipText(m_strTipTitle, _T("Check this box to move thentip window of the list controlnbelow the cursor."));
  296. m_tipWindow.SetMargins (CSize(m_cx,m_cy));
  297. m_tipWindow.SetLineSpace (m_nLineSpacing);
  298. m_tipWindow.ShowTipWindow(rect, point, m_dwTipStyle, m_nDelayMillisecs, 0, FALSE, TRUE);
  299. }
  300. }
  301. void CTipWindowDlg::MouseOverListCtrl(CPoint point)
  302. {
  303. //point = client coordinates inside the listctrl
  304. int nItem, nCol;
  305. if ((nItem = m_cListCtrl.HitTestEx(point, &nCol)) != -1)
  306. {
  307. #if _MSC_VER >= 1200 // MFC 5.0
  308. int nOriginalCol = m_cListCtrl.GetHeaderCtrl()->OrderToIndex(nCol);
  309. CString sItemText = m_cListCtrl.GetItemText(nItem, nOriginalCol);
  310. int iTextWidth = m_cListCtrl.GetStringWidth(sItemText) + 5; //5 pixed extra size
  311. CRect rect;
  312. m_cListCtrl.GetSubItemRect(nItem, nOriginalCol, LVIR_LABEL, rect);
  313. if(iTextWidth > rect.Width())
  314. {
  315. rect.top--;
  316. sItemText.Replace(_T("rn"), _T("n")); //Avoid ugly outputted rectangle character in the tip window
  317. m_tipWindow.SetMargins(CSize(1,1));
  318. m_tipWindow.SetLineSpace(0);
  319. m_tipWindow.SetTipText(_T(""), sItemText);
  320. //Calculate the client coordinates of the dialog window
  321. m_cListCtrl.ClientToScreen(&rect);
  322. m_cListCtrl.ClientToScreen(&point);
  323. ScreenToClient(&rect);
  324. ScreenToClient(&point);
  325. //Show the tip window
  326. UpdateData();
  327. m_tipWindow.ShowTipWindow(rect, point, m_dwTipStyle, m_nDelayMillisecs, 0, false, m_bMoveTipBelowCursor);
  328. }
  329. #endif
  330. }
  331. }