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

📄 ksheetview.cpp

📁 WTL开发的一个写字板程序 ,很有借鉴意义
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

bool kSheetView::PathExists (const TCHAR* path) const
{	
	WIN32_FIND_DATA fd;
	HANDLE hFind = FindFirstFile(path, &fd);
	if (INVALID_HANDLE_VALUE == hFind)
		return false;
	FindClose(hFind);
	return true;
}

DWORD CALLBACK kSheetView::StreamWriteCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
	_ASSERTE(dwCookie != 0);
	_ASSERTE(pcb != NULL);

	DWORD dwRet = ::WriteFile((HANDLE)dwCookie, pbBuff, cb, (LPDWORD)pcb, NULL);	
	g_Context.m_frame->GetProgressBar()->OffsetPos(*pcb);	
	return !dwRet;
}

DWORD CALLBACK kSheetView::StreamReadCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
	_ASSERTE(dwCookie != 0);
	_ASSERTE(pcb != NULL);

	DWORD dwRet = ::ReadFile((HANDLE)dwCookie, pbBuff, cb, (LPDWORD)pcb, NULL);
	g_Context.m_frame->GetProgressBar()->OffsetPos(*pcb);
	return !dwRet;
}

void kSheetView::InvertEffect (DWORD dwMask, DWORD dwEffect)
{
	CHARFORMAT2 cf;	
		
	GetCharFormatEx(cf, dwMask);	

	if (cf.dwEffects & dwEffect)
		cf.dwEffects &= ~dwEffect;
	else
		cf.dwEffects |= dwEffect;
	
	SetCharFormatEx(cf, dwMask);	
}

void kSheetView::SetAlignment (WORD dwAlign)
{
	PARAFORMAT pf;
	pf.cbSize = sizeof PARAFORMAT;
	pf.dwMask = PFM_ALIGNMENT;
	pf.wAlignment = dwAlign;
	SetParaFormat(pf);
}

void kSheetView::GetFormatColor (CHARFORMAT2& cf, OLE_COLOR& clr, DWORD iItem)
{
	cf.cbSize = sizeof CHARFORMAT2;

	if (ID_FORMAT_COLOR == iItem) 
	{
		cf.dwMask |= CFM_COLOR;
		SendMessage(EM_GETCHARFORMAT, 1, (LPARAM)&cf);	
		clr = cf.crTextColor;
	}
	else if (ID_FORMAT_HIGHLIGHT == iItem) 
	{
		cf.dwMask |= CFM_BACKCOLOR;
		SendMessage(EM_GETCHARFORMAT, 1, (LPARAM)&cf);	
		clr = cf.crBackColor;
	} 
	else 
	{
		clr = m_clrBackColor;
	}
}

void kSheetView::SetColor (OLE_COLOR clrNew, OLE_COLOR clrOld, DWORD iItem)
{
	if (clrNew != clrOld)
	{
		OleTranslateColor(clrNew, 0, &clrNew);

		CHARFORMAT2 cf;
		cf.cbSize = sizeof CHARFORMAT2;
		cf.dwEffects = 0;		

		if (ID_FORMAT_COLOR == iItem) 
		{
			cf.dwMask = CFM_COLOR;
			cf.crTextColor = clrNew;
			SendMessage(EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);	
			m_clrTextColor = clrNew;
		}
		else if (ID_FORMAT_HIGHLIGHT == iItem) 
		{
			cf.dwMask = CFM_BACKCOLOR;
			cf.crBackColor = clrNew;
			SendMessage(EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);	
			m_clrHighlightColor = clrNew;
		}		
		else 
		{
			SendMessage(EM_SETBKGNDCOLOR, 0, clrNew);
			m_clrBackColor = clrNew;
			::InvalidateRect(GetParent(), 0, TRUE);
		}
	}
}

/////////////////////////////////////////
// window message

LRESULT kSheetView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
	DragAcceptFiles();
	SetEventMask(ENM_REQUESTRESIZE | ENM_SCROLL | ENM_DROPFILES);	
	SetModify(FALSE);

	#ifdef _RICHEDIT_USE_TOM
	CComPtr<IRichEditOle> pRichEdit;
	pRichEdit.Attach(GetOleInterface());		
	if (pRichEdit.p) {		
//		"8CC497C0-A1DF-11ce-8098-00AA0047BE5D"
		GUID iid = {0x8CC497C0, 0xA1DF, 0x11ce, {0x80, 0x98, 0x00, 0xAA, 0x00, 0x47, 0xBE, 0x5D}};		
		pRichEdit->QueryInterface(iid, (void**)&m_pTom); 
		ATLASSERT(m_pTom.p);
		if (-1 == m_dispidUndo)
		{
			wchar_t* names[] = {L"Undo"};
			DISPID dispids[] = {0};
			m_pTom->GetIDsOfNames(IID_NULL, names, 1, LOCALE_SYSTEM_DEFAULT, dispids);
			m_dispidUndo = dispids[0];
		}
	}
	#endif //_RICHEDIT_USE_TOM
	return lRet;
}

LRESULT kSheetView::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
	bHandled = FALSE;
	DragAcceptFiles(FALSE);
	return 0;
}

LRESULT kSheetView::OnKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
			
	UpdateCurrentRowCol();

	if ((VK_SPACE == wParam) || (VK_RETURN == wParam)) 
	{
		if (!m_bSpace) 
		{
			SendMessage(EM_STOPGROUPTYPING);
			m_bSpace = true;
		}
	}
	else
	{
		if (m_bSpace) 
		{
			SendMessage(EM_STOPGROUPTYPING);
			m_bSpace = false;
		}
	}

	return lRet;
}

LRESULT kSheetView::OnEditWordWrap(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{	
	m_bWordWrap = !m_bWordWrap;
	int nLine = m_bWordWrap ? 0 : 1;
	SetTargetDevice(NULL, nLine);
	return 0;
}

LRESULT kSheetView::OnFormatFont(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	CHARFORMAT cf;	
	GetSelectionCharFormat(cf);		
	CRichEditFontDialog dlg(cf, CF_SCREENFONTS | CF_EFFECTS, 0, m_hWnd);
	
	if (dlg.DoModal() == IDOK)
	{
		dlg.GetCharFormat(cf);
		SetSelectionCharFormat(cf);	
	}
	return 0;
}

LRESULT kSheetView::OnFormatColor(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/)
{	
	ATLASSERT((wID == ID_FORMAT_COLOR) || (wID == ID_FORMAT_BGRN) || (wID == ID_FORMAT_HIGHLIGHT));

	OLE_COLOR clrNew, clrOld;
	CHARFORMAT2 cf;	
	cf.dwMask = CFM_SIZE;		
	GetFormatColor(cf, clrOld, wID);
	
	if (hWndCtl != 0)
	{
		if (wID == ID_FORMAT_COLOR)
			clrNew = m_clrTextColor;
		else if (wID == ID_FORMAT_HIGHLIGHT)
			clrNew = m_clrHighlightColor;
		else
			clrNew = m_clrBackColor;			
	}
	else
	{			
		if (wNotifyCode == 1)
		{		
			// accel
			if (GetFocus() != m_hWnd) 
				return 0;
		
			POINT pt;
			::GetCaretPos(&pt);			
			CClientDC dc(m_hWnd);			
			int nLogPix = dc.GetDeviceCaps(LOGPIXELSX);	
			pt.y += ::MulDiv(cf.yHeight, nLogPix, 1440);
		 			
			MapWindowPoints(HWND_DESKTOP, &pt, 1);		
			
			kColorDlg dlg;
			if (dlg.Pick(m_hWnd, pt.x, pt.y, clrOld, &clrNew) != S_OK) 
				return 0;
		}
		else 
		{
			// menu 			
			CColorDialog dlg(clrOld);
			if (dlg.DoModal() != IDOK)			
				return 0;
			clrNew = dlg.m_cc.rgbResult; 
		}		
	}

	SetColor(clrNew, clrOld, wID);
	return 0;
}

LRESULT kSheetView::OnToolbarDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
{	
	NMTOOLBAR* ptb = (NMTOOLBAR *) pnmh;
	ATLASSERT((ptb->iItem == ID_FORMAT_COLOR) || (ptb->iItem == ID_FORMAT_BGRN) || (ptb->iItem == ID_FORMAT_HIGHLIGHT));
	
	OLE_COLOR clrOld, clrNew; 
	POINT pt; RECT rc; 
//	int iIndex = -1; 
	CHARFORMAT2 cf;
		
	GetFormatColor(cf, clrOld, ptb->iItem);

	CToolBarCtrl tbar(pnmh->hwndFrom);	
	BOOL b = tbar.GetItemRect(tbar.CommandToIndex(ptb->iItem), &rc);	
	b;
	ATLASSERT(b);	
	pt.x = rc.left; pt.y = rc.bottom;
	tbar.MapWindowPoints(HWND_DESKTOP, &pt, 1);

	kColorDlg dlg;	
	if (dlg.Pick(m_hWnd, pt.x, pt.y, clrOld, &clrNew) != S_OK) 
		return 0;

	SetColor(clrNew, clrOld, ptb->iItem);
	return TBDDRET_DEFAULT;
}

LRESULT kSheetView::OnFormatBold(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	InvertEffect(CFM_BOLD, CFE_BOLD);	
	return 0;
}

LRESULT kSheetView::OnFormatItalic(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	InvertEffect(CFM_ITALIC, CFE_ITALIC);	
	return 0;
}

LRESULT kSheetView::OnFormatUnderline(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	InvertEffect(CFM_UNDERLINE, CFE_UNDERLINE);
	return 0;
}

LRESULT kSheetView::OnFormatAlignCnt(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	SetAlignment(PFA_CENTER);
	return 0;
}

LRESULT kSheetView::OnFormatAlignLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	SetAlignment(PFA_LEFT);
	return 0;
}

LRESULT kSheetView::OnFormatAlignRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	SetAlignment(PFA_RIGHT);
	return 0;
}

LRESULT kSheetView::OnRefreshKeyboardLayout (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{	
	::PostMessage(g_Context.m_frame->GetWindow(), uMsg, wParam, lParam);
	return 0;
}

LRESULT kSheetView::OnRequestResize(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
{
	REQRESIZE *prs = (REQRESIZE *)pnmh;		
	ATLASSERT(prs->nmhdr.hwndFrom == m_hWnd);
	m_iRequestWidth = prs->rc.right - prs->rc.left;	
	return 0;
}

////////////////////////////////////
// find & replace function

bool kSheetView::DoFindNext(FindReplace* fr, BOOL bNext)
{
	ATLASSERT(fr != 0);
		
	CHARRANGE chrg;
	GetSel(chrg);

	FINDTEXTEX ft;
	
	if (fr->SearchDown()) 
	{
		ft.chrg.cpMin = bNext ? chrg.cpMax : chrg.cpMin;
		ft.chrg.cpMax = -1;
	} 
	else
	{
		ft.chrg.cpMin = chrg.cpMin;
		ft.chrg.cpMax = -1;
	}

	ft.lpstrText = fr->m_szFindWhat;

	if(FindText(fr->m_dwFlags, ft) == -1) 
		return false;
	
	SetSel(ft.chrgText);
	return true;
}

bool kSheetView::DoReplaceCurrent(FindReplace* fr)
{
	CHARRANGE chrg;
	GetSel(chrg);

	if(chrg.cpMin != chrg.cpMax)
	{
		USES_CONVERSION;
		LPSTR lpstrTextA = (LPSTR)_alloca(chrg.cpMax - chrg.cpMin + 2);
		GetSelText(lpstrTextA);
		LPTSTR lpstrText = A2T(lpstrTextA);
		int nRet;
		if(fr->MatchCase())
			nRet = lstrcmp(lpstrText, fr->m_szFindWhat);
		else
			nRet = lstrcmpi(lpstrText, fr->m_szFindWhat);
		if(nRet == 0)
			ReplaceSel(fr->m_szReplaceWith, TRUE);
	}

	return DoFindNext(fr);	
}

bool kSheetView::DoReplaceAll(FindReplace* fr)
{
	HCURSOR hOldCursor = 0;
		
	if(!DoFindNext(fr, FALSE))
		return false;
		
	SetRedraw(FALSE);
	
	hOldCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));

	do {
		ReplaceSel(fr->m_szReplaceWith, TRUE);
	} while(DoFindNext(fr, FALSE));
	
	SetRedraw(TRUE);
	Invalidate();
	UpdateWindow();

	if(hOldCursor != 0)
		::SetCursor(hOldCursor);

	return true;
}

⌨️ 快捷键说明

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