C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[44333] Re:listView 클릭시 특정 필드 item항목 얻기
박지훈.임프 [cbuilder] 3855 읽음    2006-03-30 22:17
대략 다음과 같이 하면 될 겁니다.

int GetCurrentColumn(TListView *AListView)
{
    TPoint pt;
    GetCursorPos(&pt);
    pt = AListView->ScreenToClient(pt);
    int TotalWidth = GetScrollPos(AListView->Handle, SB_VERT);
    for(int i=0; i<AListView->Width; i++)
    {
        TotalWidth += AListView->Columns->Items[i]->Width;
        if(pt.x < TotalWidth)
            return i;
    }
    return -1;
}

void __fastcall TForm1::ListView1Click(TObject *Sender)
{
    Caption = GetCurrentColumn(ListView1);
}

원리는 간단합니다.
GetCursorPos() 함수는 스크린 전체에서 마우스 커서의 현재 위치를 알아내는 Win32 API 함수입니다.
이 좌표를 리스트뷰 내에서의 좌표로 바꾸기 위해 TControl::ScreenToClient() 멤버함수를 호출했습니다.
그리고 그 다음은 각 컬럼의 Width들을 더해가면서 현재 x 좌표값이 그 범위 안에 있는지를 검사합니다.
검사 시작값이 0이 아닌 GetScrollPos()로부터 리턴된 값으로 되어 있는데, 이것은 리스트뷰가 x축 방향으로 스크롤되었을
경우를 대비해서입니다. 만약 0에서 시작한다면 스크롤되엇을 경우 엉뚱한 값이 나올 수 있겠죠?

그리고.. OnSelectItem 이벤트가 아닌 OnClick 이벤트를 썼다는 것도 주의해서 보십시오.
만약 OnSelectItem 이벤트를 쓴다면, 첫번째 아이템이 선택된 상태에서 똑같은 첫 아이템의 다른 서브 아이템을 클릭했을
때에는 이벤트가 발생하지 않습니다. 따라서 OnSelectItem 이벤트를 쓰면 서브 아이템을 클릭했을 때 이벤트가 발생하지
않는 경우도 생기겠지요?

리스트뷰에서 마우스 커서 위치의 컬럼을 알아낼 수 있는 쉬운 방법이 없는 것은, 리스트뷰의 서브아이템은 단지 보여주는
목적이기 때문입니다. 제 생각에 서브아이템의 위치 정도까지 필요하다면, 리스트뷰보다는 스트링그리드 등의 그리드
컴포넌트가 더 적절할 거 같네요.

그럼...


빌더초보 님이 쓰신 글 :
: 안녕하세요. 이곳 게시판에 어느분이 질문을 주셨던 것 인데요.
: 아직 해결이 되지 않아서 또 여쭈어 봅니다.
:
: TListView 목록내용은 다음과 같습니다.
:
: TListView
: ------------------------------------
: 순번 과목  1월  2월  3월 ........       컬럼항목
: ____________________________________
: 1    수학  100  200  300 ........      Item항목
: 2    영어  100  87   65  ........
:
:
: 이렇게 되어있는데.. 대략 12개월까지  정보를 가지고 있습니다..
: 여기서 사용자가 수학 항목의 2월점수를 가지고 오려고 하면...
: 마우스로  수학항목의 2월의 아이템(200) 을 클릭하면...
: 200만을 가져 오려고 합니다.
: 예)
: void __fastcall TForm1::ListView1SelectItem(TObject *Sender,
:       TListItem *Item, bool Selected)
: {
:           int Row = Item->Index  ;  
:          int Col  = ?
:          Edit1->Text = Item->SubItems->Strings[ Col ];
: }

+ -

관련 글 리스트
44285 listView 클릭시 특정 필드 item항목 얻기 빌더초보 1689 2006/03/27
44333     Re:listView 클릭시 특정 필드 item항목 얻기 박지훈.임프 3855 2006/03/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.