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
[46494] Re:ListBox Sync 스크롤에 대해 알려주세요..
장성호 [nasilso] 1846 읽음    2006-09-09 21:52
sub-classing으로 합니다.

@서브클래싱이란?
ListBox든 Button이든 Form이든 Handle이 있는 컨트롤들은
메세지를 받아서 처리하는 WindowProc가 모두 있습니다.
원래 메세지를 처리하는 함수대신 user가 만든 함수로 메세지를 처리하는것을 서브클래싱이라합니다.




TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

//ListBox1과 ListBox2를 동기화
typedef void __fastcall (__closure *TWNDPROC)(TMessage &msg);
TWNDPROC OriginalProc1,OriginalProc2;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    for(int i=0;i<20;i++)
    {
        ListBox1->Items->Add("리스트 박스에...."+IntToStr(i));
        ListBox2->Items->Add("리스트 박스에...."+IntToStr(i));

    }
    OriginalProc1=ListBox1->WindowProc;        //ListBox1의 WindowProc 함수포인터를  따로 저장
    ListBox1->WindowProc=ListBoxMsgProc1;  //ListBox1에 메세지를 처리하는 다른 함수를 설정
    OriginalProc2=ListBox2->WindowProc;       //ListBox2의 WindowProc 함수포인터를  따로 저장
    ListBox2->WindowProc=ListBoxMsgProc2; //ListBox2에 메세지를 처리하는 다른 함수를 설정

}

void __fastcall TForm1::ListBoxMsgProc1(TMessage &msg)
{
    OriginalProc1(msg);  //ListBox1로 오는 메세지를 원래 함수로 처리

    //필요한 함수를 ListBox2의 WindowProc로 처리
    if(msg.Msg>=WM_MOUSEFIRST && msg.Msg<=WM_MOUSELAST)
    {
        OriginalProc2(msg);
    }
    else if(msg.Msg==WM_HSCROLL || msg.Msg == WM_VSCROLL)
    {
        OriginalProc2(msg);
    }
    else if(msg.Msg==WM_KEYDOWN)
    {
        OriginalProc2(msg);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBoxMsgProc2(TMessage &msg)
{
    OriginalProc2(msg);  //ListBox1로 오는 메세지를 원래 함수로 처리

    //필요한 함수를 ListBox1의 WindowProc로 처리
    if(msg.Msg>=WM_MOUSEFIRST && msg.Msg<=WM_MOUSELAST)
    {
        OriginalProc1(msg);
    }
    else if(msg.Msg==WM_HSCROLL || msg.Msg == WM_VSCROLL)
    {
        OriginalProc1(msg);
    }
    else if(msg.Msg==WM_KEYDOWN)
    {
        OriginalProc1(msg);
    }
}

//---------------------------------------------------------------------------
//winuser.h에 선언된 메세지들을 중 몇가지 입니다.
//---------------------------------------------------------------------------
/*
#define WM_MOUSEFIRST                   0x0200
#define WM_MOUSEMOVE                    0x0200
#define WM_LBUTTONDOWN                  0x0201
#define WM_LBUTTONUP                    0x0202
#define WM_LBUTTONDBLCLK                0x0203
#define WM_RBUTTONDOWN                  0x0204
#define WM_RBUTTONUP                    0x0205
#define WM_RBUTTONDBLCLK                0x0206
#define WM_MBUTTONDOWN                  0x0207
#define WM_MBUTTONUP                    0x0208
#define WM_MBUTTONDBLCLK                0x0209
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL                   0x020A
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_XBUTTONDOWN                  0x020B
#define WM_XBUTTONUP                    0x020C
#define WM_XBUTTONDBLCLK                0x020D
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_MOUSELAST                    0x020D
#elif (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSELAST                    0x020A
#else
#define WM_MOUSELAST

#define VK_PRIOR          0x21
#define VK_NEXT           0x22
#define VK_END            0x23
#define VK_HOME           0x24
#define VK_LEFT           0x25
#define VK_UP             0x26
#define VK_RIGHT          0x27
#define VK_DOWN           0x28
#define VK_SELECT         0x29
#define VK_PRINT          0x2A
#define VK_EXECUTE        0x2B
#define VK_SNAPSHOT       0x2C
#define VK_INSERT         0x2D
#define VK_DELETE         0x2E
#define VK_HELP           0x2F

#define WM_KEYFIRST                     0x0100
#define WM_KEYDOWN                      0x0100
#define WM_KEYUP                        0x0101
#define WM_CHAR                         0x0102
#define WM_DEADCHAR                     0x0103

*/

맑은햇살 님이 쓰신 글 :
: 안녕하세요...
:
: 궁금한점이 하나 생겨 문의 드립니다..(검색을 해봤는데 제 내공의 부족인지..잘 못 찾겠네요..)
: 빌더에서 두개의 리스트 박스를 만들고 동기화 시킬경우를 해보신 경우가 있으신가요.
:
: 즉 ListBox1에서 상하/좌우 스크롤을 하면 ListBox2에서도 같은 동작이 되도록 해보셨는지요..
: 해보셨으면 하신 방법을 좀 알수 있을까요..
:
: 간단한거 같은데.. 잘 안되네요..  가르침 부탁 드립니다..

+ -

관련 글 리스트
46489 ListBox Sync 스크롤에 대해 알려주세요.. 맑은햇살 1019 2006/09/09
46494     Re:ListBox Sync 스크롤에 대해 알려주세요.. 장성호 1846 2006/09/09
46509         알려주셔서 감사합니다.. 맑은햇살 1231 2006/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.