|
초록물고기 님이 쓰신 글 :
: 안녕하세요..
: 리스트 뷰에 (report 스타일) 많은 데이타를 첨가해서 (약 1000 개이상 )
: 스크롤 바가 생겼습니다.
:
:
: 그런데...특정버튼이 눌리면 , 리스트 뷰의 캡션들을 검사하여,
: 원하는 row 가 있는 곳 까지 scroll up 시키거나, scroll down 시키려고 합니다.
: (예를 500번째에 원하는 row 가 있었다면,, scroll bar를 대충 500번째 근처에 갔다 놓으려고 합니다)
:
: 즉 원하는 데이타가 화면의 llistview 안에 들어오도록 scroll bar를 자동으로 움직이려 하는데...
: 이런것이 가능하나요?
: 도움말에서 scroll 함수가 있어서, scroll (x, y )에서 아무런 좌표를 지정해 보니 ,스크롤 바가 움직입니다.. 문제는 y 좌표를 알아내는 것이 문제인데... 리스스트 뷰에서마우스가 마우스가 움직였을때는, GetItemAt (X,Y )에서 y좌표를 구할 수가 있습니다.
:
: 그렇지 않고, 리스트뷰의 특정한 row의 y좌표를 구해서,,, scroll을 시키고 싶은데...
: y 좌표를 어떻게 알아낼수 있는지요?
:
:
:
: 수고 하세요.
:
:
전 이런 식으로 사용했네요.
nNo는 화면상에 보시되어야할 특정 Item의 Index입니다.
현재 스크롤 한다는 걸 보여주기위해, 리스트뷰의 한 페이지 단위로 여러번 스크롤하는 방식으로 했어요.
전 그냥 while 내부에 Application->ProcessMessages();를 사용했는데
그보단 스레드나 타이머 쓰시는게 좋을듯;;
Index만 알면 ListView_GetItemRect매크로로 y값을 구할 수 있으니 이용하시면 될거같습니다.
void TForm1::ScrollTextList()
{
RECT rc;
ListView_GetItemRect(ListView1->Handle, 0, &rc, LVIR_BOUNDS);
int Dist = rc.bottom - rc.top;
while (nNo < ListView1->TopItem->Index)
{
ListView_Scroll(ListView1->Handle, 0, -Dist * ListView1->VisibleRowCount);
Application->ProcessMessages();
}
while (nNo > ListView1->TopItem->Index + ListView1->VisibleRowCount)
{
ListView_Scroll(ListView1->Handle, 0, Dist * ListView1->VisibleRowCount);
Application->ProcessMessages();
}
}
|