스크롤 윈도우 구현(미완)
/*스크롤 윈도우 구현(미완)
*/
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;
}