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
[46509] 알려주셔서 감사합니다..
맑은햇살 [devkyy] 1230 읽음    2006-09-11 20:08
도움주셔서 너무나 감사합니다..

간단히 되는걸 너무 고민했네요..

즐거운 하루 되십시요..

장성호 님이 쓰신 글 :
: 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 스크롤에 대해 알려주세요.. 맑은햇살 1018 2006/09/09
46494     Re:ListBox Sync 스크롤에 대해 알려주세요.. 장성호 1846 2006/09/09
46509         알려주셔서 감사합니다.. 맑은햇살 1230 2006/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.