This works for TreeView, but flickers a lot with any repainting. Any idea how to solve that?
Code: Select all
Global WindowID, OldTreeGadgetProc, hDC, mDC, width, height, mOldObject
Declare TreeGadgetProc(hWnd, uMsg, wParam, lParam)
Declare OleOpen(File$)
OleInitialize_(0)
If OpenWindow(0, 128, 96, 640, 480, #PB_Window_SystemMenu|#PB_Window_MinimizeGadget, "TreeGadget background image example")
WindowID = WindowID()
If CreateGadgetList(WindowID)
TreeGadget = TreeGadget(0, 0, 0, WindowWidth(), WindowHeight())
For k=0 To 3
AddGadgetItem(0, -1, "General "+Str(k))
AddGadgetItem(0, -1, "ScreenMode")
OpenTreeGadgetNode(0)
AddGadgetItem(0, -1, "640*480")
AddGadgetItem(0, -1, "800*600")
AddGadgetItem(0, -1, "1024*768")
AddGadgetItem(0, -1, "1600*1200")
CloseTreeGadgetNode(0)
AddGadgetItem(0, -1, "Joystick")
Next
Buffer = AllocateMemory(0, 512)
GetModuleFileName_(GetModuleHandle_(0), Buffer, 512)
InitialDir$ = GetPathPart(PeekS(Buffer))
FreeMemory(0)
File$ = OpenFileRequester("Select image", InitialDir$, "Supported images|*.bmp;*.ico;*.gif;*.jpg;*.wmf;*.emf", 0)
If File$
OleOpen(File$)
; For bitmaps only, delete OleOpen(), delete the above line and use:
; LoadImage(0, File$)
; hDC = GetDC_(WindowID)
; mDC = CreateCompatibleDC_(hDC)
; mOldObject = SelectObject_(mDC, UseImage(0))
EndIf
OldTreeGadgetProc = SetWindowLong_(TreeGadget, #GWL_WNDPROC, @TreeGadgetProc())
Repeat:Until WaitWindowEvent()=#PB_EventCloseWindow
SelectObject_(mDC, mOldObject)
DeleteDC_(mDC)
EndIf
EndIf
OleUninitialize_()
End
Procedure TreeGadgetProc(hWnd, uMsg, wParam, lParam)
result = 0
Select uMsg
Case #WM_PAINT
InvalidateRect_(hWnd, 0, #TRUE)
result = CallWindowProc_(OldTreeGadgetProc, hWnd, uMsg, wParam, lParam)
hDC = GetDC_(hWnd)
BitBlt_(hDC, 0, 0, width, height, mDC, 0, 0, #SRCAND)
ReleaseDC_(hWnd, hDC)
Default
result = CallWindowProc_(OldTreeGadgetProc, hWnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure
#E_POINTER = $80000005
#E_NOINTERFACE = $80000004
#E_OUTOFMEMORY = $80000002
#IPicture_Release = 8
#IPicture_Get_Width = 24
#IPicture_Get_Height = 28
#IPicture_Render = 32
Procedure OleOpen(ImageFile$)
Shared pstm, gpPicture, hmwidth, hmheight, OldObject
hBitmap = 0
If ReadFile(0, ImageFile$)
FileSize = FileSize(ImageFile$)
hGlobal = GlobalAlloc_(#GMEM_MOVEABLE, FileSize)
pvData = GlobalLock_(hGlobal)
ReadData(pvData, FileSize)
CloseFile(0)
GlobalUnlock_(hGlobal)
CreateStreamOnHGlobal_(hGlobal, #TRUE, @pstm)
If gpPicture
CallCOM(#IPicture_Release, gpPicture)
EndIf
ErrorNumber = 0
Select OleLoadPicture_(pstm, FileSize, #FALSE, ?IID_IPicture, @gpPicture)
Case #E_POINTER
ErrorNumber = 222
Case #E_NOINTERFACE
ErrorNumber = 223
Case #E_OUTOFMEMORY
ErrorNumber = 224
EndSelect
CallCOM(#IPicture_Release, pstm)
GlobalFree_(hGlobal)
If ErrorNumber=0
CallCOM(#IPicture_Get_Width, gpPicture, @hmwidth)
CallCOM(#IPicture_Get_Height, gpPicture, @hmheight)
hDC = GetDC_(WindowID)
xScreenPixels = GetDeviceCaps_(hDC, #LOGPIXELSX)
yScreenPixels = GetDeviceCaps_(hDC, #LOGPIXELSY)
width = Abs((hmwidth*xScreenPixels)/2540)
height = Abs((hmheight*yScreenPixels)/2540)
rc.RECT
rc\left = 0
rc\top = 0
rc\right = width
rc\bottom = height
mDC = CreateCompatibleDC_(hDC)
hBitmap = CreateCompatibleBitmap_(hDC, width, height)
mOldObject = SelectObject_(mDC, hBitmap)
CallCOM(#IPicture_Render, gpPicture, mDC, 0, 0, width, height, 0, hmheight, hmwidth, -hmheight, rc)
ReleaseDC_(WindowID, hDC)
CallCOM(#IPicture_Release, gpPicture)
EndIf
EndIf
ProcedureReturn hBitmap
EndProcedure
!section '.data' Data readable writeable
IID_IPicture:
!dd $07bf80980
!dw $0bf32, $0101a
!db $08b, $0bb, 0, $0aa, 0, $030, $0c, $0ab
As in the previous snippet, OLE stuff can be deleted if you only use bitmaps.