;*** IOleWindow, IOleInPlaceObject + IOleInPlaceActiveObject
;*** interfaces
.386
.model flat, stdcall
option casemap:none ; case sensitive
option proc:private
.nolist
.nocref
include windows.inc
include unknwn.inc
include objidl.inc
include oleidl.inc
include olectl.inc
include oaidl.inc
include ocidl.inc
include CatProp.inc
include macros.inc
include debugout.inc
.list
.cref
include control.inc
.const
COleInPlaceObjectVtbl label IOleInPlaceObjectVtbl
IUnknownVtbl {QueryInterface_, AddRef_, Release_}
dd GetWindow@IOleWindow, ContextSensitiveHelp@IOleWindow
dd InPlaceDeactivate, UIDeactivate, SetObjectRects
dd ReactivateAndUndo
COleInPlaceActiveObjectVtbl label IOleInPlaceActiveObjectVtbl
IUnknownVtbl {QueryInterface_2, AddRef_2, Release_2}
dd GetWindow@IOleInPlaceActiveObject, ContextSensitiveHelp@IOleInPlaceActiveObject
dd TranslateAccelerator_, OnFrameWindowActivate
dd OnDocWindowActivate, ResizeBorder, EnableModeless
.code
;--------------------------------------------------------------------------
;IOleWindow interface (also used by IOleInPlaceObject interface)
;--------------------------------------------------------------------------
CastOffset textequ <offset CAsmCtrl.m_IOleInPlaceObject>
@MakeIUnknownStubs CastOffset
GetWindow@IOleWindow::
sub dword ptr [esp+4], CastOffset
jmp GetWindow_
ContextSensitiveHelp@IOleWindow::
sub dword ptr [esp+4], CastOffset
jmp ContextSensitiveHelp
;--------------------------------------------------------------------------
GetWindow_ proc this_:ptr CAsmCtrl,phWnd:ptr HWND
mov ecx,this_
DebugOut "IOleWindow::GetWindow, hWnd=%X",[ecx].CAsmCtrl.m_hWnd
mov eax,[ecx].CAsmCtrl.m_hWnd
mov ecx,phWnd
mov [ecx],eax
.if (eax)
mov eax,S_OK
.else
mov eax,E_UNEXPECTED
.endif
ret
GetWindow_ endp
;--------------------------------------------------------------------------
ContextSensitiveHelp proc this_:ptr CAsmCtrl,fEnterMode:dword
DebugOut "IOleWindow::ContextSensitiveHelp"
return E_NOTIMPL
ContextSensitiveHelp endp
;--------------------------------------------------------------------------
;IOleInPlaceObject interface
;--------------------------------------------------------------------------
InPlaceDeactivate proc uses ebx this_:ptr CAsmCtrl
local pInPlaceSite:ptr IOleInPlaceSite
@AdjustThis
DebugOut "IOleInPlaceObject::InPlaceDeactivate"
mov ebx,this_
assume ebx:ptr CAsmCtrl
;------------------------ delete the window
.if ([ebx].m_hWnd)
invoke DestroyWindow,[ebx].m_hWnd
mov [ebx].m_hWnd,NULL
.endif
;------------------------ tell container we are deactivated
.if ([ebx].m_pClientSite)
invoke vf([ebx].m_pClientSite, IOleInPlaceSite, QueryInterface), addr IID_IOleInPlaceSite, ADDR pInPlaceSite
.if (eax == S_OK)
invoke vf(pInPlaceSite,IOleInPlaceSite,OnInPlaceDeactivate)
invoke vf(pInPlaceSite,IOleInPlaceSite,Release)
.endif
.endif
return S_OK
assume ebx:nothing
InPlaceDeactivate endp
;--------------------------------------------------------------------------
UIDeactivate proc this_:ptr CAsmCtrl
local pOleInPlaceSite:LPOLEINPLACESITE
local pOleInPlaceFrame:LPOLEINPLACEFRAME
@AdjustThis
mov ebx,this_
assume ebx:ptr CAsmCtrl
DebugOut "IOleInPlaceObject::UIDeactivate"
.if ([ebx].m_bUIActivated && [ebx].m_pClientSite)
invoke vf([ebx].m_pClientSite, IOleClientSite, QueryInterface), addr IID_IOleInPlaceFrame, ADDR pOleInPlaceFrame
.if (eax == S_OK)
invoke vf(pOleInPlaceFrame,IOleInPlaceFrame,SetActiveObject), NULL, NULL
invoke vf(pOleInPlaceFrame,IOleInPlaceFrame,Release)
.endif
invoke vf([ebx].m_pClientSite, IOleClientSite, QueryInterface), addr IID_IOleInPlaceSite, ADDR pOleInPlaceSite
.if (eax == S_OK)
invoke vf(pOleInPlaceSite,IOleInPlaceSite,OnUIDeactivate), FALSE
invoke vf(pOleInPlaceSite,IOleInPlaceSite,Release)
.endif
.endif
mov [ebx].m_bUIActivated, FALSE
if 0
.if ([ebx].m_hWnd)
invoke ShowWindow,[ebx].m_hWnd,SW_HIDE
.endif
endif
return S_OK
assume ebx:nothing
UIDeactivate endp
;--------------------------------------------------------------------------
SetObjectRects proc uses ebx this_:ptr CAsmCtrl,lprcPosRect:ptr RECT,lprcClipRect:ptr RECT
@AdjustThis
mov ebx,this_
assume ebx:ptr CAsmCtrl
mov eax,lprcPosRect
.if (eax)
mov ecx,[eax].RECT.right
sub ecx,[eax].RECT.left
mov [ebx].m_pixelExtent.cx_,ecx
mov edx,[eax].RECT.bottom
sub edx,[eax].RECT.top
mov [ebx].m_pixelExtent.cy,edx
.if ([ebx].m_hWnd)
invoke SetWindowPos,[ebx].m_hWnd,NULL,\
[eax].RECT.left,[eax].RECT.top,\
ecx,edx,SWP_NOZORDER or SWP_NOACTIVATE
invoke InvalidateRect,[ebx].m_hWnd,0,0
.endif
mov eax,lprcPosRect
mov ecx,lprcClipRect
.if (!ecx)
mov ecx,eax
.endif
DebugOut "IOleInPlaceObject::SetObjectRects([%d,%d,%d,%d],[%d,%d,%d,%d])",\
[eax].RECT.left,[eax].RECT.top,[eax].RECT.right,[eax].RECT.bottom,\
[ecx].RECT.left,[ecx].RECT.top,[ecx].RECT.right,[ecx].RECT.bottom
.endif
return S_OK
assume ebx:nothing
SetObjectRects endp
;--------------------------------------------------------------------------
ReactivateAndUndo proc this_:ptr CAsmCtrl
@AdjustThis
DebugOut "IOleInPlaceObject::ReactivateAndUndo"
mov eax, INPLACE_E_NOTUNDOABLE
ret
ReactivateAndUndo endp
;--------------------------------------------------------------------------
;IOleInPlaceActiveObject interface
;--------------------------------------------------------------------------
CastOffset textequ <offset CAsmCtrl.m_IOleInPlaceActiveObject>
@MakeIUnknownStubs CastOffset, 2
GetWindow@IOleInPlaceActiveObject::
sub dword ptr [esp+4], CastOffset
jmp GetWindow_
ContextSensitiveHelp@IOleInPlaceActiveObject::
sub dword ptr [esp+4], CastOffset
jmp ContextSensitiveHelp
TranslateAccelerator_ proc this_:ptr CAsmCtrl, lpMsg:ptr MSG
; @AdjustThis
return S_FALSE
TranslateAccelerator_ endp
OnFrameWindowActivate proc this_:ptr CAsmCtrl, fActivate:dword
; @AdjustThis
return S_OK
OnFrameWindowActivate endp
OnDocWindowActivate proc this_:ptr CAsmCtrl, fActivate:dword
; @AdjustThis
return S_OK
OnDocWindowActivate endp
ResizeBorder proc this_:ptr CAsmCtrl, lpRect:ptr RECT, pUIWindow: ptr,fFrameWindow:dword
; @AdjustThis
return S_OK
ResizeBorder endp
EnableModeless proc this_:ptr CAsmCtrl, fActivate:dword
; @AdjustThis
return S_OK
EnableModeless endp
end
|