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 + -
显示快捷键?