📄 ksheet.cpp
字号:
/*
Copyright (c) 2000
Author: Konstantin Boukreev
E-mail: konstantin@mail.primorye.ru
Created: 26.06.2000 19:19:32
Version: 1.0.0
*/
#include "stdafx.h"
#include "kSheet.h"
#include "common.h"
kSheetsCtrl::kSheetsCtrl() :
m_winArrow((TCHAR*)CScrollBar::GetWndClassName(), this, 1),
m_winScroll((TCHAR*)CScrollBar::GetWndClassName(), this, 2)
{
m_iActive = -1;
m_xMoveBar = 0;
m_xPages = 0;
m_bShowScrollBar = true;
m_hCursor = 0;
m_bTrack = false;
SetRectEmpty(&m_rcClient);
SetRectEmpty(&m_rcScroll);
m_szArrow.cx = ::GetSystemMetrics(SM_CXHSCROLL) * 2;
m_szArrow.cy = ::GetSystemMetrics(SM_CYVSCROLL);
LOGFONT lf = {
80, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0, 0, 0, _T("Tahoma")
};
m_font.CreatePointFontIndirect(&lf);
lf.lfWeight = FW_BOLD;
m_bfont.CreatePointFontIndirect(&lf);
}
kSheetsCtrl::~kSheetsCtrl()
{
for (int i = 0; i < m_sheets.GetSize(); i++)
delete m_sheets[i];
}
//////////////////////////
// interface
kSheetView* kSheetsCtrl::Add()
{
kSheetView* sheet = new kSheetView;
m_sheets.Add(sheet);
HWND hWnd = sheet->Create(m_hWnd, m_rcClient, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL // | WS_HSCROLL
| ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_SAVESEL, 0);
hWnd;
ATLASSERT(hWnd != 0);
return sheet;
}
void kSheetsCtrl::Close(int iIndex)
{
ATLASSERT(iIndex >= 0 && iIndex < m_sheets.GetSize());
int iActive = m_iActive;
m_iActive = -1;
kSheetView* sheet = m_sheets[iIndex];
m_sheets.RemoveAt(iIndex);
sheet->DestroyWindow();
delete sheet;
if (m_sheets.GetSize() == 0)
{
m_winArrow.ShowWindow(SW_HIDE);
m_winScroll.ShowWindow(SW_HIDE);
Invalidate();
UpdateWindow();
OnNotify();
}
else
{
if (iIndex <= iActive)
iActive = max(0, iActive - 1);
Active(iActive);
RedrawNeed();
}
}
void kSheetsCtrl::Active(int iActive)
{
ATLASSERT(iActive != -1);
bool bFirst = false;
if (m_iActive != -1)
m_sheets[m_iActive]->ShowWindow(SW_HIDE);
else
bFirst = true;
m_iActive = iActive;
m_sheets[m_iActive]->SetWindowPos(0, &m_rcClient, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER);
m_sheets[m_iActive]->SetFocus();
OnNotify();
if (bFirst)
{
RECT rc;
GetClientRect(&rc);
m_winArrow.ShowWindow(SW_SHOW);
m_winScroll.ShowWindow(SW_SHOW);
ApplyLayout((rc.right - rc.left), (rc.bottom - rc.top));
}
UpdateScrollBar();
RedrawNeed();
}
/////////////////////////////////
//
BOOL kSheetsCtrl::PreTranslateMessage(MSG* pMsg)
{
if (IsEmpty())
return FALSE;
if (m_FindDlg.IsWindow() && m_FindDlg.IsDialogMessage(pMsg))
{
return TRUE;
}
else if (m_ReplaceDlg.IsWindow() && m_ReplaceDlg.IsDialogMessage(pMsg))
{
return TRUE;
}
ATLASSERT(m_iActive != -1);
if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB))
{
int i = 0;
if (GetKeyState(VK_CONTROL) < 0)
i = 1;
else if (GetKeyState(VK_SHIFT) < 0)
i = -1;
if (i != 0)
{
int iActive = m_iActive + i;
if (iActive == m_sheets.GetSize())
iActive = 0;
else if (iActive < 0)
iActive = m_sheets.GetSize() - 1;
Active(iActive);
return TRUE;
}
}
return m_sheets[m_iActive]->PreTranslateMessage(pMsg);
}
/////////////////////////
// window message
LRESULT kSheetsCtrl::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
RECT rc = {0,0,0,0};
HWND hWnd = m_winArrow.Create(m_hWnd, rc, 0, WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBS_HORZ, 0, 100);
ATLASSERT(hWnd != 0);
hWnd = m_winScroll.Create(m_hWnd, rc, 0, WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBS_HORZ, 0, 101);
ATLASSERT(hWnd != 0);
UpdateArrow();
DragAcceptFiles();
m_fr.m_hWndOwner = m_hWnd;
return 0;
}
LRESULT kSheetsCtrl::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
DragAcceptFiles(FALSE);
return 0;
}
LRESULT kSheetsCtrl::OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
if (wParam == SIZE_MINIMIZED) return 0;
if (IsEmpty()) return 0;
ApplyLayout(LOWORD(lParam), HIWORD(lParam));
return 0;
}
LRESULT kSheetsCtrl::OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
if (IsEmpty()) return 0;
if (!m_bShowScrollBar) return 0;
int x = LOWORD(lParam);
if (HitMoverBar(x))
{
m_hCursor = SetCursor(LoadCursor(0, IDC_SIZEWE));
}
else
{
if (m_bTrack)
{
SetMoveBar(x);
m_hCursor = SetCursor(LoadCursor(0, IDC_SIZEWE));
}
else if (m_hCursor)
{
SetCursor(m_hCursor);
m_hCursor = 0;
}
}
return 0;
}
LRESULT kSheetsCtrl::OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if (IsEmpty()) return 0;
if (m_bShowScrollBar && m_bTrack)
{
ReleaseCapture();
m_bTrack = false;
}
return 0;
}
LRESULT kSheetsCtrl::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
if (IsEmpty()) return 0;
int x = LOWORD(lParam);
if (m_bShowScrollBar && HitMoverBar(x))
{
SetCapture();
m_bTrack = true;
}
else
{
int n = HitTest(LOWORD(lParam), HIWORD(lParam));
if (n != m_iActive && n != -1)
Active(n);
}
return 0;
}
LRESULT kSheetsCtrl::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CPaintDC dc(m_hWnd);
if (!IsEmpty())
{
RECT rc = {0, 0, m_rcScroll.right - m_rcScroll.left, m_rcScroll.bottom - m_rcScroll.top};
RECT rc1 = {rc.right - GetSystemMetrics(SM_CXVSCROLL), rc.top, rc.right, rc.bottom};
CDC dcMem;
CBitmap bitmap;
dcMem.CreateCompatibleDC(dc);
bitmap.CreateCompatibleBitmap(dc, rc.right, rc.bottom);
HBITMAP hOldBitmap = dcMem.SelectBitmap(bitmap);
DrawSheets(dcMem, rc);
DrawMoveBar(dcMem, rc);
dcMem.FillRect(&rc1, GetSysColorBrush(COLOR_BTNFACE));
dc.BitBlt(m_rcScroll.left, m_rcScroll.top, rc.right, rc.bottom, dcMem, 0, 0, SRCCOPY);
dcMem.SelectBitmap(hOldBitmap);
}
return 0;
}
LRESULT kSheetsCtrl::OnEnLink(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
{
ATLASSERT(!IsEmpty());
m_sheets[m_iActive]->OnEnLink((ENLINK *)pnmh);
return 0;
}
///////////////////////////////////
//
void kSheetsCtrl::SetMoveBar (int x)
{
if ((x == m_xMoveBar)) return;
RECT rc = m_rcScroll;
int w = rc.right - rc.left;
int h = rc.bottom - rc.top;
if ((x > m_szArrow.cx) && (x < (w - m_szArrow.cx)))
{
int old = m_xMoveBar;
m_xMoveBar = x;
int cx = GetSystemMetrics(SM_CXVSCROLL);
m_winScroll.SetWindowPos(0, m_xMoveBar + 4, rc.top, w - m_xMoveBar - 4 - cx, h, SWP_NOZORDER);
int n = m_xPages - m_xMoveBar;
m_winArrow.SetScrollRange(0, max(0, n), TRUE);
if (m_xMoveBar < old)
{
CClientDC dc(m_hWnd);
DrawMoveBar(dc, m_rcScroll);
POINT pts[] = {{m_xMoveBar, 0}, {old, 0}};
DrawCurve(dc, GetSysColor(COLOR_BTNFACE), pts, 2, true);
}
else
{
RedrawNeed();
}
}
}
int kSheetsCtrl::HitTest(int xMouse, int)
{
if (xMouse >= m_xMoveBar || xMouse <= m_szArrow.cx)
return -1;
CClientDC dc(m_hWnd);
HFONT hOldFont = dc.SelectFont(m_font);
int iReturn = -1;
int x = m_szArrow.cx + 10;
int delta = m_winArrow.GetScrollPos();
// int xStart = delta + x;
int i = 0;
xMouse += delta;
for (int idx = 0; idx < m_sheets.GetSize(); idx++)
{
kSheetView* pSheet = m_sheets[idx];
RECT rt = {x, 0, 0, 0};
dc.DrawText(pSheet->Name(), -1, &rt, DT_CALCRECT);
if ((xMouse >= (rt.left - 4)) && (xMouse <= (rt.right + 4)))
{
iReturn = i;
break;
}
if ((x - delta) >= m_xMoveBar)
break;
x += rt.right - rt.left + 14;
i++;
}
if (hOldFont)
dc.SelectFont(hOldFont);
return iReturn;
}
bool kSheetsCtrl::HitMoverBar (int x)
{
int left = m_xMoveBar - 1;
int right = left + 4;
return ((x >= left) && (x <= right));
}
void kSheetsCtrl::RedrawNeed()
{
if (IsWindow())
{
RECT rc = m_rcScroll;
// rc.left = m_szArrow.cx;
// rc.right = m_xMoveBar;
InvalidateRect(&rc, FALSE);
UpdateWindow();
}
}
void kSheetsCtrl::ApplyLayout(int nWidth, int nHeight)
{
int cx = GetSystemMetrics(SM_CXVSCROLL);
SetRect(&m_rcClient, 0, 0, nWidth, nHeight - m_szArrow.cy);
SetRect(&m_rcScroll, 0, m_rcClient.bottom, nWidth, nHeight);
if (!m_bShowScrollBar)
{
m_xMoveBar = nWidth;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -