accel.h
#define LINESIZE 8
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
int m_nCellWidth;
int m_nCellHeight;
int m_nRibbonWidth;
int m_nViewWidth;
int m_nViewHeight;
int m_nHScrollPos;
int m_nVScrollPos;
int m_nHPageSize;
int m_nVPageSize;
public:
DECLARE_MESSAGE_MAP()
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnSize(UINT nType, int cx, int cy);
};
accel.cpp
#include
#include "Accel.h"
CMyApp app;
BOOL CMyApp::InitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
this->m_pMainWnd = new CMainWindow();
this->m_pMainWnd->ShowWindow(this->m_nCmdShow);
this->m_pMainWnd->UpdateWindow();
return TRUE;
//return CWinApp::InitInstance();
}
CMainWindow::CMainWindow()
: m_nCellWidth(0)
, m_nCellHeight(0)
, m_nRibbonWidth(0)
, m_nViewWidth(0)
, m_nViewHeight(0)
{
this->Create(NULL, _T("Accel"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL);
}BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_SIZE()
END_MESSAGE_MAP()
int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CClientDC dc(this);
m_nCellWidth = dc.GetDeviceCaps(LOGPIXELSX);//计算一个英寸为多少像素
m_nCellHeight = dc.GetDeviceCaps(LOGPIXELSY) / 4;//1/4英寸
m_nRibbonWidth = m_nCellWidth / 2;
m_nViewWidth = (26 * m_nCellWidth) + m_nRibbonWidth;
m_nViewHeight = m_nCellHeight * 100;
m_nHScrollPos = m_nVScrollPos = 0;
return 0;
}
void CMainWindow::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFrameWnd::OnPaint()
dc.SetWindowOrg(m_nHScrollPos, m_nVScrollPos);
CPen pen(PS_SOLID, 0, RGB(192, 192, 192));
CPen *pOldPen = dc.SelectObject(&pen);
for (int i = 0; i < 99; i++)
{
int y = (i * m_nCellHeight) + m_nCellHeight;
dc.MoveTo(0, y);
dc.LineTo(m_nViewWidth, y);
}
for (int i = 0; i < 26; i++)
{
int x = (i * m_nCellWidth) + m_nRibbonWidth;
dc.MoveTo(x, 0);
dc.LineTo(x, m_nViewHeight);
}
dc.SelectObject(pOldPen);
CBrush brush;
brush.CreateStockObject(LTGRAY_BRUSH);
CRect rcTop(0, 0, m_nViewWidth, m_nCellHeight);
dc.FillRect(rcTop, &brush);
CRect rcLeft(0, 0, m_nRibbonWidth, m_nViewHeight);
dc.FillRect(rcLeft, &brush);
dc.MoveTo(0, m_nCellHeight);
dc.LineTo(m_nViewWidth, m_nCellHeight);
dc.MoveTo(m_nRibbonWidth, 0);
dc.LineTo(m_nRibbonWidth, m_nViewHeight);
dc.SetBkMode(TRANSPARENT);
for (int i = 0; i < 99; i++)
{
int y = (i * m_nCellHeight) + m_nCellHeight;
dc.MoveTo(0, y);
dc.LineTo(m_nRibbonWidth, y);
CString string;
string.Format(_T("%d"), i + 1);
CRect rect(0, y, m_nRibbonWidth, y + m_nCellHeight);
dc.DrawText(string, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.top++;
dc.Draw3dRect(rect, RGB(255, 255, 255), RGB(128, 128, 128));//3D效果
}
for (int j = 0; j < 26; j++)
{
int x = (j * m_nCellWidth) + m_nRibbonWidth;
dc.MoveTo(x, 0);
dc.LineTo(x, m_nCellHeight);
CString string;
string.Format(_T("%c"), j + 'A');
CRect rect(x, 0, x + m_nCellWidth, m_nCellHeight);
dc.DrawText(string, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.left++;
dc.Draw3dRect(rect, RGB(255, 255, 255), RGB(128, 128, 128));
}
}
void CMainWindow::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int nDelta = 0;
switch (nSBCode)
{
case SB_LINELEFT:
nDelta = -LINESIZE;
break;
case SB_LINERIGHT:
nDelta = LINESIZE;
break;
case SB_PAGELEFT:
nDelta = -m_nHPageSize;
break;
case SB_PAGERIGHT:
nDelta = m_nHPageSize;
break;
case SB_THUMBTRACK:
nDelta = (int)nPos - m_nHScrollPos;
break;
default:
break;
}
if (nDelta != 0)
{
m_nHScrollPos += nDelta;
SetScrollPos(SB_HORZ, m_nHScrollPos, TRUE);
ScrollWindow(-nDelta, 0);
}
CFrameWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMainWindow::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int nDelta = 0;
switch (nSBCode)
{
case SB_LINEDOWN :
nDelta = LINESIZE;
break;
case SB_LINEUP:
nDelta = -LINESIZE;
break;
case SB_THUMBTRACK:
nDelta = (int)nPos - m_nVScrollPos;
break;
case SB_PAGEUP:
nDelta = -m_nVPageSize;
break;
case SB_PAGEDOWN:
nDelta = m_nVPageSize;
break;
default:
break;
}
if (nDelta != 0)
{
m_nVScrollPos += nDelta;
SetScrollPos(SB_VERT, m_nVScrollPos, TRUE);
ScrollWindow(0, -nDelta);
}
CFrameWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CMainWindow::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
int nHScrollMax = 0;
m_nHPageSize = 0;
if (cx < m_nViewWidth)
{
m_nHPageSize = cx;
nHScrollMax = m_nViewWidth - 1;
}
SCROLLINFO si;
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nMin = 0;
si.nMax = nHScrollMax - 1;
si.nPos = m_nHScrollPos;
si.nPage = m_nHPageSize;
SetScrollInfo(SB_HORZ, &si, TRUE);
int nVScrollMax = 0;
m_nVPageSize = 0;
if (cy < m_nViewHeight)
{
nVScrollMax = m_nViewHeight - 1;
m_nVPageSize = cy;
}
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nMin = 0;
si.nMax = nVScrollMax;
si.nPos = m_nVScrollPos;
si.nPage = m_nVPageSize;
SetScrollInfo(SB_VERT, &si, TRUE);
}