mainfrm.h

来自「WTL开发的一个写字板程序 ,很有借鉴意义」· C头文件 代码 · 共 1,316 行 · 第 1/3 页

H
1,316
字号
			m_view.Active(m_view.Count() - 1);			
			if (bUpdateRecent)			
				m_mru.AddToList(sPath);	
			
		}
		else
		{			
			m_view.Close(m_view.Count() - 1);			
		}

		Send_RefreshStatusBar(b ? _T("Ok. %s opened.") : 
			_T("Error. Cannot open file %s"), sPath);
		return b;
	}

	bool DoFileSave (kSheetView* sheet, const TCHAR* sPath)
	{	
		UpdateProgressBar();
		CWaitCursor wait;

		bool b = sheet->Save(sPath);

		UpdateProgressBar(false);
				
		if (b && sPath)
		{
			m_mru.AddToList(sPath);						
		}

		Send_RefreshStatusBar(b ? _T("Ok. %s saved") : _T("Error. Cannot save %s"), sheet->Path());		
		return b;
	}


	void UpdateStatusBar()
	{
		#define TIME_DELAY (1000 * 30)

		if (m_dwTimeRefreshStatusBar && 
			((GetTickCount() - m_dwTimeRefreshStatusBar) > TIME_DELAY)) 
		{
			m_sbar.SetText(0, _T("Ready"), SBT_NOBORDERS);
			m_dwTimeRefreshStatusBar = 0;
		}	

	}

	void UpdateProgressBar ( bool b = true )
	{
		if (b)
		{
			Send_RefreshStatusBar(_T(""));
			ATLASSERT(!m_progress.IsWindow());

			RECT rc;

			m_sbar.GetPaneRect(0, &rc);
			InflateRect(&rc, -2, -3);		
			rc.right = min(100, rc.right);
					
			HWND hWnd = m_progress.Create(m_sbar, rc, 0, WS_CHILD|WS_VISIBLE);
			hWnd;
			ATLASSERT(hWnd != 0);		

		}
		else
		{
			ATLASSERT(m_progress.IsWindow());
			m_progress.DestroyWindow();
		}
	}

	void ReadFromRegistry()
	{
		CRegKey key;			
		if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, kPadRegKey))
		{
			key.QueryValue(m_bShowToolBar,   _T("ToolBar"));
			key.QueryValue(m_bShowFormatBar, _T("FormatBar"));
			key.QueryValue(m_bShowStatusBar, _T("StatusBar"));			
		}		
	}

	////////////////////
	// IFrame interface

	virtual HWND GetWindow()
	{
		return m_hWnd;
	}

	virtual CProgressBarCtrl* GetProgressBar()
	{
		return &m_progress;
	}

	virtual void Send_RefreshStatusBar(const TCHAR* pStr, ...)
	{		
		ATLASSERT(pStr != 0);
		
		va_list args;	
		va_start(args, pStr);

		TCHAR buffer[512] = {0};

		int nLen = wvsprintf(buffer, pStr, args);
		nLen;

		ATLASSERT(nLen < 512);
		ATLASSERT(nLen == lstrlen(buffer));

		m_dwTimeRefreshStatusBar = GetTickCount();
		m_sbar.SetText(0, buffer, SBT_NOBORDERS);

		va_end(args);
	}

	////////
	// save\restore bands

	bool SaveBandsInfo (HKEY hKeyParent)
	{
		CRegKey key;
		if (ERROR_SUCCESS != key.Create(hKeyParent, _T("ReBar")))
			return false;

		CReBarCtrl rebar(m_hWndToolBar);
		int nCount = rebar.GetBandCount();

		REBARBANDINFO rbbi;
		rbbi.cbSize = sizeof REBARBANDINFO;
		rbbi.fMask = RBBIM_SIZE | RBBIM_STYLE | RBBIM_ID;
				
		for (int x = 0; x < nCount; x++)
		{
			TCHAR sBand[10] = {0};
			rbbi.wID = 0;

			rebar.GetBandInfo(x, &rbbi);
			UINT iIndex = rebar.IdToIndex(rbbi.wID);						
			wsprintf(sBand, _T("%u"), rbbi.wID);
			key.SetValue(MAKELONG(rbbi.cx, MAKEWORD(rbbi.fStyle & RBBS_BREAK, iIndex)), sBand);	
		}
		return true;
	}

	bool RestoreBandInfo (HKEY hKeyParent)
	{
		CRegKey key;
		if (ERROR_SUCCESS != key.Open(hKeyParent, _T("ReBar")))
			return false;

		CReBarCtrl rebar(m_hWndToolBar);
		int nCount = rebar.GetBandCount();

		REBARBANDINFO rbbi;
		rbbi.cbSize = sizeof REBARBANDINFO;
		
		for (int x = 0; x < nCount; x++)
		{	
			TCHAR sBand[10] = {0};
			DWORD dwValue = 0;

			rbbi.wID = ATL_IDW_BAND_FIRST + x;
			wsprintf(sBand, _T("%u"), rbbi.wID);
			key.QueryValue(dwValue, sBand);			
			
			rbbi.cx = LOWORD(dwValue);
			WORD w = HIWORD(dwValue);
			bool bBreak = LOBYTE(w) != 0;
			UINT uiIndex = (UINT)HIBYTE(w);

			UINT uiCurrent = rebar.IdToIndex(rbbi.wID);
			if (uiCurrent != uiIndex)
				rebar.MoveBand(uiCurrent, uiIndex);

			rbbi.fMask = RBBIM_STYLE;
			rebar.GetBandInfo(uiIndex, &rbbi);
			
			if (bBreak)
				rbbi.fStyle |= RBBS_BREAK;
			else
				rbbi.fStyle &= ~RBBS_BREAK;

			rbbi.fMask = RBBIM_SIZE | RBBIM_STYLE | RBBIM_ID;
			rebar.SetBandInfo(uiIndex, &rbbi);			
		}		
		return true;
	}

	//////////////////////////////////////////////////
	// print

	LRESULT OnFilePrint(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		if(!LayoutPages())
		{
			MessageBox(_T("Print operation failed"), _T("kPad"), MB_ICONERROR | MB_OK);
			return 0;
		}

		CPrintDialog dlg(FALSE);
		dlg.m_pd.hDevMode = devmode.CopyToHDEVMODE();
		dlg.m_pd.hDevNames = printer.CopyToHDEVNAMES();
		dlg.m_pd.nMinPage = 1;
		dlg.m_pd.nMaxPage = (WORD)m_arrPages.GetSize();
		dlg.m_pd.nFromPage = 1;
		dlg.m_pd.nToPage = (WORD)m_arrPages.GetSize();
		dlg.m_pd.Flags &= ~PD_NOPAGENUMS;

		if (dlg.DoModal() == IDOK)
		{
			devmode.CopyFromHDEVMODE(dlg.m_pd.hDevMode);
			printer.ClosePrinter();
			printer.OpenPrinter(dlg.m_pd.hDevNames, devmode.m_pDevMode);

			CPrintJob job;
			int nMin=0;
			int nMax = m_arrPages.GetSize()-1;
			if (dlg.m_pd.Flags | PD_PAGENUMS)
			{
				nMin = dlg.m_pd.nFromPage-1;
				nMax = dlg.m_pd.nToPage-1;
			}

			job.StartPrintJob(false, printer, devmode.m_pDevMode, this, _T("kPad Document"), nMin, nMax);
		}

		GlobalFree(dlg.m_pd.hDevMode);
		GlobalFree(dlg.m_pd.hDevNames);

		return 0;
	}

	LRESULT OnFilePrintPreview(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		bool bRet = LayoutPages();
		if(!bRet)
		{
			MessageBox(_T("Print preview operation failed"), _T("kPad"), MB_ICONERROR | MB_OK);
			return 0;
		}

		prev.SetPrintPreviewInfo(printer, devmode.m_pDevMode, this, 0, m_arrPages.GetSize() - 1);
		prev.SetPage(0);
		RECT rcPos;
		GetClientRect(&rcPos);
		prev.Create(m_hWnd, rcPos);
		prev.ShowWindow(SW_SHOW);
		prev.SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);

		m_view.ShowWindow(SW_HIDE);		
		m_hWndClient = prev;

		ATLASSERT(m_hWndToolBarPP == 0);
		m_hWndToolBarPP = CreateSimpleToolBarCtrl(m_hWnd, IDR_PRINTPREVIEWBAR, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE, ID_PRINT_TOOLBAR);		
		AddSimpleReBarBandCtrl(m_hWndToolBar, m_hWndToolBarPP, ATL_IDW_BAND_FIRST + 3, 0, TRUE, 0, TRUE);

		CReBarCtrl rebar(m_hWndToolBar);
		rebar.ShowBand(rebar.IdToIndex(ATL_IDW_BAND_FIRST + 1), FALSE); // toolbar 
		rebar.ShowBand(rebar.IdToIndex(ATL_IDW_BAND_FIRST + 2), FALSE); // formatbar

		UpdateLayout();
		return 0;
	}

	LRESULT OnFilePageSetup(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		CPageSetupDialog dlg;
		dlg.m_psd.hDevMode = devmode.CopyToHDEVMODE();
		dlg.m_psd.hDevNames = printer.CopyToHDEVNAMES();
		dlg.m_psd.rtMargin = m_rcMargin;

		if (dlg.DoModal() == IDOK)
		{
			devmode.CopyFromHDEVMODE(dlg.m_psd.hDevMode);
			printer.ClosePrinter();
			printer.OpenPrinter(dlg.m_psd.hDevNames, devmode.m_pDevMode);
			m_rcMargin = dlg.m_psd.rtMargin;
		}

		GlobalFree(dlg.m_psd.hDevMode);
		GlobalFree(dlg.m_psd.hDevNames);

		return 0;
	}

	LRESULT OnPrintPreviewClose(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		prev.DestroyWindow();
		m_hWndClient = m_view;
		m_view.ShowWindow(SW_SHOW);		
		RemovePrintBand();
		UpdateLayout();
		return 0;
	}

	LRESULT OnPrintPreviewForward(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		prev.NextPage();
		return 0;
	}
	
	LRESULT OnPrintPreviewBack(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		prev.PrevPage();					
		return 0;
	}

	//print job info callback
	virtual bool IsValidPage(UINT /*nPage*/)
	{
		return true;
	}

	virtual bool PrintPage(UINT nPage, HDC hDC)
	{
		if (nPage >= (UINT)m_arrPages.GetSize())
			return false;

		RECT rcPage;
		rcPage.left = rcPage.top = 0;
		rcPage.bottom = GetDeviceCaps(hDC, PHYSICALHEIGHT);
		rcPage.right = GetDeviceCaps(hDC, PHYSICALWIDTH);

		rcPage.right = MulDiv(rcPage.right, 1440, GetDeviceCaps(hDC, LOGPIXELSX));
		rcPage.bottom = MulDiv(rcPage.bottom, 1440, GetDeviceCaps(hDC, LOGPIXELSY));

		RECT rcOutput = rcPage;
		//convert from 1/1000" to twips
		rcOutput.left += MulDiv(m_rcMargin.left, 1440, 1000);
		rcOutput.right -= MulDiv(m_rcMargin.right, 1440, 1000);
		rcOutput.top += MulDiv(m_rcMargin.top, 1440, 1000);
		rcOutput.bottom -= MulDiv(m_rcMargin.bottom, 1440, 1000);

		
		FORMATRANGE fr;
		fr.hdc = hDC;
		fr.hdcTarget = hDC;
		fr.rc = rcOutput;
		fr.rcPage = rcPage;
		fr.chrg.cpMin = 0;
		fr.chrg.cpMax = -1;
		fr.chrg.cpMin = m_arrPages[nPage];

		// We have to adjust the origin because 0,0 is not at the corner of the paper
		// but is at the corner of the printable region
		int nOffsetX = GetDeviceCaps(hDC, PHYSICALOFFSETX);
		int nOffsetY = GetDeviceCaps(hDC, PHYSICALOFFSETY);
		SetViewportOrgEx(hDC, -nOffsetX, -nOffsetY, NULL);

		kSheetView* sheet = m_view.GetAt(m_view.Active());
		
		sheet->SendMessage(EM_FORMATRANGE, TRUE, (LPARAM)&fr);
		sheet->SendMessage(EM_DISPLAYBAND, 0, (LPARAM)&rcOutput);

		//Cleanup cache in richedit
		sheet->SendMessage(EM_FORMATRANGE, FALSE, 0);
		return true;
	}

	bool LayoutPages()
	{
		CDC dc = printer.CreatePrinterDC(devmode);
		if(dc.IsNull())
			return false;

		RECT rcPage;
		rcPage.left = rcPage.top = 0;
		rcPage.bottom = GetDeviceCaps(dc, PHYSICALHEIGHT);
		rcPage.right = GetDeviceCaps(dc, PHYSICALWIDTH);
		// We have to adjust the origin because 0,0 is not at the corner of the paper
		// but is at the corner of the printable region
		int nOffsetX = dc.GetDeviceCaps(PHYSICALOFFSETX);
		int nOffsetY = dc.GetDeviceCaps(PHYSICALOFFSETY);
		dc.SetViewportOrg(-nOffsetX, -nOffsetY);
		rcPage.right = MulDiv(rcPage.right, 1440, GetDeviceCaps(dc, LOGPIXELSX));
		rcPage.bottom = MulDiv(rcPage.bottom, 1440, GetDeviceCaps(dc, LOGPIXELSY));

		RECT rcOutput = rcPage;
		//convert from 1/1000" to twips
		rcOutput.left += MulDiv(m_rcMargin.left, 1440, 1000);
		rcOutput.right -= MulDiv(m_rcMargin.right, 1440, 1000);
		rcOutput.top += MulDiv(m_rcMargin.top, 1440, 1000);
		rcOutput.bottom -= MulDiv(m_rcMargin.bottom, 1440, 1000);
		
		FORMATRANGE fr;
		fr.hdc = dc;
		fr.hdcTarget = dc;
		fr.rc = rcOutput;
		fr.rcPage = rcPage;
		fr.chrg.cpMin = 0;
		fr.chrg.cpMax = -1;

		kSheetView* sheet = m_view.GetAt(m_view.Active());

		LONG n = (LONG)sheet->GetTextLength();
		m_arrPages.RemoveAll();
		while (1)
		{
			m_arrPages.Add(fr.chrg.cpMin);
			LONG lRet = (LONG)sheet->SendMessage(EM_FORMATRANGE, FALSE, (LPARAM)&fr);
			if((lRet - fr.chrg.cpMin) == -1)
			{
				m_arrPages.RemoveAt(m_arrPages.GetSize()-1);
				break;
			}
			else
				fr.chrg.cpMin = lRet;
			if (fr.chrg.cpMin >= n)
				break;
		}

		sheet->SendMessage(EM_FORMATRANGE, FALSE, 0);
		return true;
	}
	
	void RemovePrintBand()
	{
		ATLASSERT(::IsWindow(m_hWndToolBarPP));

		CReBarCtrl rebar(m_hWndToolBar);		
		rebar.DeleteBand(rebar.IdToIndex(ATL_IDW_BAND_FIRST + 3)); // delete printbar				
		rebar.ShowBand(rebar.IdToIndex(ATL_IDW_BAND_FIRST + 1), m_bShowToolBar); // toolbar 
		rebar.ShowBand(rebar.IdToIndex(ATL_IDW_BAND_FIRST + 2), m_bShowFormatBar); // formatbar 
		
		::DestroyWindow(m_hWndToolBarPP);
		m_hWndToolBarPP = 0;
	}
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MAINFRM_H__44FA1498_FAD8_47D3_B3DB_6E5CA86E2C2B__INCLUDED_)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?