TitleBarDlg.cpp
上传用户:shixing_sh
上传日期:2021-10-02
资源大小:3629k
文件大小:14k
源码类别:

工具条

开发平台:

Visual C++

  1. // TitleBarDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TitleBar.h"
  5. #include "TitleBarDlg.h"
  6. #include "YouDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /**************************************************************
  13. 严重声明:未经本人许可不得用于任何商业用途.  
  14. 作    者:朱一松  
  15. 联系方式:Email:song_0962@sina.com
  16. //*************************************************************
  17. 界面程序用法说明:
  18.  1.TitleBarDlg.h和TitleBarDlg.cpp 为主界面类程序文件
  19.    若其它窗口要继承主窗口风格,其窗口的基类必须为
  20.    CTitleBarDlg,采用对话框资源编辑器完成窗口设计后,新
  21.    建类后,在你的对话框类文件(.cpp .h)中手工修所有的
  22.    CDialog 为 CTitleBarDlg。
  23.  2.TitleBarDlg.h和TitleBarDlg.cpp 
  24.    除了指定位置可添加代码外,其它地方不能随便添加修改代码.
  25.  3.一定要用本的界面工程做为模板,在此基础开发项目,不要新建
  26.    工程文件。
  27.  4.请参考CyouDlg类*/
  28. // CTitleBarDlg dialog
  29. //****************************************************
  30. CyouDlg *pMyDlg = NULL;
  31. CTitleBarDlg::CTitleBarDlg(CWnd* pParent /*=NULL*/)
  32. : CDialog(CTitleBarDlg::IDD, pParent)
  33. {
  34. m_Status = 0;
  35. m_ShowTitle = TRUE;
  36. m_ReSizeFlag = FALSE;
  37. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  38. }
  39. CTitleBarDlg::~CTitleBarDlg()
  40. {
  41. //if(pMyDlg) delete pMyDlg;
  42. }
  43. void CTitleBarDlg::DoDataExchange(CDataExchange* pDX)
  44. {
  45. CDialog::DoDataExchange(pDX);
  46. //{{AFX_DATA_MAP(CTitleBarDlg)
  47. // NOTE: the ClassWizard will add DDX and DDV calls here
  48. //}}AFX_DATA_MAP
  49. }
  50. BEGIN_MESSAGE_MAP(CTitleBarDlg, CDialog)
  51. //{{AFX_MSG_MAP(CTitleBarDlg)
  52. ON_WM_PAINT()
  53. ON_WM_QUERYDRAGICON()
  54. ON_WM_NCLBUTTONDOWN()
  55. ON_WM_NCMOUSEMOVE()
  56. ON_WM_SYSCOMMAND()
  57. ON_WM_SIZE()
  58. ON_WM_MOUSEMOVE()
  59. ON_BN_CLICKED(IDC_BUTTON1, OnOk)
  60. //}}AFX_MSG_MAP
  61. END_MESSAGE_MAP()
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CTitleBarDlg message handlers
  64. BOOL CTitleBarDlg::OnInitDialog()
  65. {
  66. CDialog::OnInitDialog();
  67. SetIcon(m_hIcon, TRUE); // Set big icon
  68. SetIcon(m_hIcon, FALSE); // Set small icon
  69. m_ToolTip.Create(this,TTS_ALWAYSTIP);//创建工具提示控件,TTS_ALWAYSTIP表示,
  70. m_ReSizeFlag  = TRUE;
  71. CRect rtWnd;
  72. GetWindowRect(rtWnd);
  73. m_OldWidth = rtWnd.Width();
  74. m_OldHeight = rtWnd.Height();
  75. return TRUE;  // return TRUE  unless you set the focus to a control
  76. }
  77. void CTitleBarDlg::OnPaint() 
  78. {
  79. if (IsIconic())
  80. {
  81. CPaintDC dc(this); // device context for painting
  82. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  83. // Center icon in client rectangle
  84. int cxIcon = GetSystemMetrics(SM_CXICON);
  85. int cyIcon = GetSystemMetrics(SM_CYICON);
  86. CRect rect;
  87. GetClientRect(&rect);
  88. int x = (rect.Width() - cxIcon + 1) / 2;
  89. int y = (rect.Height() - cyIcon + 1) / 2;
  90. // Draw the icon
  91. dc.DrawIcon(x, y, m_hIcon);
  92. }
  93. else
  94. {
  95. CDialog::OnPaint();
  96. }
  97. }
  98. // The system calls this to obtain the cursor to display while the user drags
  99. //  the minimized window.
  100. HCURSOR CTitleBarDlg::OnQueryDragIcon()
  101. {
  102. return (HCURSOR) m_hIcon;
  103. }
  104. LRESULT CTitleBarDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  105. {
  106. LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);
  107. if (!::IsWindow(m_hWnd))
  108. return lrst;
  109. if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
  110. {
  111. CDC* pWinDC = GetWindowDC();
  112. if (pWinDC)
  113. DrawTitleBar(pWinDC);
  114. ReleaseDC(pWinDC);
  115. }
  116. return lrst;
  117. }
  118. void CTitleBarDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
  119. {
  120. CRect rtWnd;
  121. GetWindowRect(&rtWnd);
  122. //mouse坐标转化为本窗口坐标 重要
  123. point.x = point.x - rtWnd.left;
  124. point.y = point.y - rtWnd.top;
  125. //检测各按钮是否按到
  126. if (m_rtIcon.PtInRect(point))
  127. AfxMessageBox("界面软件设计者:朱一松 EMail:Song_0962@sina.com");
  128. else
  129. if (m_rtButtHelp.PtInRect(point))
  130. {
  131. SendMessage(WM_HELP);
  132. }
  133. else 
  134. {
  135. if (m_rtButtExit.PtInRect(point))
  136. {
  137. SendMessage(WM_CLOSE);
  138. }
  139. else 
  140. {
  141. if (m_rtButtMin.PtInRect(point))
  142. {
  143. m_ShowTitle = FALSE;
  144. SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
  145. }
  146. else
  147. {
  148. if (m_rtButtMax.PtInRect(point))
  149. {
  150. m_ShowTitle = TRUE;
  151. if (IsZoomed())
  152. SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));
  153. else
  154. {
  155. SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
  156. Invalidate();
  157. }
  158. }
  159. else
  160. {
  161. if (!IsZoomed())
  162. {
  163. Default();
  164. }
  165. }
  166. }
  167. }
  168. }
  169. }
  170. }
  171. void CTitleBarDlg::OnNcMouseMove(UINT nHitTest, CPoint point) 
  172. {
  173. CDC* pDC = GetWindowDC();
  174. CDC* pDisplayMemDC=new CDC;
  175. pDisplayMemDC->CreateCompatibleDC(pDC);
  176. CBitmap* pBitmap = new CBitmap;
  177. CBitmap* pOldBitmap;
  178. CRect rtWnd, rtButton;
  179. if (pDC)
  180. {
  181. CString StrTemp = "";
  182. GetWindowRect(&rtWnd);
  183. //mouse坐标转化为本窗口坐标 重要
  184. point.x = point.x - rtWnd.left;
  185. point.y = point.y - rtWnd.top;
  186. //判断mouse是否移到系统按钮上
  187. if (m_rtButtExit.PtInRect(point))
  188. {
  189. pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
  190. StrTemp = _T("关闭");
  191. }
  192. else
  193. {
  194. if(m_rtButtMin.PtInRect(point))
  195. {
  196. pBitmap->LoadBitmap(IDB_MIN_FOCUS);
  197. StrTemp = _T("最小化窗口");
  198. }
  199. else
  200. {
  201. if(m_rtButtMax.PtInRect(point))
  202. {
  203. pBitmap->LoadBitmap(IDB_MAX_FOCUS);
  204. if(IsZoomed())
  205. {
  206. StrTemp = _T("还原窗口");
  207. }
  208. else
  209. {
  210. StrTemp = _T("最化大窗口");
  211. }
  212. }
  213. else
  214. {
  215. pBitmap->LoadBitmap(IDB_NORMAL);
  216. }
  217. }
  218. }
  219. rtButton = m_rtButtMin;
  220. BITMAP BmpInfo;
  221. pBitmap->GetBitmap(&BmpInfo);
  222. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  223. pDC->BitBlt(rtButton.left-6, rtButton.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  224. pDisplayMemDC->SelectObject(pOldBitmap);
  225. pBitmap->DeleteObject();
  226. CRect ShowTipRec;
  227. ShowTipRec = m_rtButtMin;
  228. if(!StrTemp.IsEmpty())
  229. {
  230. ScreenToClient(&ShowTipRec);
  231. m_ToolTip.AddToolTip(IDD_TITLEBAR_DIALOG,&ShowTipRec,StrTemp);
  232. m_ToolTip.SetDelayTime(200);
  233.         }
  234. }
  235. ReleaseDC(pDisplayMemDC);
  236. ReleaseDC(pDC);
  237. delete pDisplayMemDC;
  238. delete pBitmap;
  239. CDialog::OnNcMouseMove(nHitTest, point);
  240. }
  241. void CTitleBarDlg::DrawTitleBar(CDC *pDC)
  242. {
  243. if (m_hWnd)
  244. {
  245. CBrush Brush(RGB(0,100,255));
  246. CBrush* pOldBrush = pDC->SelectObject(&Brush);
  247. CRect rtWnd, rtTitle, rtButtons;
  248. GetWindowRect(&rtWnd); 
  249. //取得标题栏的位置
  250. rtTitle.left = GetSystemMetrics(SM_CXFRAME);
  251. rtTitle.top = GetSystemMetrics(SM_CYFRAME);
  252. rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
  253. rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
  254. //计算最小化按钮的位置,位图大小为15X15
  255. rtButtons.left = rtTitle.right-60;
  256. rtButtons.top= rtTitle.top+2;
  257. rtButtons.right = rtTitle.right-42;
  258. rtButtons.bottom = rtTitle.top+20;
  259. m_rtButtMin = rtButtons;
  260. //计算最大化按钮的位置,位图大小为15X15
  261. m_rtButtMax.left = m_rtButtMin.left + 18;
  262. m_rtButtMax.top = m_rtButtMin.top;
  263. m_rtButtMax.right = m_rtButtMin.right + 16;
  264. m_rtButtMax.bottom = m_rtButtMin.bottom;
  265. m_rtButtExit.left = m_rtButtMax.left + 18;
  266. m_rtButtExit.top =  m_rtButtMax.top;
  267. m_rtButtExit.right = m_rtButtMax.right + 16;
  268. m_rtButtExit.bottom = m_rtButtMax.bottom;
  269. //准备画图
  270. CBitmap* pBitmap = new CBitmap;
  271. BITMAP BmpInfo;
  272. CBitmap* pOldBitmap;
  273. CDC* pDisplayMemDC=new CDC;
  274. pDisplayMemDC->CreateCompatibleDC(pDC);
  275. //重画最Caption
  276. POINT  DrawPonit;
  277. DrawPonit.x = rtTitle.left-4;
  278. DrawPonit.y = rtTitle.top-4;
  279. pBitmap->LoadBitmap(IDB_TITLE_LEFT);
  280. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  281. pBitmap->GetBitmap(&BmpInfo);
  282. pDC->BitBlt(rtTitle.left-4, rtTitle.top-4, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  283. DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;
  284. pDisplayMemDC->SelectObject(pOldBitmap);
  285. pBitmap->DeleteObject();
  286. pBitmap->LoadBitmap(IDB_TOP);
  287. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  288. pBitmap->GetBitmap(&BmpInfo);
  289. while(DrawPonit.x<= m_rtButtMin.left-66) 
  290. {
  291. pDC->BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  292. DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;
  293. }
  294. pDisplayMemDC->SelectObject(pOldBitmap);
  295. pBitmap->DeleteObject();
  296. pBitmap->LoadBitmap(IDB_TITLE_RIGHT);
  297. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  298. pBitmap->GetBitmap(&BmpInfo);
  299. pDC->BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  300. pDisplayMemDC->SelectObject(pOldBitmap);
  301. pBitmap->DeleteObject();
  302. //重画最小化button
  303. rtButtons = m_rtButtMin;
  304. pBitmap->LoadBitmap(IDB_NORMAL);
  305. pBitmap->GetBitmap(&BmpInfo);
  306. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  307. pDC->BitBlt(rtButtons.left-6, rtButtons.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  308. pDisplayMemDC->SelectObject(pOldBitmap);
  309. pBitmap->DeleteObject();
  310. int nOldMode = pDC->SetBkMode(TRANSPARENT);
  311. COLORREF clOldText=pDC->GetTextColor();
  312. CFont titleFont;
  313. titleFont.CreateFont( 12, // nHeight 
  314. 8, // nWidth 
  315. 0, // nEscapement文本行逆时针旋转角度 
  316. 0, // nOrientation字体角度
  317. FW_BOLD, // nWeight字体粗细程度 
  318. FALSE, // bItalic 
  319. FALSE, // bUnderline 
  320. 0, // cStrikeOut 删除线
  321. ANSI_CHARSET, // nCharSet 
  322. OUT_DEFAULT_PRECIS, // nOutPrecision 
  323. CLIP_DEFAULT_PRECIS, // nClipPrecision 
  324. DEFAULT_QUALITY, // nQuality 
  325. DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
  326. _T("隶书")); // lpszFac pDC->SelectStockObject(SYSTEM_FIXED_FONT);
  327. CFont *OldFont;
  328. OldFont = pDC->SelectObject(&titleFont);
  329. CString m_StrTitle;
  330. GetWindowText(m_StrTitle);
  331. pDC->SetTextColor(RGB(80,255,25));
  332. if(m_ShowTitle)
  333. {
  334. pDC->TextOut(65,10,m_StrTitle);
  335. }
  336. else
  337. {   
  338. m_StrTitle = m_StrTitle.Left(6);
  339. m_StrTitle += "...";
  340. pDC->TextOut(30,10,m_StrTitle);
  341. }
  342. pDC->SetBkMode(nOldMode);
  343. pDC->SetTextColor(clOldText);
  344. pDC->SelectObject(OldFont);
  345. // pDC->TextOut(60,60,m_StrTitle);
  346. //重画左边框
  347. pBitmap->LoadBitmap(IDB_LEFTDOWN);
  348. pBitmap->GetBitmap(&BmpInfo);
  349. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  350. int i ;
  351. for (i= 20;i<=rtWnd.bottom;i=i+BmpInfo.bmHeight-3)
  352. {
  353. pDC->BitBlt(0, rtButtons.top+i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  354. }
  355. pDisplayMemDC->SelectObject(pOldBitmap);
  356. pBitmap->DeleteObject();
  357. //重画右边框
  358. pBitmap->LoadBitmap(IDB_RIGHTDOWN);
  359. pBitmap->GetBitmap(&BmpInfo);
  360. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  361. GetClientRect(&rtWnd);
  362. for (i= 25;i<=rtWnd.bottom+27;i=i+BmpInfo.bmHeight-3)
  363. {
  364. pDC->BitBlt(rtWnd.right, i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  365. }
  366. pDisplayMemDC->SelectObject(pOldBitmap);
  367. pBitmap->DeleteObject();
  368. //重画底边框
  369. pBitmap->LoadBitmap(IDB_DOWN);
  370. pBitmap->GetBitmap(&BmpInfo);
  371. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  372. GetClientRect(&rtWnd);
  373. for (i= 9; i<=rtWnd.right; i=i+2)
  374. {
  375. GetClientRect(&rtWnd);
  376. pDC->BitBlt(i,rtWnd.bottom+26, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
  377. }
  378. pDisplayMemDC->SelectObject(pOldBitmap);
  379. pBitmap->DeleteObject();
  380. //重画图标
  381. // m_rtIcon.left = 3;//rtWnd.Width()-5;
  382. // m_rtIcon.top =  GetSystemMetrics(SM_CYFRAME);
  383. // m_rtIcon.right = m_rtIcon.left + 32;
  384. // m_rtIcon.bottom = m_rtIcon.top + 32;
  385. // ::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, m_hIcon, 
  386. // m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
  387. // m_rtIcon.OffsetRect(rtWnd.TopLeft()); 
  388. ReleaseDC(pDisplayMemDC);
  389. delete pDisplayMemDC;
  390. delete pBitmap;
  391. }
  392. }
  393. void CTitleBarDlg::OnOK() 
  394. {
  395. this->DestroyWindow();
  396. if(pMyDlg) delete pMyDlg;
  397. }
  398. void CTitleBarDlg::OnSysCommand(UINT nID, LPARAM lParam)
  399. {
  400. if (nID == SC_CLOSE)
  401. {
  402. AfxGetMainWnd()->DestroyWindow();//关闭应用程序
  403. return;
  404. }
  405. if (nID == SC_RESTORE)
  406. {
  407. ShowWindow(SW_NORMAL);//restore应用程序
  408. m_ShowTitle = TRUE;
  409. return;
  410. }
  411. CDialog::OnSysCommand(nID, lParam);
  412. }
  413. float m_WidthScale;
  414. float m_HeightScale;
  415. BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
  416. {
  417. CRect rtCtrl,rtWnd;
  418. if(hwnd)
  419. {
  420. ::GetWindowRect(hwnd,&rtCtrl);
  421. ::GetWindowRect(GetParent(hwnd),&rtWnd);
  422. if((int)m_WidthScale==1 && m_WidthScale <1.001) return TRUE;
  423. if((int)m_WidthScale > 0)
  424. {
  425. rtCtrl.OffsetRect(-rtWnd.left-3,-rtWnd.top-28);
  426. }
  427. else
  428. {
  429. rtCtrl.OffsetRect(-rtWnd.left-2,-rtWnd.top-29);
  430. }
  431. float temp;
  432. temp= (float)rtCtrl.left*m_WidthScale;
  433. rtCtrl.left  = (int)temp;
  434. temp= (float)rtCtrl.top*m_HeightScale;
  435. rtCtrl.top =  (int)temp;
  436. temp = (float)rtCtrl.right*m_WidthScale;
  437. rtCtrl.right = (int)temp;
  438. temp =(float)rtCtrl.bottom*m_HeightScale;
  439. rtCtrl.bottom  = (int)temp;
  440. ::MoveWindow(hwnd,rtCtrl.left,rtCtrl.top,
  441.          rtCtrl.Width(),
  442.  rtCtrl.Height(),
  443. TRUE);
  444. return TRUE;
  445. }
  446. else
  447. {
  448. return FALSE;
  449. }
  450. }
  451. void CTitleBarDlg::OnSize(UINT nType, int cx, int cy) 
  452. {
  453. // CDialog::OnSize(nType, cx, cy);
  454. if(m_ReSizeFlag)
  455. {
  456. if(nType!=1)
  457. {
  458. CRect rtWnd;
  459. GetWindowRect(&rtWnd);
  460. m_WidthScale = (float)rtWnd.Width()/(float)m_OldWidth; // new/Old
  461. m_HeightScale = (float)rtWnd.Height()/(float)m_OldHeight;
  462. m_OldWidth = rtWnd.Width();  //保存新的Size;
  463. m_OldHeight = rtWnd.Height();
  464. HWND hWnd;
  465. hWnd = GetSafeHwnd(); 
  466. EnumChildWindows(hWnd,(WNDENUMPROC)EnumChildProc,0);
  467. }
  468. }
  469. // TODO: Add your message handler code here
  470. }
  471. void CTitleBarDlg::OnMouseMove(UINT nFlags, CPoint point) 
  472. {
  473. // TODO: Add your message handler code here and/or call default
  474. CDialog::OnMouseMove(nFlags, point);
  475. }
  476. void CTitleBarDlg::OnOk() 
  477. {
  478. //CyouDlg *pMyDlg;
  479. if(pMyDlg) delete pMyDlg;
  480. pMyDlg = new CyouDlg;
  481. pMyDlg->Create(IDD_DIALOG1);
  482. pMyDlg->ShowWindow(SW_SHOW);
  483. }
  484. void CTitleBarDlg::OnCancel() 
  485. {
  486. // TODO: Add extra cleanup here
  487. this->DestroyWindow();
  488. if(pMyDlg) delete pMyDlg;
  489. }