关于滚动条我用以下语句创建的滚动条为什么看得见,却不能滑动?
在CMainFrame::OnCreate()
CRect r;
GetClientRect(&r);
CRect rt(0,0,r.Width(),15);
rt.OffsetRect(0,r.Height()-35);
m_ScrollBar.Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,
rt,
this,
AFX_IDW_SIZE_BOX);
m_ScrollBar.SetScrollRange(10,100,TRUE);***********************************************
在非CScrollView中怎样使用滚动条,比如在CView CListView中。
也就是说怎样设置固定视图区域。
比如(10000,10000)这样大的区域.
在CMainFrame::OnCreate()
CRect r;
GetClientRect(&r);
CRect rt(0,0,r.Width(),15);
rt.OffsetRect(0,r.Height()-35);
m_ScrollBar.Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,
rt,
this,
AFX_IDW_SIZE_BOX);
m_ScrollBar.SetScrollRange(10,100,TRUE);***********************************************
在非CScrollView中怎样使用滚动条,比如在CView CListView中。
也就是说怎样设置固定视图区域。
比如(10000,10000)这样大的区域.
{
CSize sizeTotal(2000,30000);
CSize sizePage(sizeTotal.cx/200,sizeTotal.cy/300);
CSize sizeLine(sizeTotal.cx/3000,sizeTotal.cy/3000);
SetScrollSizes(MM_TEXT,sizeTotal,sizePage,sizeLine);
GetParentFrame()->RecalcLayout();
ResizeParentToFit();//¶¯Ì¬ÏÔʾ¹ö¶¯Ìõ
}
如果你改变Frame的大小你还会发现,滚动条就在原地不动,
这是因为你只用Create()创建了一个滚动条但并没对它的“滚动”
做出任何的反应。所以你应该用它的成员控制和响应它的“滚动”。
具体的查看MSDN。上面是如何设置滚动页面的固定大小。
http://www.codeguru.com/controls/scrollbar_handling.shtml
处理所有卷动列滑鼠事件;
当使用者在卷动列内单击滑鼠时,提供一种「反相显示」的闪烁;
当使用者在卷动列内拖动卷动方块时,移动卷动方块;
为包含卷动列视窗的视窗讯息处理程式发送卷动列讯息.
以下是程式写作者应该完成的工作:
初始化卷动列的范围和位置;
处理视窗讯息处理程式的卷动列讯息;
更新卷动列内卷动方块的位置;
更改显示区域的内容以回应对卷动列的更改.“卷动”就是“滚动”。
#include "sysmets.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("SysMets2") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
} hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
{
static int cxChar, cxCaps, cyChar, cyClient, iVscrollPos ;
HDC hdc ;
int i, y ;
PAINTSTRUCT ps ;
TCHAR szBuffer[10] ;
TEXTMETRIC tm ;
switch (message)
{
case WM_CREATE:
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
cyChar = tm.tmHeight + tm.tmExternalLeading ; ReleaseDC (hwnd, hdc) ;
SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;
SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
return 0 ; case WM_SIZE:
cyClient = HIWORD (lParam) ;
return 0 ; case WM_VSCROLL:
switch (LOWORD (wParam))
{
case SB_LINEUP:
iVscrollPos -= 1 ;
break ;
case SB_LINEDOWN:
iVscrollPos += 1 ;
break ; case SB_PAGEUP:
iVscrollPos -= cyClient / cyChar ;
break ;
case SB_PAGEDOWN:
iVscrollPos += cyClient / cyChar ;
break ;
case SB_THUMBPOSITION:
iVscrollPos = HIWORD (wParam) ;
break ;
default :
break ;
} iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;
if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))
{
SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
InvalidateRect (hwnd, NULL, TRUE) ;
}
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
for (i = 0 ; i < NUMLINES ; i++)
{
y = cyChar * (i - iVscrollPos) ;
TextOut (hdc, 0, y,
sysmetrics[i].szLabel,
lstrlen (sysmetrics[i].szLabel)) ;
TextOut (hdc, 22 * cxCaps, y,
sysmetrics[i].szDesc,
lstrlen (sysmetrics[i].szDesc)) ;
SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
TextOut (hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].iIndex))) ;
SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
}
EndPaint (hwnd, &ps) ;
return 0 ; case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
CSize sz=GetWindowExt();
GetClientRect(&rt);但结果sz=(0,0);
rt=(0,0,0,0);我在CMyListView::OnCreate
和CMainFrame::OnCreate
都试过,
但结果都是这样。//************* 我的根本问题是 ***************
有什么好方法解决吗?在非CScrollView中怎样使用滚动条,比如在CView CListView中。
也就是说怎样设置固定视图区域。
比如(10000,10000)这样大的区域.
我设置了,没用。CListView是有滚动条的,就是它的性能和资源管理器一样。
图标拖回来,滚动条就没有了。是不是该修改OnHScroll和OnVScroll但我又不知道怎样修改。我试了很多方法都不成功,
控制滚动条则在OnHScroll和OnVScroll.