📄 scrolldemoview.cpp
字号:
// ScrollDemoView.cpp : implementation of the CScrollDemoView class
//
#include "stdafx.h"
#include "ScrollDemo.h"
#include "ScrollDemoDoc.h"
#include "ScrollDemoView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScrollDemoView
IMPLEMENT_DYNCREATE(CScrollDemoView, CScrollView)
BEGIN_MESSAGE_MAP(CScrollDemoView, CScrollView)
//{{AFX_MSG_MAP(CScrollDemoView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScrollDemoView construction/destruction
CScrollDemoView::CScrollDemoView()
{
m_font.CreatePointFont (80, _T ("MS Sans Serif"));
}
CScrollDemoView::~CScrollDemoView()
{
}
BOOL CScrollDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CScrollDemoView drawing
void CScrollDemoView::OnDraw(CDC* pDC)
{
CScrollDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//
// Draw the grid lines.
//
CSize size = GetTotalSize ();
CPen pen (PS_SOLID, 0, RGB (192, 192, 192));
CPen* pOldPen = pDC->SelectObject (&pen);
for (int i=0; i<99; i++) {
int y = (i * m_nCellHeight) + m_nCellHeight;
pDC->MoveTo (0, y);
pDC->LineTo (size.cx, y);
}
for (int j=0; j<26; j++) {
int x = (j * m_nCellWidth) + m_nRibbonWidth;
pDC->MoveTo (x, 0);
pDC->LineTo (x, size.cy);
}
pDC->SelectObject (pOldPen);
//
// Draw the bodies of the rows and column headers.
//
CBrush brush;
brush.CreateStockObject (LTGRAY_BRUSH);
CRect rcTop (0, 0, size.cx, m_nCellHeight);
pDC->FillRect (rcTop, &brush);
CRect rcLeft (0, 0, m_nRibbonWidth, size.cy);
pDC->FillRect (rcLeft, &brush);
pDC->MoveTo (0, m_nCellHeight);
pDC->LineTo (size.cx, m_nCellHeight);
pDC->MoveTo (m_nRibbonWidth, 0);
pDC->LineTo (m_nRibbonWidth, size.cy);
pDC->SetBkMode (TRANSPARENT);
//
// Add numbers and button outlines to the row headers.
//
for (i=0; i<99; i++) {
int y = (i * m_nCellHeight) + m_nCellHeight;
pDC->MoveTo (0, y);
pDC->LineTo (m_nRibbonWidth, y);
CString string;
string.Format (_T ("%d"), i + 1);
CRect rect (0, y, m_nRibbonWidth, y + m_nCellHeight);
pDC->DrawText (string, &rect, DT_SINGLELINE |
DT_CENTER | DT_VCENTER);
rect.top++;
pDC->Draw3dRect (rect, RGB (255, 255, 255),
RGB (128, 128, 128));
}
//
// Add letters and button outlines to the column headers.
//
for (j=0; j<26; j++) {
int x = (j * m_nCellWidth) + m_nRibbonWidth;
pDC->MoveTo (x, 0);
pDC->LineTo (x, m_nCellHeight);
CString string;
string.Format (_T ("%c"), j + 'A');
CRect rect (x, 0, x + m_nCellWidth, m_nCellHeight);
pDC->DrawText (string, &rect, DT_SINGLELINE |
DT_CENTER | DT_VCENTER);
rect.left++;
pDC->Draw3dRect (rect, RGB (255, 255, 255),
RGB (128, 128, 128));
}
//
// Draw address labels into the individual cells.
//
CRect rect;
pDC->GetClipBox (&rect);
int nStartRow = max (0, (rect.top - m_nCellHeight) / m_nCellHeight);
int nEndRow = min (98, (rect.bottom - 1) / m_nCellHeight);
int nStartCol = max (0, (rect.left - m_nRibbonWidth) / m_nCellWidth);
int nEndCol = min (25, ((rect.right + m_nCellWidth - 1) -
m_nRibbonWidth) / m_nCellWidth);
for (i=nStartRow; i<=nEndRow; i++)
for (j=nStartCol; j<=nEndCol; j++)
DrawAddress (pDC, i, j);
//
// Draw the cell pointer.
//
DrawPointer (pDC, m_nCurrentRow, m_nCurrentCol, TRUE);
}
void CScrollDemoView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
m_nCurrentRow = 0;
m_nCurrentCol = 0;
m_bSmooth = FALSE;
CClientDC dc (this);
m_nCellWidth = dc.GetDeviceCaps (LOGPIXELSX);
m_nCellHeight = dc.GetDeviceCaps (LOGPIXELSY) / 4;
m_nRibbonWidth = m_nCellWidth / 2;
int nWidth = (26 * m_nCellWidth) + m_nRibbonWidth;
int nHeight = m_nCellHeight * 100;
SetScrollSizes (MM_TEXT, CSize (nWidth, nHeight));
}
/////////////////////////////////////////////////////////////////////////////
// CScrollDemoView diagnostics
#ifdef _DEBUG
void CScrollDemoView::AssertValid() const
{
CScrollView::AssertValid();
}
void CScrollDemoView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CScrollDemoDoc* CScrollDemoView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CScrollDemoDoc)));
return (CScrollDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CScrollDemoView message handlers
void CScrollDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
CScrollView::OnLButtonDown(nFlags, point);
//
// Convert the click point to logical coordinates.
//
CPoint pos = point;
CClientDC dc (this);
OnPrepareDC (&dc);
dc.DPtoLP (&pos);
//
// If a cell was clicked, move the cell pointer.
//
CSize size = GetTotalSize ();
if (pos.x > m_nRibbonWidth && pos.x < size.cx &&
pos.y > m_nCellHeight && pos.y < size.cy) {
int row = (pos.y - m_nCellHeight) / m_nCellHeight;
int col = (pos.x - m_nRibbonWidth) / m_nCellWidth;
ASSERT (row >= 0 && row <= 98 && col >= 0 && col <= 25);
DrawPointer (&dc, m_nCurrentRow, m_nCurrentCol, FALSE);
m_nCurrentRow = row;
m_nCurrentCol = col;
DrawPointer (&dc, m_nCurrentRow, m_nCurrentCol, TRUE);
}
}
void CScrollDemoView::DrawPointer(CDC *pDC, int row, int col, BOOL bHighlight)
{
CRect rect;
GetCellRect (row, col, &rect);
CBrush brush (bHighlight ? RGB (0, 255, 255) :
::GetSysColor (COLOR_WINDOW));
pDC->FillRect (rect, &brush);
DrawAddress (pDC, row, col);
}
void CScrollDemoView::DrawAddress(CDC *pDC, int row, int col)
{
CRect rect;
GetCellRect (row, col, &rect);
CString string;
string.Format (_T ("%c%d"), col + _T ('A'), row + 1);
pDC->SetBkMode (TRANSPARENT);
CFont* pOldFont = pDC->SelectObject (&m_font);
pDC->DrawText (string, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
pDC->SelectObject (pOldFont);
}
void CScrollDemoView::GetCellRect(int row, int col, LPRECT pRect)
{
pRect->left = m_nRibbonWidth + (col * m_nCellWidth) + 1;
pRect->top = m_nCellHeight + (row * m_nCellHeight) + 1;
pRect->right = pRect->left + m_nCellWidth - 1;
pRect->bottom = pRect->top + m_nCellHeight - 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -