📄 asmctrl.asm
字号:
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_isDirty
.IF eax
xor eax, eax ; mov eax, S_OK
.ELSE
mov eax, S_FALSE
.ENDIF
ret
IPersistStreamInit_IsDirty ENDP
;--------------------------------------------------------------------------
IPersistStreamInit_Load PROC this_:DWORD, pStream:DWORD
LOCAL var:VARIANT, bCount:DWORD, pBase:DWORD
pObjectData this_, ecx
mov pBase, ecx
; persisted quantities and order
; m_Value
; m_BackColor
; m_ForeColor
coinvoke pStream, IStream, Read, ADDR (AsmCtrlData ptr [ecx]).m_Value, 4, ADDR bCount
mov ecx, pBase
coinvoke pStream, IStream, Read, ADDR (AsmCtrlData ptr [ecx]).m_BackColor, 4, ADDR bCount
mov ecx, pBase
coinvoke pStream, IStream, Read, ADDR (AsmCtrlData ptr [ecx]).m_ForeColor, 4, ADDR bCount
xor eax, eax ; return S_OK
ret
IPersistStreamInit_Load ENDP
;--------------------------------------------------------------------------
IPersistStreamInit_Save PROC this_:DWORD, pStream:DWORD, fClearDirty:DWORD
LOCAL bCount:DWORD, pBase:DWORD
pObjectData this_, ecx
mov pBase, ecx
.IF fClearDirty
mov (AsmCtrlData ptr [ecx]).m_isDirty, FALSE
.ENDIF
mov ecx, pBase
coinvoke pStream, ISequentialStream, Write, ADDR (AsmCtrlData ptr [ecx]).m_Value, SIZEOF DWORD, ADDR bCount
mov ecx, pBase
coinvoke pStream, ISequentialStream, Write, ADDR (AsmCtrlData ptr [ecx]).m_BackColor, SIZEOF DWORD, ADDR bCount
mov ecx, pBase
coinvoke pStream, ISequentialStream, Write, ADDR (AsmCtrlData ptr [ecx]).m_ForeColor, SIZEOF DWORD, ADDR bCount
xor eax, eax ; return S_OK
ret
IPersistStreamInit_Save ENDP
;--------------------------------------------------------------------------
IPersistStreamInit_GetSizeMax PROC this_:DWORD, pSize:DWORD
LOCAL ssize:ULARGE_INTEGER
.IF !pSize
mov eax, E_POINTER
ret
.ENDIF
mov eax, 1000
mov ssize.LowPart, eax
xor eax, eax
mov ssize.HighPart, eax
mov eax, pSize
lea ecx, ssize
mov [eax], ecx
xor eax, eax ; return S_OK
ret
IPersistStreamInit_GetSizeMax ENDP
;--------------------------------------------------------------------------
IPersistStreamInit_InitNew PROC this_:DWORD
pObjectData this_, ecx
mov eax, 3969
mov (AsmCtrlData ptr [ecx]).m_himetricExtent.x, eax
mov (AsmCtrlData ptr [ecx]).m_himetricExtent.y, eax
mov eax, 150
mov (AsmCtrlData ptr [ecx]).m_pixelExtent.x, eax
mov (AsmCtrlData ptr [ecx]).m_pixelExtent.y, eax
mov eax, 0808080H
mov (AsmCtrlData ptr [ecx]).m_ForeColor, eax
mov eax, 0FFFFFFH
mov (AsmCtrlData ptr [ecx]).m_BackColor, eax
xor eax, eax ; return S_OK
ret
IPersistStreamInit_InitNew ENDP
;--------------------------------------------------------------------------
;IViewObject
;--------------------------------------------------------------------------
IViewObject_Draw PROC PROC this_:DWORD, dwAspect:DWORD, lindex:DWORD,
pvAspect:DWORD, ptd:DWORD, hicTargetDev:DWORD,
hdc:DWORD, pRectBounds:DWORD, prcWBounds:DWORD,
pfnContinue:DWORD, dwContinue:DWORD
LOCAL hBrush:DWORD
.IF dwAspect != DVASPECT_CONTENT
mov eax, DV_E_DVASPECT
ret
.ENDIF
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_BackColor
invoke CreateSolidBrush, eax
mov hBrush, eax
invoke FillRect, hdc, pRectBounds, hBrush
invoke DeleteObject, hBrush
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_ForeColor
invoke SetTextColor, hdc, eax
pObjectData this_, ecx
mov eax, (AsmCtrlData ptr [ecx]).m_BackColor
invoke SetBkColor, hdc, eax
invoke DrawText, hdc, ADDR szName, NameLength, pRectBounds, DT_CENTER or DT_VCENTER or DT_SINGLELINE
xor eax, eax ; return S_OK
ret
IViewObject_Draw ENDP
;--------------------------------------------------------------------------
IViewObject_GetColorSet PROC this_:DWORD, dwAspect:DWORD, lindex:DWORD,
pvAspect:DWORD, ptd:DWORD, hicTargetDev:DWORD,
ppColorSet:DWORD
mov eax, E_NOTIMPL
ret
IViewObject_GetColorSet ENDP
;--------------------------------------------------------------------------
IViewObject_Freeze PROC this_:DWORD, dwAspect:DWORD, lindex:DWORD,
pvAspect:DWORD, pdwFreeze:DWORD
mov eax, E_NOTIMPL
ret
IViewObject_Freeze ENDP
;--------------------------------------------------------------------------
IViewObject_Unfreeze PROC this_:DWORD, dwFreeze:DWORD
mov eax, E_NOTIMPL
ret
IViewObject_Unfreeze ENDP
;--------------------------------------------------------------------------
IViewObject_SetAdvise PROC this_:DWORD, aspect:DWORD, advf:DWORD, ppViewAdviseSink:DWORD
.IF aspect != DVASPECT_CONTENT
mov eax, DV_E_DVASPECT
ret
.ENDIF
pObjectData this_, edx
mov ecx, ppViewAdviseSink
invoke ComPtrAssign, ADDR (AsmCtrlData ptr [edx]).m_pViewAdviseSink, ecx
mov eax, advf
pObjectData this_, edx
mov (AsmCtrlData ptr [edx]).m_advf, eax
and eax, ADVF_PRIMEFIRST
.IF eax
invoke SendViewChange, this_
.ENDIF
xor eax, eax ; return S_OK
ret
IViewObject_SetAdvise ENDP
;--------------------------------------------------------------------------
IViewObject_GetAdvise PROC this_:DWORD, pAspects:DWORD, pAdvf:DWORD, ppViewAdviseSink:DWORD
.IF !ppViewAdviseSink
mov eax, E_POINTER
ret
.ENDIF
pObjectData this_, edx
invoke ComPtrAssign, ppViewAdviseSink, (AsmCtrlData ptr [edx]).m_pViewAdviseSink
mov ecx, pAspects
mov eax, [ecx]
.IF eax == DVASPECT_CONTENT
mov ecx, pAdvf
mov eax, [ecx]
.IF eax
mov eax, (AsmCtrlData ptr [edx]).m_advf
mov [ecx], eax
.ENDIF
.ENDIF
xor eax, eax ; return S_OK
ret
IViewObject_GetAdvise ENDP
;--------------------------------------------------------------------------
;IViewObject2
;--------------------------------------------------------------------------
IViewObject2_GetExtent PROC this_:DWORD, aspect:DWORD, lindex:DWORD,
ptd:DWORD, pSize:DWORD
.IF !pSize
mov eax, E_POINTER
ret
.ENDIF
.IF (aspect != DVASPECT_CONTENT)
mov eax, DV_E_DVASPECT
ret
.ENDIF
mov ecx, pSize
pObjectData this_, edx
mov eax, DWORD PTR (AsmCtrlData ptr [edx]).m_himetricExtent
mov [ecx], eax
xor eax, eax ; return S_OK
ret
IViewObject2_GetExtent ENDP
;--------------------------------------------------------------------------
;ISpecifyPropertyPages
;--------------------------------------------------------------------------
ISpecifyPropertyPages_GetPages PROC this_:DWORD, pPages:DWORD
.IF !pPages
mov eax, E_POINTER
ret
.ENDIF
mov edx, pPages
mov (CAUUID PTR [edx]).cElems, 2
invoke CoTaskMemAlloc, (SIZEOF GUID) * 2
mov (CAUUID PTR [edx]).pElems, eax
push esi
push edi
mov esi, pCLSID_StockFontPage
mov edi, eax
mov ecx, SIZEOF GUID / 4
rep movsd
mov esi, pCLSID_StockColorPage
mov edi, eax
mov ecx, SIZEOF GUID / 4
rep movsd
pop edi
pop esi
xor eax, eax ; return S_OK
ret
ISpecifyPropertyPages_GetPages ENDP
;--------------------------------------------------------------------------
;IPersistPropertyBag
;--------------------------------------------------------------------------
IPersistPropertyBag_InitNew PROC this_:DWORD
invoke IPersistStreamInit_InitNew, this_ ; re-use the method
; (hey, THAT'S like inheritance!)
ret
IPersistPropertyBag_InitNew ENDP
;--------------------------------------------------------------------------
IPersistPropertyBag_Load PROC this_:DWORD, pPropBag:DWORD, pErrorLog:DWORD
LOCAL var:VARIANT, pBase:DWORD
pObjectData this_, edx
mov pBase, edx
; persisted quantities and order
; m_Value = Value
mov var.vt, VT_I4
mov var.lVal, 0
coinvoke pPropBag, IPropertyBag, Read, ADDR wszValue, ADDR var, NULL
.IF_SUCCEEDED
mov edx, pBase
mov eax, var.lVal
mov (AsmCtrlData ptr [edx]).m_Value, eax
.ELSE
.ENDIF
mov var.vt, VT_I4
mov var.lVal, 0
coinvoke pPropBag, IPropertyBag, Read, ADDR wszBackColor, ADDR var, NULL
.IF_SUCCEEDED
mov edx, pBase
mov eax, var.lVal
mov (AsmCtrlData ptr [edx]).m_BackColor, eax
.ELSE
.ENDIF
mov var.vt, VT_I4
mov var.lVal, 0
coinvoke pPropBag, IPropertyBag, Read, ADDR wszForeColor, ADDR var, NULL
.IF_SUCCEEDED
mov edx, pBase
mov eax, var.lVal
mov (AsmCtrlData ptr [edx]).m_ForeColor, eax
.ELSE
.ENDIF
xor eax, eax ; return S_OK
ret
IPersistPropertyBag_Load ENDP
;--------------------------------------------------------------------------
IPersistPropertyBag_Save PROC this_:DWORD, pPropBag:DWORD, fClearDirty:DWORD, fSaveAllProperties:DWORD
LOCAL var:VARIANT, pBase:DWORD
pObjectData this_, ecx
mov pBase, ecx
.IF fClearDirty
mov (AsmCtrlData ptr [ecx]).m_isDirty, FALSE
.ENDIF
; persisted quantities and order
; m_Value = Value
mov var.vt, VT_I4
mov eax, (AsmCtrlData ptr [ecx]).m_Value
mov var.lVal, eax
coinvoke pPropBag, IPropertyBag, Write, ADDR wszValue, ADDR var
mov ecx, pBase
mov var.vt, VT_I4
mov eax, (AsmCtrlData ptr [ecx]).m_BackColor
mov var.lVal, eax
coinvoke pPropBag, IPropertyBag, Write, ADDR wszBackColor, ADDR var
mov ecx, pBase
mov var.vt, VT_I4
mov eax, (AsmCtrlData ptr [ecx]).m_ForeColor
mov var.lVal, eax
coinvoke pPropBag, IPropertyBag, Write, ADDR wszForeColor, ADDR var
xor eax, eax ; return S_OK
ret
IPersistPropertyBag_Save ENDP
;--------------------------------------------------------------------------
ICategorizeProperties_MapPropertyToCategory PROC this_:DWORD, dispid:DWORD, ppropcat:DWORD
mov ecx, OFFSET AsmCtrlPropMap
mov edx, (PropCatItem PTR [ecx]).m_CatID
.WHILE edx ; a NULL CatID signals the end
mov eax, (PropCatItem PTR [ecx]).m_dispid
.IF eax == dispid
; we found a dispid we catagorize
mov ecx, ppropcat
mov [ecx], edx ; return m_CatID
xor eax, eax ; return S_OK
ret
.ENDIF
add ecx, SIZEOF PropCatItem
.ENDW
mov eax, E_FAIL
ret
ICategorizeProperties_MapPropertyToCategory ENDP
;--------------------------------------------------------------------------
ICategorizeProperties_GetCategoryName PROC this_:DWORD, propcat:DWORD, lcid:DWORD, pbstrName:DWORD
LOCAL Buf[MAX_PATH]:BYTE, wBuf[MAX_PATH]:WORD
mov ecx, OFFSET AsmCtrlCatNameMap
mov edx, (CatNameItem PTR [ecx]).m_ResourceID
.WHILE edx ; a NULL ResourceID signals the end
mov eax, (CatNameItem PTR [ecx]).m_CatID
.IF eax == propcat
; we found our catagory name index
invoke LoadString, g_hModule, edx, ADDR Buf, MAX_PATH
invoke MultiByteToWideChar, CP_ACP, 0, ADDR Buf, -1, ADDR wBuf, MAX_PATH
invoke SysAllocString, ADDR wBuf
mov ecx, pbstrName
mov [ecx], eax
xor eax, eax ; return S_OK
ret
.ENDIF
add ecx, SIZEOF CatNameItem
.ENDW
mov eax, E_FAIL
ret
ICategorizeProperties_GetCategoryName ENDP
;--------------------------------------------------------------------------
end DllMain
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -