C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 FAQ
C++Builder Programming FAQ
[20] [COMPONENT] TCppWebBrowser에서 엔터키 + 클립보드 복사하기
박지훈.임프 [cbuilder] 20616 읽음    2001-03-24 12:36
병아리 님이 쓰신 글 :
: 안녕하세요!!
: 여러차례질문이나왔는데
: 아직도 해답이없군요...
:
: 델파이코리아의 팁사이트 민성긴님이올리신 델파이소스가 있긴한데..
:
: 파스칼을모르니 아무리 변환시킬려구해봐두 에러나구....
:
: 빌더 TCppWebBrowser에서 엔터키 탭키 클립보드가 동작할수있도록 좀시간내서
:
: 소스점 공개해주심감사하겠습니다..
:
: 그럼 좋은날되세여.



임펠리테리입니다.

먼저, 클립보드 복사에 대한 문제의 해결책을 알려드립니다. 이것은 볼랜드 커뮤니티 사이트에서 찾아냈습니다.
How to enable the cut and copy operations for the TWebBrowser component in Delphi 5

보다시피, 방법은 아주 간단합니다. 프로그램 시작과 종료시에 다음과 같이 처리해주면 됩니다.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    OleInitialize(NULL);
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    OleUninitialize();
}

두번째 문제.. 엔터키와 탭키는.. 말씀하신 델파이코리아에 있는 민성기님의 소스를 보았습니다만..
저자가 인용하지 마라고 하니, 저도 글쓴 분의 의사를 존중해야 하겠지요? 그래서 다른 곳을 뒤져봤습니다.
님의 메일을 받은 어제부터 짬짬이 계속 뒤졌는데... 물론 찾아냈지요.
HHF Innovations

그런데 찾은 방법이 민성기씨 방법과 비슷하더군요. 코드의 순서가 약간 다를 뿐, 방법이 거의 똑같았습니다.
이 Fournier라는 분은, MSDN에서 원인을 알아냈다네요. MSDN의 원문을 보니 민성기님의 말과는 달리,
원래 웹브라우저 컨트롤을 만든 MFC의 문제더군요.

어쨌든.. Fournier님의 호의로, 소스를 빌더로 고쳐서 올립니다. 약간 수정을 가했습니다.
먼저 헤더파일 내의 폼 클래스의 private 영역에 다음과 같이 추가하세요.
...
private:
    IOleInPlaceActiveObject *FOleInPlaceActiveObject;
    void __fastcall MyMessageHandler(TMsg &Msg, bool &Handled);
...

그리고, 폼의 OnCreate와 OnDestroy를 다음과 같이 코딩합니다. 위의 클립보드 코드도 포함해서요.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    OleInitialize(NULL);
    Application->OnMessage = MyMessageHandler;
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    OleUninitialize();
}

마지막으로 실제로 메시지를 처리할 함수를 만듭니다.
void __fastcall TForm1::MyMessageHandler(TMsg &Msg, bool &Handled)
{
    Handled = IsDialogMessage(CppWebBrowser1->Handle, &Msg) == true;
    if(!Handled || CppWebBrowser1->Busy) return;

    if((Msg.message==WM_KEYDOWN || Msg.message==WM_KEYUP) && (Msg.wParam==VK_RETURN || Msg.wParam==VK_TAB))
    {
        if(FOleInPlaceActiveObject != NULL)
            FOleInPlaceActiveObject->TranslateAccelerator(&Msg);
        else
        {
            IDispatch *Dispatch = CppWebBrowser1->Application;
            if(Dispatch != NULL)
            {
                IOleInPlaceActiveObject *iOIPAO;
                Dispatch->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&iOIPAO);
                if(iOIPAO != NULL)
                {
                    FOleInPlaceActiveObject = iOIPAO;
                    FOleInPlaceActiveObject->TranslateAccelerator(&Msg);
                }
            }
        }
    }
}

이상입니다. 아주 잘 동작합니다.
그럼 참고하시길...

+ -

관련 글 리스트
20 [COMPONENT] TCppWebBrowser에서 엔터키 + 클립보드 복사하기 박지훈.임프 20616 2001/03/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.