손병찬 wrote:
> 익스플로에서 ActiveX폼을 올린다음 익스플로를 ActiveX폼이제어할려면 어떻게 해야합니까?? 예를들어 익스플로에서 F5(새로고침)을 누르면 ActiveX폼이 먼저 액션을 취하게 하고싶어요..
간단하게 예제로 설명 드리겠습니다.
IOleInPlaceActiveObject 를 상속받습니다.
TOCXControl = class(TActiveForm, IOCXControl, IOleInPlaceActiveObject);
이런식으로요.
function PreTranslateMessage(var Msg: TMsg): BOOL;
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;
를 public 안에 추가하고 구현해 줍니다. 인터페이스 구현부입니다.
function TOCXControl.PreTranslateMessage(var Msg: TMsg): BOOL;
begin
result := false;
case Msg.message of
WM_KEYDOWN,
WM_KEYUP:
begin
case Msg.wParam of // F3, F11, TAB, 방향키는 제외
// place as many as you want such as VK_F4, VK_F12, etc.
VK_F3,
VK_F5:
begin
// 콘트롤에게 메세지를 직접 보내세요. 아니면 바로 여기서 처리하세요.
result := true; // Tell IE we've handled these, otherwise return false!
end;
end;
end;
end; //end case
end;
function TOCXControl.TranslateAccelerator(var msg: TMsg): HResult;
var
Used: boolean;
begin
// 이 키를 핸들링하고 있습니까? 또는 IE 는 그것들을 핸들링하고 있습니까?
Used := PreTranslateMessage(Msg);
if (Used) then
result := S_OK // 키를 핸들링
else
result := S_FALSE; //Le IE handling the key!
// Beep;
end;
function TOCXControl.GetWindow(out wnd: HWnd): HResult;
begin
// FWincontrol 은 당신의 콘트롤입니다. 이름은 당신이 정한대로...
if self.HandleAllocated then
begin
wnd := FWincontrol .Handle;
Result := S_OK;
end
else
Result := E_FAIL;
end;
나머진 전부 Result := S_OK; 해주신 후 PreTranslateMessage 에서 입력받기를 원하는 키를 잡아서 처리하심 됩니다..
그럼 즐푸하세요~
> 익스플로에서 ActiveX폼을 올린다음 익스플로를 ActiveX폼이제어할려면 어떻게 해야합니까?? 예를들어 익스플로에서 F5(새로고침)을 누르면 ActiveX폼이 먼저 액션을 취하게 하고싶어요..
간단하게 예제로 설명 드리겠습니다.
IOleInPlaceActiveObject 를 상속받습니다.
TOCXControl = class(TActiveForm, IOCXControl, IOleInPlaceActiveObject);
이런식으로요.
function PreTranslateMessage(var Msg: TMsg): BOOL;
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;
를 public 안에 추가하고 구현해 줍니다. 인터페이스 구현부입니다.
function TOCXControl.PreTranslateMessage(var Msg: TMsg): BOOL;
begin
result := false;
case Msg.message of
WM_KEYDOWN,
WM_KEYUP:
begin
case Msg.wParam of // F3, F11, TAB, 방향키는 제외
// place as many as you want such as VK_F4, VK_F12, etc.
VK_F3,
VK_F5:
begin
// 콘트롤에게 메세지를 직접 보내세요. 아니면 바로 여기서 처리하세요.
result := true; // Tell IE we've handled these, otherwise return false!
end;
end;
end;
end; //end case
end;
function TOCXControl.TranslateAccelerator(var msg: TMsg): HResult;
var
Used: boolean;
begin
// 이 키를 핸들링하고 있습니까? 또는 IE 는 그것들을 핸들링하고 있습니까?
Used := PreTranslateMessage(Msg);
if (Used) then
result := S_OK // 키를 핸들링
else
result := S_FALSE; //Le IE handling the key!
// Beep;
end;
function TOCXControl.GetWindow(out wnd: HWnd): HResult;
begin
// FWincontrol 은 당신의 콘트롤입니다. 이름은 당신이 정한대로...
if self.HandleAllocated then
begin
wnd := FWincontrol .Handle;
Result := S_OK;
end
else
Result := E_FAIL;
end;
나머진 전부 Result := S_OK; 해주신 후 PreTranslateMessage 에서 입력받기를 원하는 키를 잡아서 처리하심 됩니다..
그럼 즐푸하세요~
'프로그래밍 > 델파이' 카테고리의 다른 글
아놔 델파이 TTcpClient로 문자열 보내기 (0) | 2010.03.04 |
---|---|
Thumb만들때 jpeg 속도 빠르게 하기 (0) | 2007.04.18 |
윈도우 환경변수 TEMP 찾아내기 (0) | 2006.11.16 |
1을 001로 보이게 하려면? (0) | 2006.11.06 |
팁 - 델파이 COM에 이벤트 발생시키기.zip (0) | 2006.11.06 |