TListView의 ShowHint=false로 설정해 둬도
ListView의 SubItem에 마무스가 가면 Column의 넓이가 string보다 좁은경우 tooltip이 뜹니다.
VCL의 기본 Hint는 THintWindow 라는 클래스인데
ListView의 SubItem에 뜨는 힌트는 tooltips_class32 라는 클래스더군요
TListView의 ShowHint=true로 해둔경우
힌트가 동시에 두개 중복해서 뜨기도 하고 보기에 별로 좋지 않더군요
이 문제를 별로 신경안 썼었는데
오늘 한델의 Q&A에 올라온 질문을 보고 찾아보게 되었습니다.
ListView의 SubItems의 Default tooltip(힌트) 안뜨게 하는 방법은?
ListVeiw의 Extended ListView Style을 재설정하면 됩니다.
관련 메세지
LVM_GETEXTENDEDLISTVIEWSTYLE
LVM_SETEXTENDEDLISTVIEWSTYLE
VCL함수
ListView_GetExtendedListViewStyle
ListView_SetExtendedListViewStyle
Style은?
LVS_EX_INFOTIP 0x400
함수
void __fastcall SetListViewSubItemToolTip(TListView *ListView, bool bInfoTip)
{
int exStyle;
exStyle=ListView_GetExtendedListViewStyle(ListView->Handle);
//exStyle = SendMessage(ListView->Handle, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
if( bInfoTip) exStyle=exStyle | LVS_EX_INFOTIP;
else exStyle=exStyle &(~LVS_EX_INFOTIP);
ListView_SetExtendedListViewStyle(ListView->Handle,exStyle);
//SendMessage(ListView->Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, exStyle);
}
//사용예
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SetListViewSubItemToolTip(ListVie1,true);
}
procedure SetListViewSubItemToolTip(ListView : TListView; bInfoTip: boolean);
var
exStyle: Cardinal;
begin
exStyle:=ListView_GetExtendedListViewStyle(ListView.Handle);
if bInfoTip then
exStyle:=exStyle or LVS_EX_INFOTIP
else
exStyle:=exStyle and (not LVS_EX_INFOTIP);
ListView_SetExtendedListViewStyle(ListView.Handle,exStyle);
end;
아래는 TCustomListView의 ResetExStyles 메소드 코드입니다.
다른 것은 propery가 제공되는데
subitemimages와 infotip은 default로 들어가네요
procedure TCustomListView.ResetExStyles;
var
Styles: DWORD;
TempImages: TCustomImageList;
begin
if HandleAllocated then
begin
TempImages := nil;
if StateImages <> nil then
begin
TempImages := StateImages;
StateImages := nil;
end;
Styles := LVS_EX_SUBITEMIMAGES or LVS_EX_INFOTIP; //디폴트로 infotip이 설정됨
if FCheckboxes then Styles := LVS_EX_CHECKBOXES;
if FGridLines then Styles := Styles or LVS_EX_GRIDLINES;
if FHotTrack then Styles := Styles or LVS_EX_TRACKSELECT;
if FRowSelect then Styles := Styles or LVS_EX_FULLROWSELECT;
if FFlatScrollBars then Styles := Styles or LVS_EX_FLATSB;
if FFullDrag then Styles := Styles or LVS_EX_HEADERDRAGDROP;
if FShowWorkAreas then Styles := Styles or LVS_EX_MULTIWORKAREAS;
if htHandPoint in FHotTrackStyles then
Styles := Styles or LVS_EX_ONECLICKACTIVATE
else if FHotTrackStyles * [htUnderlineHot, htUnderlineCold] <> [] then
Styles := Styles or LVS_EX_TWOCLICKACTIVATE;
if htUnderlineHot in FHotTrackStyles then
Styles := Styles or LVS_EX_UNDERLINEHOT;
if htUnderlineCold in FHotTrackStyles then
Styles := Styles or LVS_EX_UNDERLINECOLD;
ListView_SetExtendedListViewStyle(Handle, Styles);
if TempImages <> nil then
StateImages := TempImages;
end;
end;
한가지 주의할점은
Listview의 CheckBox 속성이나 RowSelect 속성등이 변경되면
ResetExStyles 이 호출되게 되어있는데
다른 ExtendStyle의 속성을 변경후에 SetListViewSubItemToolTip를 한번더 호출해줘야
tooltip 속성이 유지될것 같습니다.
그럼...