Page 1 of 2

CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 4:01 am
by andyglezl
Hola
No puedo cambiar el BACKCOLOR de una Ventana tipo PANEL
¿Es un ERROR, o que estoy haciendo mal?
Alguien sabe ?
Gracias.
*--------------------------------------------------------------------------

Hello
I cannot change the BACKCOLOR of a PANEL Window
Is it a MISTAKE, or what am I doing wrong?
Someone knows ?
Thank you.

Code: Select all


#include "hmg.ch"

STATIC aColFdo1 := { 000, 023, 052 }, aColFdo2 := { 112 , 128 , 144 }, aColFdo3 := { 140 , 160 , 180 }, aColFte := WHITE

FUNCTION Main()

    DEFINE WINDOW Form_9 AT 0,0 WIDTH 800 HEIGHT 660 TITLE "PRB" CHILD NOSIZE NOMAXIMIZE ; 
			NOMINIMIZE BACKCOLOR aColFdo1
			
        DEFINE WINDOW W_TipWin8 ROW 38 COL -003 WIDTH 806 HEIGHT 580 VIRTUALWIDTH 807 VIRTUALHEIGHT 2400 ;
                WINDOWTYPE PANEL BACKCOLOR aColFdo2 
			
			DEFINE CONTEXT MENU OF W_TipWin8
				MENUITEM "Color" ACTION CambiaColor( ThisWindow.Name )
			END MENU
        END WINDOW
		
    END WINDOW
    CENTER WINDOW   Form_9
    ACTIVATE WINDOW Form_9
RETURN Nil

FUNCTION CambiaColor( cWinName )
	aColFdo2 := GetColor( { 0 , 0 , 0 }, NIL, .T.)
	SetProperty( cWinName, "BACKCOLOR", aColFdo2 )
	BT_ClientAreaInvalidateAll( cWinName, .T. )
RETURN Nil


Quizá por esto ?
*------------------
Maybe for this?




- BackColor (D)

(D) Available at definition only

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 10:00 am
by dragancesu
In this case you can re-define windows like ( release, change color, define )

Code: Select all

 if IsWindowActive( FmdPrev )
       DoMethod( 'FmdPrev', "RELEASE" )
   endif
   
   DEFINE WINDOW FmdPrev ;
      AT 20, desk_pozx ;
      WIDTH 1000 ; 
      HEIGHT 800 ;
      TITLE 'Preview Form' ;
      PANEL ;
      BACKCOLOR aColFdo2 
      ...
      

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 11:27 am
by mol
Dragan, your method causes to define all control belong to panel window after it's redefinition

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 12:03 pm
by dragancesu
You right, but WINDOW is specific control and many properties is only-defined, no change. How change? Recreate, I think
definewindow.jpg
definewindow.jpg (92.87 KiB) Viewed 3459 times

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 12:13 pm
by mol
I can change color of main window only during OnInit procedure.

Code: Select all

PROCEDURE ChangeGradient
	param cForm, aColor1, aColor2
        LOCAL Width  := BT_ClientAreaWidth  (cForm)
        LOCAL Height := BT_ClientAreaHeight (cForm)
        LOCAL hDC, BTstruct

   hDC = BT_CreateDC (cForm, BT_HDC_INVALIDCLIENTAREA, @BTstruct)
   BT_DrawGradientFillVertical (hDC, 0, 0, Width, Height, aColor1, aColor2)
   BT_DeleteDC (BTstruct)
RETURN
I've tried this solution for various controls, but it works fine only for window.
After few modifications, I've reached gradient on BUTTON, but it returns to oryginal color after lost focus.

Maybe create background label - it's background color can be changed without problems?

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 1:08 pm
by AUGE_OHR
hi,

you can try Windows Standars

Code: Select all

SetBkColor( hDC, CLR_BLACK )
but this work only if you have no visual Style ... so perhaps you only don't "see" Background Color ...

you can disable Visual Style for just that Control (here ::hButton)

Code: Select all

// disable visual Style
   @UxTheme:SetWindowTheme(::hButton,CHR(0),CHR(0))
https://docs.microsoft.com/en-us/window ... indowtheme

---

when using visual Style "painting" ist different

here a sample from my native WC_Button

Code: Select all

METHOD DXE_BUTTON:Xbp_wndproc(hWnd,nMsg,wp,lp,ctx)
   ...
   ELSEIF nMsg == WM_CTLCOLORBTN


METHOD DXE_BUTTON:Check4Background()
LOCAL hRet := ::BrushSysColor

   DO CASE
      CASE ::ButtonClass = BS_RADIOBUTTON
      CASE ::ButtonClass = BS_3STATE
      CASE ::ButtonClass = BS_CHECKBOX

   OTHERWISE

      IF ::nMMove = 1 .AND. ::lHover = .T.
         IF ::lHilite = .T.
            hRet := ::BrushHiBackColor
         ELSE
            hRet := ::BrushSysColor
         ENDIF
          
         // more ...
      ELSE
         hRet := ::BrushSysColor
      ENDIF
   ENDCASE
RETURN hRet
A window receives this message through its WindowProc function.

#define CTLCOLOR_MSGBOX 0
#define CTLCOLOR_EDIT 1
#define CTLCOLOR_LISTBOX 2
#define CTLCOLOR_BTN 3
#define CTLCOLOR_DLG 4
#define CTLCOLOR_SCROLLBAR 5
#define CTLCOLOR_STATIC 6
#define CTLCOLOR_MAX 7
here you find more to read

WM_CTLCOLORSTATIC message
https://docs.microsoft.com/en-us/window ... olorstatic

WM_CTLCOLORBTN message
https://docs.microsoft.com/en-us/window ... tlcolorbtn

WM_CTLCOLOREDIT message
https://docs.microsoft.com/en-us/window ... lcoloredit
! Note : it have EM_SETBKGNDCOLOR

---

Question : does harbour / HMG support Owner Draw :?:
https://docs.microsoft.com/en-us/window ... rols-intro

Ownerdraw is the "older" Way to paint what you want.
Listview and other also support Customdraw (NM_CUSTOMDRAW)

that is the Way to get Darkmode (if not using CCS ) in a App

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Tue Oct 29, 2019 10:33 pm
by andyglezl
Lo encontré !!!
Gracias al Foro y los que colaboran en el.
*----------------------
I found it !!!
Thanks to the Forum and those who collaborate on it.


https://www.hmgforum.com/viewtopic.php? ... tov#p22870

Code: Select all


#include "hmg.ch"

STATIC aColFdo1 := { 000, 023, 052 }, aColFdo2 := { 112 , 128 , 144 }, aColFdo3 := { 140 , 160 , 180 }, aColFte := WHITE

FUNCTION Main()

    DEFINE WINDOW Form_9 AT 0,0 WIDTH 800 HEIGHT 660 TITLE "PRB" CHILD NOSIZE NOMAXIMIZE ; 
			NOMINIMIZE BACKCOLOR aColFdo1
			
        DEFINE WINDOW W_TipWin8 ROW 38 COL -003 WIDTH 806 HEIGHT 580 VIRTUALWIDTH 807 VIRTUALHEIGHT 2400 ;
                WINDOWTYPE PANEL BACKCOLOR aColFdo2 
			
			DEFINE CONTEXT MENU OF W_TipWin8
				MENUITEM "Color" ACTION ChangeBackGround( ThisWindow.Name, { 0 , 200 , 0 }, NIL )
			END MENU
        END WINDOW

    END WINDOW
    CENTER WINDOW   Form_9
    ACTIVATE WINDOW Form_9
RETURN Nil

FUNCTION ChangeBackGround( cWindow, xToChange, hatch)
	Local i := GetFormIndex ( cWindow )
	Local hWnd, oldBrush, Brush

	xToChange := GetColor( { 0 , 0 , 0 }, NIL, .T.)

	hWnd := GetFormHandle (cWindow)
	
	IF IsWindowHandler( hWnd )
		If ValType( xToChange ) = "A"
			If hatch=Nil
				Brush := CreateSolidBrush( xToChange[1], xToChange[2], xToChange[3] )
			Else
				Brush := CreateHatchBrush( hatch, RGB( xToChange[1], xToChange[2], xToChange[3] ) )
			Endif
		Else		 
			Brush := CreatePatternBrush( xToChange )
		Endif
		oldBrush := SetWindowBrush( hWnd, Brush )
		DeleteObject( oldBrush )
		BT_ClientAreaInvalidateAll( cWindow, .T. )
	ENDIF
RETURN NIL

/*
 * C-level
*/
#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC ( ISWINDOWHANDLER )
{
  hb_retl( IsWindow( (HWND) hb_parnl(1) ) );
}

HB_FUNC ( GETWINDOWBRUSH )
{
  hb_retnl( GetClassLong( (HWND) hb_parnl(1), GCL_HBRBACKGROUND ) );
}

HB_FUNC ( SETWINDOWBRUSH )
{
  hb_retnl( SetClassLong( (HWND) hb_parnl(1), GCL_HBRBACKGROUND, (LONG) hb_parnl(2) ) );
}

HB_FUNC ( CREATEHATCHBRUSH )
{
  hb_retnl( (LONG) CreateHatchBrush( hb_parnl(1), (COLORREF) hb_parnl(2) ) );
}

/*
    Windows 95: Creating brushes from bitmaps or DIBs larger than 8x8 pixels is not supported. 
    If a larger bitmap is specified, only a portion of the bitmap is used.
*/
HB_FUNC ( CREATEPATTERNBRUSH )
{
  HBITMAP himage;

  himage = (HBITMAP) LoadImage( GetModuleHandle(NULL), hb_parc(1), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT );
  if (himage == NULL) 
  {
    himage = (HBITMAP) LoadImage( 0, hb_parc(1), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT );
  }

  hb_retnl( (LONG) CreatePatternBrush( himage ) );
}

#pragma ENDDUMP


Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Wed Oct 30, 2019 6:08 am
by mol
Amazing!
But, when I used gradient, sometimes it was lost after switching computer to sleep mode and return.
Try to test it

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Fri Nov 01, 2019 12:26 am
by andyglezl
Hola mol

Hice la prueba de Suspender, Minimizar, Maximizar, "sacar" de la pantalla y en todas,
continua con el color asignado.
*--------------------------------------------------------------------------------------------------------
I did the Suspend, Minimize, Maximize, "take out" screen test and in all,
Continue with the assigned color.

Re: CHANGE BACKCOLOR OF WINDOWS PANEL ???

Posted: Sat Jan 23, 2021 4:33 am
by MICROVOLUTION
Pessoal boa noite!
tenho o interesse de mudar a cor BAKCOLOR e COLOR dos objetos em 2 situações:
- TEMA NORMAL (.F.)
- TEMA MODO ESCURO (.T.)
Então, estou tentando assim:

Code: Select all

DEFINE WINDOW F_UTIL_MENU_HMG AT 5, 5 WIDTH 450 HEIGHT 385 TITLE win_ansitoOem("Menu Utilitários") MODAL BACKCOLOR iif (lTEMA,"DarkGrey","Orange")
EU EXPLICO:
as "DarkGrey" e "Orange" estão definidas no início do .PRG assim:

Code: Select all

#define "DarkGrey", "169 169 169"
#define "OrangeRed4", "139 37 0"
Então, seja como for, não está pegando cor alguma, está tudo vindo como COR PRETA ou nenhuma, aparecendo PRETA.
o comando BACKCOLOR se usar assim:

Code: Select all

BACKCOLOR iif (lTEMA,"DarkGrey","Orange")
não pega a cor. Mas, se usar como abaixo, apenas uma cor, aí funciona:

Code: Select all

BACKCOLOR "DarkGrey"
Eu sei que eu poderia criar uma condição tipo assim:

Code: Select all

if lTEMA
   BkColor := "darkgrey"
else
   BKColor := "orange"
endif
DEFINE WINDOW F_UTIL_MENU_HMG AT 5, 5 WIDTH 450 HEIGHT 385 TITLE win_ansitoOem("Menu Utilitários") MODAL BACKCOLOR bkColor
aí funcionaria, mas, tomará um enorme tempo para modificar o código inteiro. preciso de algo mais prático usando o IIF() ou o IF()
Alguém tem sugestão?