카테고리 없음

스크롤 윈도우 구현(미완)

안녕1999 2018. 5. 19. 23:30

/*스크롤 윈도우 구현(미완)

*/

class ScrollWin

{

public:

ScrollWin();

virtual~ScrollWin();


RECT m_Rect;

POINT m_ScrollPos,m_ScrollSize;

SCROLLINFO m_VScrollInfo,m_HScrollInfo;

DWORD m_style;//WS_VSCROLL,WS_HSCROLL

void LPtoDP(POINT *pPoint);//논리좌표->윈도우스크롤좌표

void LPtoDP(POINT *pLPoint,POINT *pDPoint);

void LRtoDR(RECT *pRect);

void LRtoDR(RECT *pLRect,RECT *pDRect);

void DPtoLP(int *x,int *y);//윈도우스크롤좌표->논리좌표

void DPtoLP(long *x,long *y);

void DPtoLP(POINT *pPoint);

void DRtoLR(RECT *pRect);

void DRtoLR(RECT *pDRect,RECT *pLRect);

void ScrollTo(char *pxy);//20140319 "100,200"

void ScrollTo(int x,int y);

int ScrollDelta(int dx,int dy);//ret=bchanged

void SetScrollSizes(int w,int h);

void GetScrollSizes(int *w,int *h);

SIZE GetScrollSizes();

//BOOL EnableScrollBar(UINT wSBflags=SB_BOTH,UINT wArrows=ESB_ENABLE_BOTH);//ESB_DISABLE_BOTH

//BOOL GetScrollInfo(int fnBar,LPSCROLLINFO lpsi);

//BOOL SetScrollInfo(int fnBar,LPSCROLLINFO lpsi);//SB_HORZ,SB_VERT

BOOL ShowScrollBar(int wBar,BOOL bShow);//SB_BOTH,SB_HORZ,SB_VERT


inline void GetRect(RECT *r){*r=m_Rect;}

inline int GetWidth(){return m_Rect.right-m_Rect.left+1;}

inline int GetHeight(){return m_Rect.bottom-m_Rect.top+1;}

inline RECT *GetRect(){return &m_Rect;}

};


#define DEFAULT_SCROLLBAR_MAX 100

void ScrollInfo_init(SCROLLINFO *p)

{

p->cbSize=sizeof(SCROLLINFO);

p->fMask=0;

p->nMin=0;

p->nMax=DEFAULT_SCROLLBAR_MAX;

p->nPage=0;

p->nPos=0;

p->nTrackPos=0;

}

ScrollWin::ScrollWin()

{

m_Rect.left=0;//20160902

m_Rect.top=0;

m_Rect.right=0;

m_Rect.bottom=0;


m_ScrollPos.x=0;

m_ScrollPos.y=0;


m_style=0;


ScrollInfo_init(&m_VScrollInfo);

ScrollInfo_init(&m_HScrollInfo);


m_ScrollSize.x=DEFAULT_SCROLLBAR_MAX;

m_ScrollSize.y=DEFAULT_SCROLLBAR_MAX;

}

ScrollWin::~ScrollWin()

{

}

#include "Util_str.h"

void ScrollWin::ScrollTo(char *pxy)//20140319

{

int x,y;


get_int2_form_str_by_char(pxy,&x,',',&y);

ScrollTo(x,y);

}

void ScrollWin::ScrollTo(int x,int y)

{

m_ScrollPos.x=x;

m_ScrollPos.y=y;

//Window_ScrollTo(m_hWnd,x,y);

//Invalidate();

}

int ScrollWin::ScrollDelta(int dx,int dy)

{

int bchanged=0,a;

if(dx)

{

a=m_ScrollPos.x;

m_ScrollPos.x+=dx;

if(m_ScrollPos.x>m_Rect.right)

{

m_ScrollPos.x=m_Rect.right;

}

else if(m_ScrollPos.x<m_Rect.left)

{

m_ScrollPos.x=m_Rect.left;

}

if(a!=m_ScrollPos.x)

{

bchanged=1;

}

}

if(dy)

{

a=m_ScrollPos.y;

m_ScrollPos.y+=dy;

if(m_ScrollPos.y>m_Rect.bottom)

{

m_ScrollPos.y=m_Rect.bottom;

}

else if(m_ScrollPos.y<m_Rect.top)

{

m_ScrollPos.y=m_Rect.top;

}

if(a!=m_ScrollPos.y)

{

bchanged=1;

}

}

return bchanged;

}

void ScrollWin::SetScrollSizes(int w,int h)

{

if(w>0)

{

if(m_ScrollSize.x!=x)

{

m_ScrollSize.x=x;

m_HScrollInfo.nMax=m_HScrollInfo.nMin+w;


if(m_style&WS_HSCROLL)//스크롤바를 사용하고

{

if(w>GetWidth())//스크롤을 해야하면

{

//스크롤바 생성

}

else

{

//감추기

}

}

}

else

{

//변경사항 없음

}

}

if(h>0)

{

m_ScrollSize.y=y;

m_VScrollInfo.nMax=m_VScrollInfo.nMin+h;


if(m_style&WS_VSCROLL)

{

if(h>GetHeight())

{

//스크롤바 생성

}

else

{

//감추기

}

}

}



//스크롤 범위가 줄어든 경우, 스크롤 위치 이동

m_Rect.right=m_Rect.left+w;

m_Rect.bottom=m_Rect.top+h;

if(m_ScrollPos.x>m_Rect.right)

{

m_ScrollPos.x=m_Rect.right;

}

if(m_ScrollPos.y>m_Rect.bottom)

{

m_ScrollPos.y=m_Rect.bottom;

}

}

void ScrollWin::GetScrollSizes(int *w,int *h)

{

*w=m_ScrollSize.x;

*h=m_ScrollSize.y;

}

SIZE ScrollWin::GetScrollSizes()

{

return m_ScrollSize;

}

BOOL ScrollWin::ShowScrollBar(int wBar,BOOL bShow)

{

switch()

{

case SB_BOTH:

case SB_HORZ:

case SB_VERT:

}

}

//논리좌표->윈도우스크롤좌표

void ScrollWin::LPtoDP(POINT *pPoint)

{

pPoint->x-=m_ScrollPos.x;

pPoint->y-=m_ScrollPos.y;

}

void ScrollWin::LPtoDP(POINT *pLPoint,POINT *pDPoint)

{

pDPoint->x=pLPoint->x-m_ScrollPos.x;

pDPoint->y=pLPoint->y-m_ScrollPos.y;

}

//논리좌표->윈도우스크롤좌표

void ScrollWin::LRtoDR(RECT *pRect)

{

int a;


a=m_ScrollPos.x;

if(a)

{

pRect->left-=a;

pRect->right-=a;

}

a=m_ScrollPos.y;

if(a)

{

pRect->top-=a;

pRect->bottom-=a;

}

}

//논리좌표->윈도우스크롤좌표

void ScrollWin::LRtoDR(RECT *pLRect,RECT *pDRect)

{

int a;


a=m_ScrollPos.x;

if(a)

{

pDRect->left=pLRect->left-a;

pDRect->right=pLRect->right-a;

}

else

{

pDRect->left=pLRect->left;

pDRect->right=pLRect->right;

}

a=m_ScrollPos.y;

if(a)

{

pDRect->top=pLRect->top-a;

pDRect->bottom=pLRect->bottom-a;

}

else

{

pDRect->top=pLRect->top;

pDRect->bottom=pLRect->bottom;

}

}

//윈도우스크롤좌표->논리좌표

void ScrollWin::DPtoLP(int *x,int *y)

{

*x+=m_ScrollPos.x;

*y+=m_ScrollPos.y;

}

void ScrollWin::DPtoLP(long *x,long *y)

{

*x+=m_ScrollPos.x;

*y+=m_ScrollPos.y;

}

void ScrollWin::DPtoLP(POINT *pPoint)

{

DPtoLP(&(pPoint->x),&(pPoint->y));

}

void ScrollWin::DRtoLR(RECT *pRect)

{

int a;


a=m_ScrollPos.x;

if(a)

{

pRect->left+=a;

pRect->right+=a;

}

a=m_ScrollPos.y;

if(a)

{

pRect->top+=a;

pRect->bottom+=a;

}

}

void ScrollWin::DRtoLR(RECT *pDRect,RECT *pLRect)

{

int a;


a=m_ScrollPos.x;

pLRect->left=pDRect->left+a;

pLRect->right=pDRect->right+a;

a=m_ScrollPos.y;

pLRect->top=pDRect->top+a;

pLRect->bottom=pDRect->bottom+a;

}