T
Das soll eine Anleitung zum scollen sein, das Original war in CodeProject.com drin. Es sind ein paar Jahre vergangen und ich finde es nicht mehr. Ich hoffe es stört niemand, ansonsten bitte den Beitrag löschen.
-------....dlg.cpp--------
// das kommt gleich den headern
////////////////////////////// neu scollen
#define HORZ_PTS 8 //neu
#define VERT_PTS 4 //neu
int m_bInitialized = TRUE;
int m_Grip;
///////////////////////////// neu ende
// das muss zum Inizalisieren genommen werden
BOOL CPaintaDlg::OnInitDialog()
{
//neu ab hier.............
m_nHscrollPos = 0;
m_nVscrollPos = 0;
GetClientRect(&m_ClientRect);
SetWindowPos(NULL ,180,40,200,250,SWP_NOREPOSITION);
//bis hier....
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
return TRUE;
}
//Das so soll eure Message MAp aussehen:
BEGIN_MESSAGE_MAP(CPaintaDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON() //neu
ON_WM_VSCROLL() //neu
ON_WM_HSCROLL() //neu
ON_WM_SIZE() //neu
END_MESSAGE_MAP()
Jetzt kommen die Funktionen zum scollen:
void CPaintaDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nInc;
switch (nSBCode)
{
case SB_TOP: nInc = -m_nVscrollPos; break;
case SB_BOTTOM: nInc = m_nVscrollMax-m_nVscrollPos; break;
case SB_LINEUP: nInc = -1; break;
case SB_LINEDOWN: nInc = 1; break;
case SB_PAGEUP: nInc = min(-1, -m_nVertInc); break;
case SB_PAGEDOWN: nInc = max(1, m_nVertInc); break;
case SB_THUMBTRACK: nInc = nPos - m_nVscrollPos; break;
default: nInc = 0;
}
nInc = max(-m_nVscrollPos, min(nInc, m_nVscrollMax - m_nVscrollPos));
m_nVscrollPos += nInc;
int iMove = -4 * nInc;
ScrollWindow(0, iMove, NULL, NULL);
SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CPaintaDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// Handle horizontal scrollbar messages
// These can be tweaked to better fit the implementation
int nInc;
switch (nSBCode)
{
case SB_TOP: nInc = -m_nHscrollPos; break;
case SB_BOTTOM: nInc = m_nHscrollMax-m_nHscrollPos; break;
case SB_LINEUP: nInc = -1; break;
case SB_LINEDOWN: nInc = 1; break;
case SB_PAGEUP: nInc = min(-1, -m_nHorzInc); break;
case SB_PAGEDOWN: nInc = max(1, m_nHorzInc); break;
case SB_THUMBTRACK: nInc = nPos - m_nHscrollPos; break;
default: nInc = 0;
}
nInc = max(-m_nHscrollPos, min(nInc, m_nHscrollMax - m_nHscrollPos));
if (nInc)
{
m_nHscrollPos += nInc;
int iMove = -4 * nInc;
ScrollWindow(iMove, 0, NULL, NULL);
SetScrollPos(SB_HORZ, m_nHscrollPos, TRUE);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CPaintaDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_bInitialized)
{
ScrollWindow(m_nHscrollPos*HORZ_PTS, 0, NULL, NULL);
ScrollWindow(0, m_nVscrollPos*VERT_PTS, NULL, NULL);
m_nHscrollPos = 0;
m_nVscrollPos = 0;
SetScrollPos(SB_HORZ, m_nHscrollPos, TRUE);
SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
CRect tempRect;
GetClientRect(&tempRect);
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
BOOL bMaximized = (wp.showCmd == SW_MAXIMIZE);
// Calculate how many scrolling increments for the client area
m_nHorzInc = (m_ClientRect.Width() - tempRect.Width())/HORZ_PTS;
m_nVertInc = (m_ClientRect.Height() - tempRect.Height())/VERT_PTS;
// Do not show the sizing gripper
// if ((m_nHorzInc > 0) || (m_nVertInc > 0 ) || bMaximized)
// m_Grip.ShowWindow(SW_HIDE);
//else
// m_Grip.ShowWindow(SW_SHOW);
// Set the vertical and horizontal scrolling info
m_nHscrollMax = max(0, m_nHorzInc);
m_nHscrollPos = min (m_nHscrollPos, m_nHscrollMax);
SetScrollRange(SB_HORZ, 0, m_nHscrollMax, FALSE);
SetScrollPos(SB_HORZ, m_nHscrollPos, TRUE);
m_nVscrollMax = max(0, m_nVertInc);
m_nVscrollPos = min(m_nVscrollPos, m_nVscrollMax);
SetScrollRange(SB_VERT, 0, m_nVscrollMax, FALSE);
SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
// Setup the gripper
if (!bMaximized)
{
CWnd *resizeWnd = GetDlgItem(AFX_IDW_SIZE_BOX);
if (resizeWnd)
{
CRect rect, rect2;
resizeWnd->GetWindowRect(&rect);
GetClientRect(rect2);
rect2.left = rect2.right - rect.Width();
rect2.top = rect2.bottom - rect.Height();
resizeWnd->MoveWindow(&rect2);
}
}
}
//---------...dlg.h-------------------
// das kommt in ...
public:
afx_msg void OnPaint();
HICON m_hIcon;
virtual BOOL OnInitDialog();
//neu://///////
int m_nHorzInc, m_nVertInc,
m_nVscrollMax, m_nHscrollMax,
m_nVscrollPos, m_nHscrollPos;
CRect m_ClientRect;
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnSize(UINT nType, int cx, int cy);
//neu ende
[cpp]