|
도움주셔서 너무나 감사합니다..
간단히 되는걸 너무 고민했네요..
즐거운 하루 되십시요..
장성호 님이 쓰신 글 :
: 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에서도 같은 동작이 되도록 해보셨는지요..
: : 해보셨으면 하신 방법을 좀 알수 있을까요..
: :
: : 간단한거 같은데.. 잘 안되네요.. 가르침 부탁 드립니다..
|