MFC学习笔记(三)
最近被ScrollWindow()折腾得够悲剧的,一直有个问题解决不了,就是出现有重影。。。
#define LINESIZE 5
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow ();
//public:
// int MoveSize,OldPlace;
protected:
int ViewScrollWidth;
int ViewScrollHight;
int ScrollPos;
int ScrollPage;
//int danweix;
protected:
afx_msg void OnPaint ();
afx_msg void OnSize(UINT nType,int cx ,int cy);
afx_msg void OnHScroll(UINT nCode,UINT nPos,CScrollBar * pScrollBar);
//afx_msg void OnCreate (LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP ()
};
#include <afxwin.h>
#include "Ruler.h"
CMyApp myApp;
/
// CMyApp member functions
BOOL CMyApp::InitInstance ()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}
/
// CMainWindow message map and member functions
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
ON_WM_PAINT ()
ON_WM_SIZE()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_CREATE()
END_MESSAGE_MAP ()
CMainWindow::CMainWindow ()
{
Create (NULL, _T ("Ruler"),WS_OVERLAPPEDWINDOW|WS_HSCROLL);
//很简单的创建了滚动条!!!,WS_VSCROLL是垂直的,WS_HSCROLL是水平的|WS_VSCROLL
}
void CMainWindow::OnSize(UINT nType,int cx ,int cy)
{
//SetScrollRange(SB_VERT,0,2300);//默认是0到100的
//SetScrollPos(SB_HORZ,0,TRUE);
//水平滚动条为SB_HORZ SB_VERT
ScrollPos=0;
ScrollPage=0;
ViewScrollWidth=2300;
ScrollPage=cx;
SCROLLINFO si;
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nMin = 0;
si.nMax = ViewScrollWidth;
si.nPos = ScrollPos;
si.nPage = ScrollPage;
SetScrollInfo (SB_HORZ, &si, TRUE);
}
//水平的滚动条
void CMainWindow::OnHScroll(UINT nCode,UINT nPos,CScrollBar * pScrollBar)
{
int MoveSize=0;//竟然浪费我时间的bug是你.....初值....
switch(nCode)
{
case SB_LINEUP:
MoveSize = -LINESIZE;
break;
case SB_LINEDOWN:
MoveSize = LINESIZE;
break;
case SB_PAGEUP:
MoveSize = -ScrollPage;
break;
case SB_PAGEDOWN:
MoveSize = ScrollPage;
break;
case SB_THUMBTRACK:
MoveSize = nPos - ScrollPos;
break;
default:
break;
}
ScrollPos+=MoveSize;
if(ScrollPos<0)
{
MoveSize=0;
}
else if(ScrollPos>2300-ScrollPage)
{
MoveSize=0;
}
if(MoveSize!=0)
{
SetScrollPos(SB_HORZ,ScrollPos,TRUE);
//ScrollWindow(-MoveSize,0);//会有重影,会解决的朋友告诉一声
Invalidate( TRUE ); //网上找不到重影的解决方法,悲剧的用强制重绘了!!!
}
}
/*
void CMainWindow::OnCreate (LPCREATESTRUCT lpCreateStruct)
{
CClientDC dc (this);
danweix=dc.GetDeviceCaps (LOGPIXELSX);
//danweiy=dc.GetDeviceCaps (LOGPIXELSY);
ViewScrollWidth=2300;
ScrollPos=0;
}
*/
void CMainWindow::OnPaint ()
{
CPaintDC dc (this);
//
// Initialize the device context.
//
//MessageBox("我重绘了!","ReDraw",MB_OK);
dc.SetMapMode (MM_LOENGLISH);//MM_TEXT
dc.SetWindowOrg (ScrollPos, 0);//这个很重要,更改原点的位置
dc.SetTextAlign (TA_CENTER | TA_BOTTOM);
dc.SetBkMode (TRANSPARENT);
//
// Draw the body of the ruler.
//
CBrush brush (RGB (255, 255, 0));
CBrush* pOldBrush = dc.SelectObject (&brush);
dc.Rectangle (100, -100, 2300, -200);
dc.SelectObject (pOldBrush);
//
// Draw the tick marks and labels.
//
int i=0;
for ( i=125; i<2300; i+=25) {
dc.MoveTo (i, -192);
dc.LineTo (i, -200);
}
for (i=150; i<2300; i+=50) {
dc.MoveTo (i, -184);
dc.LineTo (i, -200);
}
for (i=200; i<2300; i+=100) {
dc.MoveTo (i, -175);
dc.LineTo (i, -200);
CString string;
string.Format (_T ("%d"), (i / 100) - 1);
dc.TextOut (i, -175, string);
}
}