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

📄 ksheet.cpp

📁 WTL开发的一个写字板程序 ,很有借鉴意义
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
 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 + -