MFC学习笔记(三)

                                                                                                                  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);
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值