저도 한델에서 답변을 찾다가 답변이 없어서 고생하던 중
yahoo dhtml group에서 답변을 찾았습니다.
혹시 저처럼 고생하시는 분이 계실까봐 올려놓습니다.
다음과 같이 IOleInPlaceActiveObject를 추가하고,
TMyActiveXForm = class(TActiveForm, ISendEmail, IPersistPropertyBag, IOleInPlaceActiveObject)
private 영역에 다음변수 추가.
bControl : Boolean;
protected 영역에
function PreTranslateMessage(var Msg: TMsg): BOOL; //Not part of
function TranslateAccelerator(var Msg: TMsg): HRESULT; stdcall;
function OnFrameWindowActivate(fActivate: BOOL): HResult; stdcall;
function OnDocWindowActivate(fActivate: BOOL): HResult; stdcall;
function ResizeBorder(const rcBorder: TRect; const uiWindow:
IOleInPlaceUIWindow;
fFrameWindow: BOOL): HResult; stdcall;
function EnableModeless(fEnable: BOOL): HResult; stdcall;
function GetWindow(out wnd: HWnd): HResult; stdcall;
function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
를 추가합니다.
Ctrl+Shift+G를 누르고
함수중에 PreTranslateMessage와 GetWindow를 다음과 같이 구현하고
나머지 함수는 Result := S_OK; 한줄 추가했습니다.
function TMyActiveXForm.PreTranslateMessage(var Msg: TMsg): BOOL;
var
key: Word;
ch: integer;
c:char;
begin
result := false;
case Msg.message of
WM_KEYDOWN,
WM_KEYUP:
begin
case Msg.wParam of
VK_F1,
VK_F2,
VK_F3,
VK_F4,
VK_F5,
VK_F6,
VK_F7,
VK_F8,
VK_F9,
VK_F10,
VK_F11,
VK_F12,
VK_DELETE,
VK_CONTROL,
VK_TAB:
begin
//Send this message to our control, or handle it directly here.
SendMessage(Self.Handle, Msg.message, Msg.wParam,
Msg.lParam);
SendMessage(DhtmlBody.Handle, Msg.message, Msg.wParam,
Msg.lParam);
result := true;
if VK_CONTROL = Msg.wParam then bControl := true else
bControl := false; //Tell IE we've handled these, otherwise return false!
end;
67, 86: // CTRL-C e CTRL-V respectivamente
if bControl then
begin
SendMessage(Self.Handle, Msg.message, Msg.wParam,
Msg.lParam);
SendMessage(DhtmlBody.Handle, Msg.message,
Msg.wParam, Msg.lParam);
result := true;
end;
end; //end case
end;
end; //end case
end;
function TMyActiveXForm.GetWindow(out wnd: HWnd): HResult;
begin
//FWinControl.HandleAllocated is YOUR control, your
//name might be different..
if ActiveOleControl.HandleAllocated then
begin
wnd := ActiveOleControl.Handle;
Result := S_OK;
end else
Result := E_FAIL;
end;
yahoo dhtml group에서 답변을 찾았습니다.
혹시 저처럼 고생하시는 분이 계실까봐 올려놓습니다.
다음과 같이 IOleInPlaceActiveObject를 추가하고,
TMyActiveXForm = class(TActiveForm, ISendEmail, IPersistPropertyBag, IOleInPlaceActiveObject)
private 영역에 다음변수 추가.
bControl : Boolean;
protected 영역에
function PreTranslateMessage(var Msg: TMsg): BOOL; //Not part of
function TranslateAccelerator(var Msg: TMsg): HRESULT; stdcall;
function OnFrameWindowActivate(fActivate: BOOL): HResult; stdcall;
function OnDocWindowActivate(fActivate: BOOL): HResult; stdcall;
function ResizeBorder(const rcBorder: TRect; const uiWindow:
IOleInPlaceUIWindow;
fFrameWindow: BOOL): HResult; stdcall;
function EnableModeless(fEnable: BOOL): HResult; stdcall;
function GetWindow(out wnd: HWnd): HResult; stdcall;
function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
를 추가합니다.
Ctrl+Shift+G를 누르고
함수중에 PreTranslateMessage와 GetWindow를 다음과 같이 구현하고
나머지 함수는 Result := S_OK; 한줄 추가했습니다.
function TMyActiveXForm.PreTranslateMessage(var Msg: TMsg): BOOL;
var
key: Word;
ch: integer;
c:char;
begin
result := false;
case Msg.message of
WM_KEYDOWN,
WM_KEYUP:
begin
case Msg.wParam of
VK_F1,
VK_F2,
VK_F3,
VK_F4,
VK_F5,
VK_F6,
VK_F7,
VK_F8,
VK_F9,
VK_F10,
VK_F11,
VK_F12,
VK_DELETE,
VK_CONTROL,
VK_TAB:
begin
//Send this message to our control, or handle it directly here.
SendMessage(Self.Handle, Msg.message, Msg.wParam,
Msg.lParam);
SendMessage(DhtmlBody.Handle, Msg.message, Msg.wParam,
Msg.lParam);
result := true;
if VK_CONTROL = Msg.wParam then bControl := true else
bControl := false; //Tell IE we've handled these, otherwise return false!
end;
67, 86: // CTRL-C e CTRL-V respectivamente
if bControl then
begin
SendMessage(Self.Handle, Msg.message, Msg.wParam,
Msg.lParam);
SendMessage(DhtmlBody.Handle, Msg.message,
Msg.wParam, Msg.lParam);
result := true;
end;
end; //end case
end;
end; //end case
end;
function TMyActiveXForm.GetWindow(out wnd: HWnd): HResult;
begin
//FWinControl.HandleAllocated is YOUR control, your
//name might be different..
if ActiveOleControl.HandleAllocated then
begin
wnd := ActiveOleControl.Handle;
Result := S_OK;
end else
Result := E_FAIL;
end;
수고하세요~
-------------- 원 문 보 기 --------------
>안녕하세요
>
>제가 dhtmledit 컴포넌트를 사용하여 activex를 만들었습니다.
>이 activex는 웹으로 올려서 브라우저에서 사용하게되는데
>
>dhtmledit안에서 html를 편집하다 보면
>방향전환 커서가 먹지 않습니다.
>
>엔터키는 먹는데요
>
>아래, 위, 왼,오른쪽으로 가는 방향키가 먹지 않습니다.
>혹시 아시는분...알려주세요
>
>
>미리 감사드립니다.