Hintergrundbild in Treegadget()

Für allgemeine Fragen zur Programmierung mit PureBasic.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Hintergrundbild in Treegadget()

Beitrag von sobi »

Hallo,
ist es Möglich, in einem Treegadget als Hintergrund ein Bild einzusetzten? - Es mit einer Farbe einzufärben klappt wunderbar, aber ein Bild...? :?
Hat jemand einen Tipp? - LG, Simon
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

hmmm
eigentlich sollte man doch mit PureCOLOR_SetGadgetColor den Hintergrund transparent gestalten können, oder?
#PureCOLOR_DontSetBackColor => Simulates transparency
Allerdings funktioniert es nicht... :(
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

sobi hat geschrieben:hmmm
eigentlich sollte man doch mit PureCOLOR_SetGadgetColor den Hintergrund transparent gestalten können, oder?
#PureCOLOR_DontSetBackColor => Simulates transparency
Allerdings funktioniert es nicht... :(
#PureCOLOR_DontSetBackColor only works for some gadgets, like the TextGadget for example.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Guckst du hier:

http://www.codeguru.com/cpp/controls/tr ... .php/c679/

Muß zwar umgeschrieben werden aber es funktioniert.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ich hab' noch mal nen' bischen gegoogelt und von verschiedenen Stellen entsprechende Infos eingeholt um dir was zusammen zu basteln.

Code: Alles auswählen

; Title:  TreeView BG Image Demo
; Author: Fluid Byte
; Date:   December 17, 2006

Import "msimg32.lib"
	TransparentBlt(hdcDest,nXOriginDest,nYOriginDest,nWidthDest,hHeightDest,hdcSrc,nXOriginSrc,nYOriginSrc,nWidthSrc,nHeightSrc,crTransparent)
EndImport

Global lpPrevFunc.l
Global bPainting.b

CreateImage(0,10,290)

StartDrawing(ImageOutput(0))
For i=0 To 289
	CV = i*140/289
	Box(0,i,10,1,RGB(255,255-CV,0))	
Next
StopDrawing()

Procedure TreeViewProc(hWnd.l,uMsg.l,wParam.l,lParam.l)
	Select uMsg
		Case #WM_PAINT
		If bPainting = #False
			bPainting = #True
			
			GetClientRect_(hWnd,wrc.RECT)
			
			BeginPaint_(hWnd,ps.PAINTSTRUCT)
			
			hDC = GetDC_(hWnd)
			
			hbmTemp = CreateCompatibleBitmap_(hDC,wrc\right,wrc\bottom)
			
			hdcMem = CreateCompatibleDC_(hDC)
			hbmOld = SelectObject_(hdcMem,hbmTemp)
			
			SendMessage_(hWnd,#WM_PAINT,hdcMem,0)
			
			hBrushBack = CreatePatternBrush_(ImageID(0))
			hBrushOld = SelectObject_(hDC,hBrushBack)			
			SetRect_(trc.RECT,0,0,wrc\right,wrc\bottom)		
			FillRect_(hDC,trc,hBrushBack)			
			SelectObject_(hDC,hBrushOld)
			DeleteObject_(hBrushBack)
			
			TransparentBlt(hDC,0,0,wrc\right,wrc\bottom,hdcMem,0,0,wrc\right,wrc\bottom,GetSysColor_(#COLOR_WINDOW))
			
			SelectObject_(hdcMem,hbmOld)			
			DeleteObject_(hbmTemp)			
			DeleteDC_(hdcMem)
			ReleaseDC_(hWnd,hDC)
			
			EndPaint_(hWnd,ps)
			
			bPainting = #False
			
			ProcedureReturn 0			
		Else
			ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)
		EndIf
		
		Case #WM_ERASEBKGND
		
		ProcedureReturn #True
		
		Case #WM_HSCROLL, #WM_VSCROLL, #WM_MOUSEWHEEL
	
		InvalidateRect_(hWnd,0,0)

		ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)
		
		Case #WM_DESTROY
		SetWindowLong_(hWnd,#GWL_WNDPROC,lpPrevFunc)
		
		ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)
		
		Default
		ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)		
	EndSelect
EndProcedure

; ----------------------------------------------------------

OpenWindow(0,0,0,400,300,"TreeView BG Image Demo",#WS_OVERLAPPEDWINDOW | #WS_VISIBLE | 1)

CreateGadgetList(WindowID(0))

*hwndTreeView = TreeGadget(0,5,5,390,290)

SetGadgetColor(0,#PB_Gadget_LineColor,$505050)

GetObject_(SendMessage_(*hwndTreeView,#WM_GETFONT,0,0),SizeOf(LOGFONT),lplf.LOGFONT)
lplf\lfQuality = 3
hFntTree = CreateFontIndirect_(lplf)

SendMessage_(*hwndTreeView,#WM_SETFONT,hFntTree,0)

For i=1 To 30
	AddGadgetItem(0,-1,"Untitled Item #" + Str(i),0,Random(1))
	SetGadgetState(0,i-1)
Next

SetGadgetState(0,0)

lpPrevFunc = SetWindowLong_(*hwndTreeView,#GWL_WNDPROC,@TreeViewProc())

HideWindow(0,0)

; ----------------------------------------------------------

Repeat 
	EventID = WaitWindowEvent()

	If EventID = #PB_Event_SizeWindow
		ResizeGadget(0,5,5,WindowWidth(0)-10,WindowHeight(0)-10)
	EndIf
Until EventID = 16

DeleteObject_(hFntTree)
Dieser Code basiert auf dem Prinzip:
The tree view control does not support an owner drawn control - not yet. This makes it somewhat difficult to display an image as a background. The basic approach is to let the control draw in a memory device context, draw this transparently over the background image and then draw the final image onto the control client area.
Deshalb hat diesen Variante einen Nachteil. Dieser bestehet darin das man keine geglättete Schrift benutzen kann bzw. sollte. Da die Farbe Weiss bzw. die momentane Fenster Hintergrundfarbe als transparente Farbe dient und bei geglätteter Schrift aber einige Pixel in ihren RGB Werten verändert werden bleiben beim 'maskieren' Fragmente übrig.

Wie auch immer, was bessers wirst du im Moment nicht finden. Ich hoffe es hilft fürs erste. Und wenn du ganz 'hardcore' drauf bist kannst du dir ja auch ein eigenes TreeGadget basteln. :wink:
Antworten