|
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에서도 같은 동작이 되도록 해보셨는지요..
: 해보셨으면 하신 방법을 좀 알수 있을까요..
:
: 간단한거 같은데.. 잘 안되네요.. 가르침 부탁 드립니다..
|