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
[76340] MDI 프로그램에서 Panel 을 자식창 아래에 두거나, 부모창 Client 영역의 마우스 좌표를 알고 싶습니다.
하루종일 [kissjung] 737 읽음    2022-10-09 01:11
첨부 그림은 제가 작성중인 프로그램의 일부 입니다.

그림을 그릴 필요가 있어서, Direct2D를 Panel 컨트롤에 그립니다.
이 Panel 위로 자식창을 위치 하고 싶습니다.

여기 포럼의 팁을 참고 하였는데, 발생하는 오류는 인터넷 검색을 하여, 컴파일은 되었는데 에러로 실행이 안되네요.
어려운 API도 사용하기도 하고 아는 지식 없이 수정해서 에러가 발생한듯 합니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=746

제가 수정한 코드는 다음과 같습니다.

// http://www.acrosoft.pe.kr/board/delphi_tips/19592
// http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=746

::TWndMethod OrgPanelProc; // http://www.delmadang.com/community/bbs_comment.asp?indx=418062&bbsno=17
TFarProc NewClient, OldClient;

void __fastcall TFormMain::FormCreate(TObject* Sender)
{
    CanvasPanel->Parent = NULL;
    CanvasPanel->ParentWindow = this->ClientHandle;
    CanvasPanel->DoubleBuffered = true;
    OrgPanelProc = CanvasPanel->WindowProc;
    CanvasPanel->WindowProc = PanelMsgProc;
    //--------------------------------
    NewClient = MakeObjectInstance(MDIClientProc);
    OldClient = (void*)(GetWindowLong(ClientHandle, GWL_WNDPROC)); //출처: https://nexturbo.tistory.com/179 [새우의 세상사:티스토리]
    SetWindowLong(ClientHandle, GWL_WNDPROC, (LONG)(NewClient));
    }
//---------------------------------------------------------------------------
void __fastcall TFormMain::MDIClientProc(TMessage &Msg)
{
   
    Msg.Result = ::CallWindowProc((WNDPROC)OldClient, ClientHandle, Msg.Msg, Msg.WParam, Msg.LParam);

    if (Msg.Msg == WM_SIZE) {
        TRect rc;
        if (GetWindowRect(ClientHandle, &rc)) {
            CanvasPanel->Left = (rc.Width() - CanvasPanel->Width) / 2;
            CanvasPanel->Top = (rc.Height() - CanvasPanel->Height) / 2;
        }
    }
   
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::PanelMsgProc(TMessage &Msg)
{

    if (Msg.Msg == WM_CHILDACTIVATE)
        CanvasPanel->SendToBack();
    OrgPanelProc(Msg);
   
}

// ---------------------------------------------------------------------------
void __fastcall TFormMain::FormClose(TObject* Sender, TCloseAction &Action)
{
    FreeLibrary(HLib);

   
    // https://nexturbo.tistory.com/179 [새우의 세상사:티스토리]
    SetWindowLong(ClientHandle, GWL_WNDPROC, (LONG)OldClient);
    FreeObjectInstance(NewClient);
   

    Action = caFree;
}
//---------------------------------------------------------------------------


이 방법이 안되면, 다른 방법을 생각 중인데..
Direct2D를 초기화 할때
FD2DCanvas = new TDirect2DCanvas(CanvasPanel->Handle); // if DirectX is not supported 
CanvasPanel->Handle 를 clientHandle 로 변경하면 부모창의 Client  영역에 그림을 그릴수 있습니다.
그런데, 그림을 Zoom, Move 하기 위해서는 마우스가 부모폼의 client 영역에 위히 하는지를 파악 해야 합니다.

코드는 아래 처럼 작성을 했는데..마우스가 client 영역에 위치 하는지 여부와 client 영역에서 좌표를 어떻게 받아야 하는지 모르겠습니다.
    TControl* pCtrl = FindDragTarget(MousePos, false);

    if (pCtrl == CanvasPanel) { // 마우스가 CanvasPanel 위에 있으면
        TPoint CursorPt; // , ScreenPt, ClientPt;

        GetCursorPos(&CursorPt); // 모니터기준 휠을 클릭한 지점의 좌표
        TpZoomOrg = CanvasPanel->ScreenToClient(CursorPt); // Screen 좌표를 ClientPt(CanvasPanal) 좌표로 변환
}

Panel을 자식창 아래에 위치 하는 방법 또는
부모창 Client 영역의 마우스가 위치하는 여부 및  마우스 좌표를 알수 있는 방법이 있나요??

+ -

관련 글 리스트
76340 MDI 프로그램에서 Panel 을 자식창 아래에 두거나, 부모창 Client 영역의 마우스 좌표를 알고 싶습니다. 하루종일 737 2022/10/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.