ksheet.cpp

来自「WTL开发的一个写字板程序 ,很有借鉴意义」· C++ 代码 · 共 792 行 · 第 1/2 页

CPP
792
字号
	}
	else
	{
		if (!m_xMoveBar)
		{
			m_xMoveBar = nWidth / 4 * 3;	
			m_xPages = m_xMoveBar; 
		}
		else
		{
			int rborder = nWidth - cx - m_szArrow.cx - 4;
			m_xMoveBar = max(m_xMoveBar, nWidth / 2);		
			m_xMoveBar = min(m_xMoveBar, rborder);		
		}	
	}

	int i = 2;
	i += (m_bShowScrollBar ? 1 : 0);

	ATLASSERT(m_iActive != -1);
	
	HDWP hdwp = BeginDeferWindowPos(i);		
		if (m_bShowScrollBar)
			m_winScroll.DeferWindowPos(hdwp, 0, m_xMoveBar + 4, m_rcScroll.top, nWidth - m_xMoveBar - 4 - cx, m_szArrow.cy, SWP_NOZORDER); 		
		m_winArrow.DeferWindowPos(hdwp, 0, 0, m_rcScroll.top, m_szArrow.cx, m_szArrow.cy, SWP_NOZORDER); 
		m_sheets[m_iActive]->DeferWindowPos(hdwp, 0, 0, 0, nWidth, nHeight - m_szArrow.cy, SWP_NOZORDER); 
	EndDeferWindowPos(hdwp);

	UpdateArrow();
	UpdateScrollBar();
}


////////////////////////////////////////////////
// scroll

LRESULT kSheetsCtrl::OnRequestResize(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/)
{
	REQRESIZE *prs = reinterpret_cast<REQRESIZE *>(pnmh);

	HWND hWnd = prs->nmhdr.hwndFrom;
	::SendMessage(hWnd, WM_NOTIFY, idCtrl, (LPARAM)pnmh);

	if (m_iActive != -1) //!
		UpdateScrollBar();
	return 0;
}

LRESULT kSheetsCtrl::OnHScrollNotify(WORD /*wNotifyCode*/, WORD /*wID*/, HWND hWndCtl, BOOL& /*bHandled*/)
{	
	kSheetView* sheet = m_sheets[m_iActive];

	hWndCtl;
	ATLASSERT(hWndCtl == sheet->m_hWnd);

	POINT pt;
	int nMin, nMax;

	sheet->SendMessage(EM_GETSCROLLPOS, 0, (LPARAM)&pt);	
	m_winScroll.GetScrollRange(&nMin, &nMax);
	m_winScroll.SetScrollPos(min(pt.x, nMax));

	return 0;
}

LRESULT kSheetsCtrl::OnHScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	HWND hWnd = (HWND) lParam;
	if (m_winArrow == hWnd)
	{		
		SCROLLINFO si;
		si.cbSize = sizeof SCROLLINFO;
		si.fMask = SIF_RANGE | SIF_POS;			
		m_winArrow.GetScrollInfo(&si);	

		int delta = 0;
		
		switch (LOWORD(wParam))
		{
			case SB_LINELEFT: 
				delta = - DELTA_ARROW; 
				break;
			case SB_LINERIGHT: 
				delta =  DELTA_ARROW; 
				break;
			case SB_ENDSCROLL: 
				UpdateArrow(); 
				return 0;
			default: 
				ATLASSERT(0); 
				break;
		}

		int n = min(si.nPos + delta, si.nMax);
		n = max(0, n);
	
		if (n != si.nPos)
		{				
			m_winArrow.SetScrollPos(n);
			RedrawNeed();
		}
	} 
	else if (m_winScroll == hWnd)
	{
		
		kSheetView* sheet = m_sheets[m_iActive];
		sheet->SendMessage(uMsg, wParam, lParam);		

		if (SB_THUMBPOSITION == LOWORD(wParam)) {
			BOOL b;
			OnHScrollNotify(0, 0, sheet->m_hWnd, b);
		}
	}
	return 0;
}

void kSheetsCtrl::UpdateScrollBar ()
{
	ATLASSERT(m_iActive != -1);
	kSheetView* sheet = m_sheets[m_iActive];

	RECT rc;
	sheet->GetWindowRect(&rc);	
	int cx = rc.right - rc.left;

	if (cx > sheet->GetRequestWidth())	
		m_winScroll.EnableScrollBar(ESB_DISABLE_BOTH);	
	else
		m_winScroll.SetScrollRange(0, sheet->GetRequestWidth() - cx, TRUE);			
}

void kSheetsCtrl::UpdateArrow ()
{
	m_winArrow.EnableScrollBar(ESB_ENABLE_BOTH);

	SCROLLINFO si; 
	si.cbSize = sizeof SCROLLINFO;
	si.fMask = SIF_RANGE | SIF_POS;
	m_winArrow.GetScrollInfo(&si);
		
	if (si.nPos >= si.nMax)
		m_winArrow.EnableScrollBar(ESB_DISABLE_RIGHT);
	if (si.nPos <= si.nMin)
		m_winArrow.EnableScrollBar(ESB_DISABLE_LEFT);	
}

//////////////////////////
// draw code

void kSheetsCtrl::DrawSheets(HDC hdc, RECT& rcDraw)
{
	CDCHandle dc(hdc);

	RECT rc = {m_szArrow.cx, rcDraw.top, m_xMoveBar, rcDraw.bottom};
	dc.FillRect(&rc, GetSysColorBrush(COLOR_BTNFACE));

	HFONT hOldFont = dc.SelectFont(m_font);		
	dc.SetBkMode(TRANSPARENT);	
	dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));

	CRgn rgnActive;
	RECT rtActive = {0, 0, 0, 0}; 
	POINT pActivePage[4];

	int y = rc.top;
	int h = rc.bottom - rc.top;
//	int w = rc.right - rc.left; 
	int x = rc.left + 10; // !
	int delta = m_winArrow.GetScrollPos(); 
	int xStart = delta + x;	
//	int cxHide = 0;
	int i = 0;

	POINT pts[] = {{0, y}, {m_xMoveBar + 4, y}};
	DrawCurve(dc, GetSysColor(COLOR_WINDOWFRAME), pts, 2, true);
 		
	for (int idx = 0; idx < m_sheets.GetSize(); idx++)
	{		
		kSheetView* pSheet = m_sheets[idx];		
		RECT rt = {x, y, 0, 0};
		
		dc.DrawText(pSheet->Name(), -1, &rt, DT_CALCRECT);

		if (((rt.right + 10) >= xStart) && ((x - delta) < m_xMoveBar))
		{			
			rt.left -= delta + 4;	
			rt.right -= delta - 4;			
			rt.top = y; 
			rt.bottom = y + h; 
					
			POINT pPage[4] = {
				{rt.left - 6, y}, 
				{rt.left, rt.bottom}, 
				{rt.right, rt.bottom}, 
				{rt.right + 6, y} };
					 
			CRgn rgn;
			rgn.CreatePolygonRgn(pPage, 4, WINDING);
			dc.FillRgn(rgn, GetSysColorBrush(COLOR_BTNFACE));
			dc.FrameRgn(rgn, GetSysColorBrush(COLOR_WINDOWFRAME), 1, 1);	
			dc.DrawText(pSheet->Name(), -1, &rt, DT_VCENTER | DT_SINGLELINE | DT_CENTER);
					
			if (i == m_iActive)
			{
				rgnActive.CreatePolygonRgn(pPage, 4, ALTERNATE);
				rtActive = rt;
				memcpy(pActivePage, pPage, sizeof POINT * 4);
			}
			x += rt.right - rt.left + 6;
		}
		else			
			x += rt.right - rt.left + 14;		//4+4+6
		i++;
	}	
	
	m_xPages = x;
	if (m_xPages > m_xMoveBar)	
		m_winArrow.SetScrollRange(0, m_xPages - m_xMoveBar, TRUE);
	else
		UpdateArrow();			

	if ((m_iActive != -1) && rgnActive)
	{		
		kSheetView* pSheet = m_sheets[m_iActive];		
		dc.SelectFont(m_bfont);	

		CBrush br;
		br.CreateSolidBrush(pSheet->GetBackgroundColor());
		dc.FillRgn(rgnActive, br); 
		dc.FrameRgn(rgnActive, GetSysColorBrush(COLOR_WINDOWFRAME), 1, 1);
		dc.DrawText(pSheet->Name(), -1, &rtActive, DT_VCENTER | DT_SINGLELINE | DT_CENTER);

		POINT pts[] = {{pActivePage[0].x, pActivePage[0].y}, {pActivePage[3].x, pActivePage[3].y}};
		DrawCurve(dc, pSheet->GetBackgroundColor(), pts, 2, true);
	}
	
	if (hOldFont)	
		dc.SelectFont(hOldFont);			
}

void kSheetsCtrl::DrawMoveBar(HDC hdc, RECT& rcDraw)
{
	RECT rc = {m_xMoveBar, rcDraw.top + 1, m_xMoveBar + 2, rcDraw.bottom};

	POINT pt0[] = {{rc.left, rc.top}, {rc.left, rc.bottom}};
	POINT pt1[] = {{rc.left + 1, rc.top}, {rc.left + 1, rc.bottom}};
	POINT pt2[] = {{rc.left + 2, rc.top}, {rc.left + 2, rc.bottom}};

	DrawCurve(hdc, GetSysColor(COLOR_WINDOWFRAME), pt0, 2, true);	
	DrawCurve(hdc, GetSysColor(COLOR_3DHILIGHT), pt1, 2, true);
	DrawCurve(hdc, GetSysColor(COLOR_BTNFACE), pt2, 2, true);
}

void kSheetsCtrl::DrawCurve(HDC hdc, COLORREF clr, POINT* pts, int n, bool bMove)
{
	CDCHandle dc(hdc);

	CPen pen;
	pen.CreatePen(PS_SOLID, 1, clr); 
	HPEN hOldPen = dc.SelectPen(pen);		
	
	int  i = 0;
	if (bMove)
	{
		dc.MoveTo(pts[0].x, pts[0].y, 0); 
		i = 1;
	}

	for (; i < n; i++)
		dc.LineTo(pts[i].x, pts[i].y);	
	
	dc.SelectPen(hOldPen);	
}

//////////////////////////////////////////////////////
// find

LRESULT kSheetsCtrl::OnEditFind(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (m_FindDlg.IsWindow()) 
	{
		m_FindDlg.SetFocus();
		return 1;
	}
	
	if (m_ReplaceDlg.IsWindow())
	{
		m_ReplaceDlg.SendMessage(WM_CLOSE);
	}

	if(m_FindDlg.CreateEx(&m_fr) == 0)
	{		
		::MessageBeep((UINT)-1);
		return 1;
	}
	
	m_FindDlg.ShowWindow(SW_NORMAL);
	return 0;
}
LRESULT kSheetsCtrl::OnEditFindNext(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
	if(m_fr.m_szFindWhat[0] == 0)
		return OnEditFind(wNotifyCode, wID, hWndCtl, bHandled);

	ATLASSERT(!IsEmpty());
	kSheetView* sheet = m_sheets[m_iActive];

	if (!sheet->DoFindNext(&m_fr))
		::MessageBeep((UINT)-1);
	return 0;
}
LRESULT kSheetsCtrl::OnEditReplace(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (m_ReplaceDlg.IsWindow()) 
	{
		m_ReplaceDlg.SetFocus();
		return 1;
	}
	
	if (m_FindDlg.IsWindow())
	{
		m_FindDlg.SendMessage(WM_CLOSE);
	}

	if(m_ReplaceDlg.CreateEx(&m_fr) == 0)
	{		
		::MessageBeep((UINT)-1);
		return 1;
	}
	
	m_ReplaceDlg.ShowWindow(SW_NORMAL);
	return 0;
}

LRESULT kSheetsCtrl::OnFindReplaceCmd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
	lParam;
	ATLASSERT(lParam == (LPARAM)&m_fr);
	ATLASSERT(!IsEmpty());

	kSheetView* sheet = m_sheets[m_iActive];

	if(m_fr.FindNext())
	{
		if(!sheet->DoFindNext(&m_fr)) {
			g_Context.m_frame->Send_RefreshStatusBar(_T("Error. Can't found '%s'"), m_fr.m_szFindWhat); 
			::MessageBeep((UINT)-1);
		}
		else {		
			int nRow = 0; int nCol = 0;				
			sheet->GetCurrentRowCol(nRow, nCol, true);
			g_Context.m_frame->Send_RefreshStatusBar(_T("Ok. Found '%s' in {%d, %d}"), m_fr.m_szFindWhat, nRow, nCol); 
		}
	}
	else if(m_fr.ReplaceCurrent())
	{
		if(!sheet->DoReplaceCurrent(&m_fr))
			::MessageBeep((UINT)-1);
	}
	else if(m_fr.ReplaceAll())
	{
		if(!sheet->DoReplaceAll(&m_fr))
			::MessageBeep((UINT)-1);
	}

	if(m_fr.IsTerminating()) {				
		// nothing
	}
	
	return 0;
}

//////////////////////////////
// drop files 

LRESULT kSheetsCtrl::OnDropFiles(UINT, WPARAM wParam, LPARAM, BOOL&)
{
	DoDropFiles((HDROP) wParam);
	return 0;
}

LRESULT kSheetsCtrl::OnEnDropFiles(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
{
	ENDROPFILES *df = (ENDROPFILES *)pnmh;
	DoDropFiles((HDROP) df->hDrop );	
	return 0;
}

void kSheetsCtrl::DoDropFiles(HDROP hDrop)
{
	TCHAR sPath[MAX_PATH] = {0};
	DragQueryFile(hDrop, 0, sPath, MAX_PATH);
	if (lstrlen(sPath))
		g_Context.m_frame->DoFileOpen(sPath, true); 			
	DragFinish(hDrop);
}

⌨️ 快捷键说明

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