|
대략 다음과 같이 하면 될 겁니다.
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 ];
: }
|