Original Post
I am using C++ with the Win32 API. I am having a bit of a problem with scroll bars. When the application boots, there should not be any scroll bars. When a bitmap is loaded, and the bitmap is larger than the client area of the screen, then I need to include scroll bars. When I load a bitmap that is larger than the client area, the scroll bars are not showing as they are supposed to. Here is the code: Thank you for your time, Dev578 [Edited by - dev578 on October 11, 2005 4:46:59 PM]
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static int cur_xpos;
static int cur_ypos;
static SCROLLINFO HScrollInfo;
static SCROLLINFO VScrollInfo;
switch(iMsg)
{
case WM_CREATE:
cur_xpos = 0;
HScrollInfo.cbSize = sizeof(SCROLLINFO);
HScrollInfo.nMin = 0;
HScrollInfo.nMax = 1000;
HScrollInfo.nPage = 100;
HScrollInfo.fMask = SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL;
SetScrollInfo(hWnd,SB_HORZ,&HScrollInfo,false);
cur_ypos = 0;
VScrollInfo.cbSize = sizeof(SCROLLINFO);
VScrollInfo.nMin = 0;
VScrollInfo.nMax = 1000;
VScrollInfo.nPage = 100;
VScrollInfo.fMask = SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL;
SetScrollInfo(hWnd,SB_VERT,&VScrollInfo,false);
hDC = GetDC(hWnd);
hpen = CreatePen(PS_SOLID,2,RGB(0,0,255));
old_pen = (HPEN)SelectObject(hDC,hpen);
hbrush = (HBRUSH)GetStockObject(NULL_BRUSH);
old_brush = (HBRUSH)SelectObject(hDC,hbrush);
return 0;
case WM_HSCROLL:
switch(LOWORD(wParam))
{
case SB_LINELEFT:
cur_xpos = cur_xpos - 1;
break;
case SB_LINERIGHT:
cur_xpos = cur_xpos + 1;
break;
case SB_THUMBPOSITION:
cur_xpos = HIWORD(wParam);
break;
default:
break;
}
HScrollInfo.cbSize = sizeof(SCROLLINFO);
HScrollInfo.fMask = SIF_POS | SIF_RANGE;
GetScrollInfo(hWnd, SB_HORZ, &HScrollInfo);
if(cur_xpos != HScrollInfo.nPos)
{
if(cur_xpos > HScrollInfo.nMax)
cur_xpos = HScrollInfo.nMax;
else if(cur_xpos < HScrollInfo.nMin)
cur_xpos = HScrollInfo.nMin;
HScrollInfo.nPos = cur_xpos;
SetScrollInfo(hWnd, SB_HORZ, &HScrollInfo, true);
InvalidateRect(hWnd,NULL,TRUE);
}
return 0;
case WM_VSCROLL:
switch(LOWORD(wParam))
{
case SB_LINELEFT:
cur_ypos = cur_ypos - 1;
break;
case SB_LINERIGHT:
cur_ypos = cur_ypos + 1;
break;
case SB_THUMBPOSITION:
cur_ypos = HIWORD(wParam);
break;
default:
break;
}
VScrollInfo.cbSize = sizeof(SCROLLINFO);
VScrollInfo.fMask = SIF_POS | SIF_RANGE;
GetScrollInfo(hWnd, SB_VERT, &VScrollInfo);
if(cur_ypos != VScrollInfo.nPos)
{
if(cur_ypos > VScrollInfo.nMax)
cur_ypos = VScrollInfo.nMax;
else if(cur_ypos < VScrollInfo.nMin)
cur_ypos = VScrollInfo.nMin;
VScrollInfo.nPos = cur_ypos;
SetScrollInfo(hWnd, SB_VERT, &VScrollInfo, true);
InvalidateRect(hWnd,NULL,TRUE);
}
return 0;
case SOMECASE:
//load a bitmap
//if the bitmap has a larger width than the cleint area
if (LargerWidth == true)
{
HScrollInfo.fMask = SIF_PAGE | SIF_RANGE; // not with SIF_DISABLENOSCROLL
SetScrollInfo(hWnd,SB_HORZ,&HScrollInfo,true);
InvalidateRect(hWnd,NULL,true); //?
UpdateWindow(hWnd); //?
}
//and same if it has a larger height, just with VScrollInfo
}
}