⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ksheetview.cpp

📁 WTL开发的一个写字板程序 ,很有借鉴意义
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
 Copyright (c) 2000 
 Author: Konstantin Boukreev 
 E-mail: konstantin@mail.primorye.ru 

 Created: 27.06.2000 15:03:17
 Version: 1.0.0

*/

#include "stdafx.h"
#include "kSheetView.h"
#include "kHyperLink.h"

const TCHAR* RTF_EXT = _T(".rtf");

///////////////////////////////////////////////////////////
// kSheetView

#ifdef _RICHEDIT_USE_TOM
DISPID kSheetView::m_dispidUndo = -1;
#endif //_RICHEDIT_USE_TOM

kSheetView::kSheetView()
{
	memset(m_path, 0, sizeof m_path);
	memset(m_name, 0, sizeof m_name);	
	
	m_bSpace = false;
	m_iRequestWidth = 0;	
	m_nRow = m_nCol = 0;
	m_TabCount = 4;

	m_RightMargin = m_LeftMargin = 0;
	m_UndoSize = 100;
	m_MaxBuffer = 32767;

	m_bWordWrap = true;
	m_clrTextColor = GetSysColor(COLOR_WINDOWTEXT);
	m_clrBackColor = GetSysColor(COLOR_WINDOW);
	m_clrHighlightColor = GetSysColor(COLOR_WINDOW);
}

kSheetView::~kSheetView()
{		
}

void kSheetView::SetOption(kOption& option, int nFlag)
{
	#ifdef _RICHEDIT_USE_TOM
	// stop undo		
	CComDispatchDriver dd(m_pTom);
	if (dd.p != 0)
	{
		CComVariant varSuspend(-9999995); 
		HRESULT hr = dd.Invoke1(m_dispidUndo, &varSuspend, 0);
		ATLASSERT(SUCCEEDED(hr));
	}
	#endif //_RICHEDIT_USE_TOM

	CHARFORMAT2 cf;
	memset(&cf, 0, sizeof CHARFORMAT2);
	cf.cbSize = sizeof CHARFORMAT2;	

	if (nFlag & kOption::opFontName)
	{			
		cf.dwMask |= CFM_FACE;		
		lstrcpy(cf.szFaceName, option.szFontName); 
	}
	if (nFlag & kOption::opFontSize)
	{		 
		cf.dwMask |= CFM_SIZE;
		cf.yHeight = option.FontSize * 20;
	}
	if (nFlag & kOption::opFontWeight)
	{		 
		cf.dwMask |= CFM_WEIGHT;
		cf.wWeight = (WORD)option.FontWeight;
	}
	if (nFlag & kOption::opCharset)
	{		 
		cf.dwMask |= CFM_CHARSET;
		cf.bCharSet = (BYTE)option.Charset;
	}	
	if (nFlag & kOption::opTextColor)
	{
		m_clrTextColor = option.TextColor;
		COLORREF clr = 0;
		OleTranslateColor(m_clrTextColor, 0, &clr); 
		cf.dwMask |= CFM_COLOR; 		
		cf.crTextColor = clr;	
	}
	if (nFlag & kOption::opBackColor)
	{
		m_clrBackColor = option.BackColor; 
		COLORREF clr = 0;
		OleTranslateColor(m_clrBackColor, 0, &clr); 
		SetBackgroundColor(clr);
	}
	if (nFlag & kOption::opLeftMargin)
	{
		SendMessage(EM_SETMARGINS, EC_LEFTMARGIN, MAKELONG(option.LeftMargin, 0));
		m_LeftMargin = option.LeftMargin;
	}
	if (nFlag & kOption::opRightMargin)
	{			
		SendMessage(EM_SETMARGINS, EC_RIGHTMARGIN, MAKELONG(0, option.RightMargin));
		m_RightMargin = option.RightMargin;
	}
	if (nFlag & kOption::opTabCount)		
	{		
		m_TabCount = option.TabCount; 

		CFont font;
		if (!font.CreatePointFont(option.FontSize * 10, option.szFontName))	
			font = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);	

		CClientDC dc(m_hWnd);
		HFONT hOldFont = dc.SelectFont(font);
	
		TEXTMETRIC tm;
		dc.GetTextMetrics(&tm);
		int nLogPix = dc.GetDeviceCaps(LOGPIXELSX);
		dc.SelectFont(hOldFont);
	
		int cxTab = ::MulDiv(tm.tmAveCharWidth * m_TabCount, 1440, nLogPix);	// 1440 twips = 1 inch
		if(cxTab != -1)
		{
			PARAFORMAT pf;
			pf.cbSize = sizeof PARAFORMAT;
			pf.dwMask = PFM_TABSTOPS;
			pf.cTabCount = MAX_TAB_STOPS;
			for(int i = 0; i < MAX_TAB_STOPS; i++)
				pf.rgxTabs[i] = (i + 1) * cxTab;

			SetSel(0, -1);
			SetParaFormat(pf);
			SetSel(-1, 0);
		}
	}	
	if (nFlag & kOption::opMaxBuffer)
	{		
		LimitText(option.MaxBuffer);
		m_MaxBuffer = option.MaxBuffer;
	}
	if (nFlag & kOption::opAutoURL)
	{		
		SetAutoURLDetect(option.AutoURL != 0);	
		long nEvents = GetEventMask();
		if (option.AutoURL != 0)
			nEvents |= ENM_LINK;
		else
			nEvents &= ~ENM_LINK;
		SetEventMask(nEvents);
	}
	if (nFlag & kOption::opWordWrap)
	{		
		m_bWordWrap = option.WordWrap != 0;
		SetTargetDevice(NULL, m_bWordWrap ? 0 : 1);
	}
	if (nFlag & kOption::opUndoSize)
	{		
		SetUndoLimit(option.UndoSize);
		m_UndoSize = option.UndoSize;
	}
		
	if (cf.dwMask)
		SendMessage(EM_SETCHARFORMAT, 0, (LPARAM)&cf); //default

	if (GetType(m_name) == SF_TEXT)
		SetModify(FALSE);

	#ifdef _RICHEDIT_USE_TOM	
	// start undo
	if (dd.p != 0)
	{
		CComVariant varResume(-9999994); 
		HRESULT hr = dd.Invoke1(m_dispidUndo, &varResume, 0);
		ATLASSERT(SUCCEEDED(hr));
	}
	#endif //_RICHEDIT_USE_TOM
	
}

void kSheetView::GetOption(kOption& option, int nFlag)
{	
	CHARFORMAT2 cf;					
	cf.cbSize = sizeof CHARFORMAT2;
	cf.dwMask = CFM_FACE | CFM_SIZE |  CFM_WEIGHT | CFM_CHARSET | CFM_SIZE | CFM_COLOR; //| CFM_BACKCOLOR 
	SendMessage(EM_GETCHARFORMAT, 0, (LPARAM)&cf); //get default format

	if (nFlag & kOption::opFontName)
	{				
		lstrcpy(option.szFontName, cf.szFaceName); 
	}
	if (nFlag & kOption::opFontSize)
	{		 	
		option.FontSize = cf.yHeight / 20;
	}
	if (nFlag & kOption::opFontWeight)
	{		 	
		option.FontWeight = cf.wWeight;
	}
	if (nFlag & kOption::opCharset)
	{		 	
		option.Charset = cf.bCharSet;
	}	
	if (nFlag & kOption::opTextColor)
	{
		option.TextColor = cf.crTextColor;	
	}
	if (nFlag & kOption::opBackColor)
	{	
		option.BackColor = m_clrBackColor; //cf.crBackColor; 		
	}
	if (nFlag & kOption::opLeftMargin)
	{	
		option.LeftMargin = m_LeftMargin;
	}
	if (nFlag & kOption::opRightMargin)
	{				
		option.RightMargin = m_RightMargin;
	}
	if (nFlag & kOption::opTabCount)		
	{		
		option.TabCount = m_TabCount; 
	}	
	if (nFlag & kOption::opMaxBuffer)
	{			
		option.MaxBuffer = m_MaxBuffer;
	}
	if (nFlag & kOption::opAutoURL)
	{		
		option.AutoURL = GetAutoURLDetect();			
	}
	if (nFlag & kOption::opWordWrap)
	{		
		option.WordWrap = m_bWordWrap ? -1 : 0;		
	}
	if (nFlag & kOption::opUndoSize)
	{			
		option.UndoSize = m_UndoSize;
	}
}
void kSheetView::InitNew()
{
	static int i = 0;
	TCHAR dir[_MAX_DIR] = {0};
	GetCurrentDirectory(_MAX_PATH, dir);
	
	TCHAR path[MAX_PATH];
	do {
		wsprintf(m_name, _T("New%d%s"), ++i, RTF_EXT);	
		wsprintf((TCHAR*)path, _T("%s\\%s"), dir, m_name);
	} while (PathExists(path));	
}

bool kSheetView::Load(const TCHAR* sPath, UINT uiFlag)
{
	if (DoLoad(sPath, uiFlag)) 
	{
		SetNamePath(sPath);
		ATLASSERT(lstrlen(m_path));
		SetModify(FALSE);
		return true;
	}
	return false;	
}

bool kSheetView::Save(const TCHAR* sArgPath, UINT uiFlag)
{	
	const TCHAR* sPath = sArgPath ? sArgPath : m_path;

	if (DoSave(sPath, uiFlag))
	{
		if (sArgPath)
			SetNamePath(sArgPath);
		SetModify(FALSE);
		return true;
	}
	return false;	
}

void kSheetView::OnEnLink (ENLINK *plnk)
{
	if (WM_LBUTTONDOWN == plnk->msg)
	{		
		SetSel(plnk->chrg); 
		int cb = plnk->chrg.cpMax - plnk->chrg.cpMin + 1;
		TCHAR* url = 0;
		if (cb > 1024)
			url = new TCHAR[cb];
		else
			url = (TCHAR *) alloca(cb * sizeof TCHAR);
		
		GetSelText(url);	
		SetSel(-1, 0);

		// navigate				
		kHyperLink::Open(url, kHyperLink::OPEN, m_hWnd); 

		if (cb > 1024)
			delete [] url;
	}
}

void kSheetView::SetCharFormatEx(CHARFORMAT2& cf, DWORD dwMask)
{
	cf.cbSize = sizeof CHARFORMAT2;
	cf.dwMask |= dwMask;
	
	CHARRANGE cr;
	GetSel(cr);
	if (cr.cpMax != cr.cpMin)
		SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);	
	else
		SendMessage(EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);		
}

////////////////////////////////////
// private

void kSheetView::SetNamePath(const TCHAR* path)
{	
	lstrcpy(m_path, path);
	const TCHAR* name = RFind(m_path, _T('\\'));
	if (name) lstrcpy(m_name, ++name);
}

bool kSheetView::DoLoad(const TCHAR* sPath, UINT uiFlag)
{
	HANDLE hFile = ::CreateFile(sPath, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);
	if(INVALID_HANDLE_VALUE == hFile) return false;

	EDITSTREAM es;
	es.dwCookie = (DWORD)hFile;
	es.dwError = 0;
	es.pfnCallback = StreamReadCallback;	
	
	DWORD dwSizeLow = GetFileSize(hFile, 0);	
	CProgressBarCtrl* progress = g_Context.m_frame->GetProgressBar();	
	ATLASSERT(progress->IsWindow());
	progress->SetRange32(0, dwSizeLow);
	progress->SetPos(0);
	
	StreamIn(GetType(sPath) | uiFlag, es);
	::CloseHandle(hFile);
	return !es.dwError;	
}

bool kSheetView::DoSave(const TCHAR* sPath, UINT uiFlag)
{
	HANDLE hFile = ::CreateFile(sPath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE | FILE_FLAG_SEQUENTIAL_SCAN, 0);
	if(INVALID_HANDLE_VALUE == hFile) return false;

	EDITSTREAM es;
	es.dwCookie = (DWORD)hFile;
	es.dwError = 0;
	es.pfnCallback = StreamWriteCallback;
	
	// ! approximate size
	DWORD dwSize = GetTextLengthEx(GTL_NUMBYTES | GTL_CLOSE, CP_ACP); 
	
	CProgressBarCtrl* progress = g_Context.m_frame->GetProgressBar();	
	ATLASSERT(progress->IsWindow());
	progress->SetRange32(0, dwSize);
	progress->SetPos(0);

	StreamOut(GetType(sPath) | uiFlag, es);
	::CloseHandle(hFile);
	return !es.dwError;			
}

int  kSheetView::GetType(const TCHAR* sPath) const
{
	int r = SF_TEXT;
	const TCHAR* ext = RFind(sPath, _T('.'));
	if ( ext && (lstrcmpi(ext, RTF_EXT) == 0) )
		r = SF_RTF;
	return r;
}

const TCHAR* kSheetView::RFind (const TCHAR* str, const TCHAR ch)
{
	TCHAR* p = (TCHAR*)str;	
	while (*p++);
	while (--p != str)
		if(*p == ch) 
			return p;	
	return 0;
}

const TCHAR* kSheetView::RFind (const TCHAR* str, const TCHAR* ss)
{
	TCHAR* p = (TCHAR*)str;	
	while (*p++);
	while (--p != str) {
		const TCHAR* p1 = ss;
		while(*p1) { 
			if(*p1 == *p) {
				return p;
			}
			p1++;
		}
	}
	return 0;

⌨️ 快捷键说明

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