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
[49519] Re:Re:Re:TListView의 모든컬럼을 리사이즈를 못하게 하고 싶은데..어떻게 해야 하나요?
장성호 [nasilso] 1060 읽음    2007-06-02 15:51
아래오 같이하면 됩니다.
그러면 Column에서 Click이벤트는 뜨면서 Column이 resize되지는 않습니다.

그럼....


//=========================================================================
HWND SysHdr32Handle;
FARPROC SysHdrProc;
//---------------------------------------------------------------------------
LRESULT CALLBACK SysHeader32WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if( message == WM_SETCURSOR )
    {
        message=0;
        return 0;
    }
    else if(message == WM_LBUTTONDBLCLK)
    {
        message=0;
        return 0;
    }
    else if(message == WM_MOUSEMOVE)
    {
        message=0;
        return 0;
    }
    //else if(

    return CallWindowProc(SysHdrProc, hWnd, message, wParam, lParam);
}
//---------------------------------------------------------------------------
int SortByColumn = -1;
int SortOrder = 1;
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{

    ListView1->Column[0]->Width;

    SysHdr32Handle = GetWindow(ListView1->Handle , GW_CHILD);
    SysHdrProc=(FARPROC)SetWindowLong(SysHdr32Handle,GWL_WNDPROC,(long)SysHeader32WinProc);
}
//-------------------------------------------------------------------------
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
      TListItem *Item2, int Data, int &Compare)
{
      if(Data == 0)
    {
         if(Item1->Caption < Item2->Caption) Compare = -1;
         else if(Item1->Caption > Item2->Caption) Compare = 1;
         else Compare = 0;
    }
    else
    {
         if(Item1->SubItems->Strings[Data-1] < Item2->SubItems->Strings[Data-1]) Compare = -1;
         else if(Item1->SubItems->Strings[Data-1] > Item2->SubItems->Strings[Data-1]) Compare = 1;
         else Compare = 0;
    }
     Compare *= SortOrder;

}
//---------------------------------------------------------------------------


void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
      TListColumn *Column)
{
    if(SortByColumn == Column->Index) SortOrder *= -1;
    else SortOrder = 1;
       ListView1->CustomSort(NULL, Column->Index);
       SortByColumn = Column->Index;
}
//---------------------------------------------------------------------------
또아리 님이 쓰신 글 :
: 헤더 클릭이 되려면 콜백 함수에서 어떻게 조절해야 할까요?  WM_MOVE 메세지를 적절이 이용해보려고 궁리를 해보지만 잘 안되네요... 소트기능을 사용하려고 하다보니..
:
: 장성호 님이 쓰신 글 :
: : 음.....
: : 그냥 TListView를 sub-classing하면 될줄알았는데.. 안되두군요
: :
: : 원인은 TListView와   TListView의  ColumnHeader는 다른 Handle를 가지고 있는 Control이더군요
: : Spy로 TListView의  ColumnHeader를  보니 SysHeader32 라는 class더군요
: :
: : 결론적으로 이 SysHeader32를 찾아서 sub-classing하면 됩니다.
: :
: : [정리하면]
: : 1) TListView에서 SysHeader32를 찾아서 GetWindow함수로 Handle을 찾습니다.
: : 2)  SysHeader32의 WINPROC를 교체합니다.
: : 3)  sub-classing함수에서  WM_SETCURSOR 와 WM_LBUTTONDOWN 을 무시하도록 코딩합니다.
: :
: : =============예제소스===================================================
: :
: : HWND SysHdr32Handle;
: : FARPROC SysHdrProc;
: :
: : LRESULT CALLBACK SysHeader32WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
: :     if( message == WM_SETCURSOR || message == WM_LBUTTONDOWN)
: :     {
: :         message=0;
: :         return 0;
: :     }
: :
: :     return CallWindowProc(SysHdrProc, hWnd, message, wParam, lParam);
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::FormCreate(TObject *Sender)
: : {
: :     SysHdr32Handle = GetWindow(ListView1->Handle , GW_CHILD);
: :     SysHdrProc=(FARPROC)SetWindowLong(SysHdr32Handle,GWL_WNDPROC,(long)SysHeader32WinProc);
: : }
: :
: : ==============================================================================================
: :
: : 일단 위와같이 하면 TListView의 size는 고정됩니다.
: : 그러나 Column Click같은것이 안됩니다.
: : 그것은 허용하려면   callback함수에서 잘 조절하시면 될것 같습니다.
: :
: : 그럼 ....
: :
: :
: :
: : 또아리 님이 쓰신 글 :
: : : TListView의 모든 컬럼을 리사이즈 false시키고 싶은데 어떻게 해야 하나요..? 마우스로 드래그 했을때도 리사이즈가 안되도록 고정하고 싶은데 잘안되는군요..

+ -

관련 글 리스트
48572 TListView의 모든컬럼을 리사이즈를 못하게 하고 싶은데..어떻게 해야 하나요? 또아리 973 2007/03/26
48585     Re:TListView의 모든컬럼을 리사이즈를 못하게 하고 싶은데..어떻게 해야 하나요? 장성호 1024 2007/03/27
49517         Re:Re:TListView의 모든컬럼을 리사이즈를 못하게 하고 싶은데..어떻게 해야 하나요? 또아리 852 2007/06/02
49519             Re:Re:Re:TListView의 모든컬럼을 리사이즈를 못하게 하고 싶은데..어떻게 해야 하나요? 장성호 1060 2007/06/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.