📄 ksheetview.cpp
字号:
}
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 + -