ActiveX und Vista

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ActiveX und Vista

Beitrag von AUGE_OHR »

Teil 2

Code: Alles auswählen

FUNCTION SetWindowLayered(hWnd,lActive)
also da waren wir ja stehen geblieben. woher ich das habe :
hier aus diesem Forum :) Thema "transparente Fenster"

es geht also darum das man "irgendwie" M$ "Bausteine" in ihrer Optik
verändern kann, was bei Xbase++ nicht für ALLE XbParts gilt. Es
heisst dann nur "geht nicht weil M$ Windows" ...

so nun wieder VB Code

Code: Alles auswählen

Private Sub Form_Initialize()
Call InitCommonControls

Const WM_USER = &H400
Const GWL_STYLE = (-16)
Const PBM_SETMARQUEE = WM_USER + 10

 mlSetStyle = GetWindowLong(ProgressBar1.hwnd, GWL_STYLE)
 mlSetStyle = mlSetStyle Or PBM_SETMARQUEE
 mlSetStyle = SetWindowLong(ProgressBar1.hwnd, GWL_STYLE, mlSetStyle)

End Sub

Private Sub Timer1_Timer()
ProgressBar1.Value = op
ProgressBar2.Value = op
op = op + 1
If op > ProgressBar1.Max Then op = 0
End Sub
sieht ja wieder ganz einfach aus, aber was macht die VB Zeile

Code: Alles auswählen

 mlSetStyle = mlSetStyle Or PBM_SETMARQUEE
ich hab nun mal angefangen mit

Code: Alles auswählen

   hwndPB := oProgress:hWnd
   mlSetStyle := GetWindowLongA(hwndPB, GWL_STYLE)
   mlSetStyle := BOR(mlSetStyle, PBM_SETMARQUEE )
   mlSetStyle := SetWindowLongA(hwndPB, GWL_STYLE, mlSetStyle)
leider bringt das nichts :(
ist das BOR() da richtig so ?

Code: Alles auswählen

SetWindowLong(hProgressBar, GWL_STYLE, GetWindowLong(hProgressBar, GWL_STYLE) OR PBS_MARQUEE)
hier nochmal das OR

...

also der nächste Google Treffer :

Code: Alles auswählen

hi got it working :)

Modified the code
// done at the top of the file 
#define PBS_MARQUEE  0x08 
#define PBM_SETMARQUEE WM_USER + 10 
 
SetWindowLongPtr(hProgressBar,GWL_STYLE,PBS_MARQUEE); 
SendMessage(hProgressBar,(UINT) PBM_SETMARQUEE,(WPARAM) TRUE,(LPARAM)50 );   
und das taucht wieder die SetWindowLongPtr() Function auf ... also jetzt doch mal bei M$ sehen

Code: Alles auswählen

LONG_PTR SetWindowLongPtr(      
    HWND hWnd,
    int nIndex,
    LONG_PTR dwNewLong
);

Xbase++
DLLFUNCTION SetWindowLongPtr(nHWnd,nIndex,dwNewLong) USING STDCALL FROM USER32.DLL
nur leider gibt es wohl kein SetWindowLongPtr(), auch nicht mit "A" oder "W", auf meinem PC ...

...
Stunden später :
Send the PBM_SETMARQUEE message to start or stop the animation.
Note You must set the control style to PBS_MARQUEE before attempting to start the animation.
Note This message requires ComCtl32.dll version 6.00 or later.
äh, em ... und ich habe die ganze Zeit unter XP auf die 5.82 gearbeitet ...

also noch mal die Brüllkiste mit VISTA anschalten und die Sample auf dem VISTA PC probieren.
...
ne das bringt es auch nicht. Kein Unterschied unter VISTA und kein Effekt ...
sobald ich

Code: Alles auswählen

SetWindowLongA(hwndPB, GWL_STYLE, PBS_*** )
setze "verschwindet" der Progressbar :(

An der Stelle hab ich nun vorgestern Nacht frustriert aufgegeben ... unwissend das ich kurz vor
dem Ziel war ...

Ende Teil 2
Fortsetzung folgt
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ActiveX und Vista

Beitrag von AUGE_OHR »

Teil 3 von 4

hi,

eigentlich hab ich die Lösung zwischendurch ja schon verraten, aber schön der Reihe nach.

Kurz vorm Ziel hab ich nun gestern schlapp gemacht, aber nun geht es weiter. Zwischendurch
hab ich Post von Hannes bekommen der das ganze mit Yukon macht und ER hatte den Effect !?
Nun arbeitet Yukon ja mit der Comctl32.dll während wir mit Comctl32.ocx über die activeX
Schnittstelle arbeiten. Die Comctl32.* Dateien sind bei mir unter XP 5.82.2900.xxxx und unter
VISTA hat die Comctl32.DLL Dateiversion 5.82.6000.xxx und als Produktversion 6.0.6000.xxx .
(unter VISTA gibt es kein C:\WINDOWS\system32\comctl32.ocx ! dazu später mehr )

Also Hannes hat es mit der v5.x unter XP geschafft ... hm ... und dann den Marquee Effect
den ich noch nie vorher unter XP gesehen habe ...

Wenn Hannes es also mit der V5.x macht, muss ich es auch mit der v5.x versuchen nur was
fehlt den noch bei mir ?

ein weiterer Google Treffer :
http://www.sweetpotatosoftware.com/SPSB ... 8549a.aspx
Progressbar Control, Version 5.0 SP2)
ja das haben wir begriffen
Styles Via SetWindowLong
...
#Define GWL_STYLE -16
hm das kommt mir doch bekannt vor ... ? wo hab ich gestern Nacht aufgehört ...

Code: Alles auswählen

FUNCTION SetWindowLayered(hWnd,lActive)
LOCAL lExStyle := GetWindowLongA(hWnd,GWL_EXSTYLE)
   SetDefault(lActive,.T.)
   IF lActive
      IF !(lExStyle $ WS_EX_LAYERED)
         lExStyle := lExStyle+WS_EX_LAYERED
         SetWindowLongA(hWnd,GWL_EXSTYLE,lExStyle)
      ENDIF
   ELSE
      IF (lExStyle $ WS_EX_LAYERED)
         lExStyle -= WS_EX_LAYERED
         SetWindowLongA(hWnd,GWL_EXSTYLE,lExStyle)
      ENDIF
   ENDIF
RETURN (NIL)
da habe wir doch unser SetWindowLong() mit "A" :)
ok statt GWL_STYLE haben wir GWL_EXSTYLE aber irgendwie hat das doch damit zu tun.
#Define WS_VISIBLE 0x10000000
#Define WS_CHILD 0x40000000
eigentlich nichts besonderes

Code: Alles auswählen

m.lnStyle = Bitor(WS_CHILD, WS_VISIBLE, PBS_VERTICAL)
m.lnReturn = SetWindowLong(This.oleProgress.Object.HWnd, GWL_STYLE, m.lnStyle)
aber da kommen die beiden Konstanten wieder vor und ich habe wieder was mit OR

hm ... nächster Xbase++ Versuch

Code: Alles auswählen

//
// handle des Progressbar
//
hwndPB := oProgress:hWnd
//
// hole den Style des handle
//
mlSetStyle := GetWindowLongA(hwndPB, GWL_STYLE)
//
// so wird der MarQuee Effect zusammengesetzt
//
mlSetStyle := BOr(WS_CHILD,WS_VISIBLE,PBS_MARQUEE )
//
// und nun wird der Style auf das handle gesetzt
//
mlSetStyle := SetWindowLongA(hwndPB, GWL_STYLE, mlSetStyle)
//
// jetzt "senden" wir dem handle den Event PBM_SETMARQUEE
// 1 = true
// 100 = Anzeigezeit in Millisekunden
SendMessageA(hwndPB, PBM_SETMARQUEE , 1, 100)
//
// und so können wir jede beliebige RGB Farbe setzten
// (wenn es die :StyleClass zulässt)
SendMessageA(hwndPB, PBM_SETBARCOLOR, 0,;
   AutomationTranslateColor( GraMakeRGBColor({153,255,153}),.F.) )

PROCEDURE ProgressThreadFunc( oProgress,oProz,oStatic )
//
// das sorgt für "Bewegung" in der Fortschrittsanzeige
//
SendMessageA(hwndPB, PBM_SETSTEP   , 1,   0)
JAJAJA :wav: :wav:
Ich habe den Marquee als "Effekt"

und nun kommt der Gag : Ich habe es mit den Common Control v5.x SP2 unter XP gemacht !!!
... aber die "Farbe" und "Form" stimmen noch nicht.

ja gut, wenn wir das mit der v5.x machen können kann ich ja auch wieder mit :StyleClass und
:StylePart arbeiten ... oder ... :) ... JA !!!

Zwischenbilanz : Ich habe den Marquee Effect, kann "visual Style" setzten und Farben ( nicht
bei allen :StyleClass möglich ) und sogar einen "Regenbogen" (alle RGB Farben) in den Progressbar
einbauen. Durch die Kombination mit :StyleClass sind also "hunderte" von verschiedenen Anzeigen
möglich ... ja man könnte auch noch während der Balken läuft, so wie beim "Regenbogen", die
:StyleClass / :StylePart wechseln und und und.

und unter VISTA ?
Fortsetzung folgt ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ActiveX und Vista

Beitrag von AUGE_OHR »

Teil 4/4 : wo geht was ?

Nachdem ich nun die Bausteine unter XP zusammen habe ging es auf die VISTA Brüllkiste.
Dort gibt es nun kein C:\WINDOWS\system32\comctl32.ocx !

Also unter VISTA erstmal mit der v6.x
a.) "pure" -> Neu v6.x : auch vertikal und XBPPRGR_STYLE_SMOOTH
b.) mit :StyleClass und :StylePart, keine Wirkung
c.) Farbe des Balken ändern mit SendMessageA() : wenigstens das funktioniert !
d.) Marquee ... vergiss es

tja das war wohl nichts :(

also doch die v5.x ... aber wie wenn VISTA kein Comctl32.ocx hat ?

Nachdem ich ja "zu feige" war es zu installieren hab ich mich nach Jan´s Tip doch getraut und
einfach die Comctl32.ocx (5.82.2900.xxxx) vom XP Rechner genommen und wollte die in das
VISTA Verzeichnis C:\WINDOWS\system32\ kopieren ... Error ... hm ... Rechte ?

... aber ich bin doch als (Co)Administrator unterwegs ?

... irgendwann hatte ich die dann doch ins \System32 Verzeichnis geschaufelt und wollte die
mit "C:\WINDOWS\system32\regsvr32.exe comctl32.ocx" registrieren und schon wieder Error

Also am besten geht man gleich so vor :
VISTA - Startbutton
CMD eintippen und in der "Liste" erschein es dann
mit der linken Maustaste auf das Icon in der Liste
dann rechte Maustaste und "run as Administrator"

nun öffnet er die CMD Box.
copy X:\comctl32.ocx C:\WINDOWS\system32\
C:\WINDOWS\system32\regsvr32.exe comctl32.ocx

beides sollte jetzt ohne Probleme gegangen sein.

wer nun gar kein XP Rechner zur Hand hat möge bei M$ Download mal : KB896559
eingeben und es downloaden.

...

nun also nochmal mit der v5.x :
a.) "nackt ohne was" ... ich glaube es ja nicht grün und Marquee Effect mit Transparenz ... ey boh wow !!!
b.) mit :StyleClass und :StylePart : funktioniert (auch wenn man nicht alle "sieht"), aber kein
Marquee Effect ausser bei :StyleClass := "Progress" ... ist der Marquee Effect "im" grünen Balken
"eingebaut" ?
c.) Farbe des Balken ändern mit SendMessageA() : JA z.b. :StyleClass := "Page"
d.) Marquee ... JA z.b. :StyleClass := "Page" (bei viele anderen sieht man nur einen dünnen
Strich)

Schlusswort :
VISTA hat zwar alles v6.x Version, aber intern arbeitet VISTA wohl auch mit der v5.82.6000.xxxx
Version z.b. grüner Progressbar. Wenn wir also den grünen Progressbar unter VISTA haben wollen
müssen wir also auch die v5.82 Version ansprechen.

Da es unter VISTA aber die C:\WINDOWS\system32\comctl32.ocx nicht gibt und es "nicht so
einfach" ist die dort zu aktivieren, muss Alaska uns da wohl noch was "nachliefern" wobei ich nicht
nur einen "Installer" meine.

In der SL1 ist ja nun "Visual Style" dazugekommen und das geht auch intern über die v5.82, also
warum müssen wir für die Common Controls überhaupt die activeX Schnittstelle benutzen und
können nicht einfach die interne v5.x benutzen ?

Unter VISTA scheint die SL1 nun, was die "visual Styles" angeht, auf die v6.x zu setzten oder
aber unterstützt v5.x nicht ... kein oranger Balken auf der Tabpage warum ?
... wie wäre denn ein UseAllwaysV5 := .T.

Mit C:\Alaska\XPPW32\source\SYS\axctrls.prg hat Alaska einen Anfang gemacht und uns den
Xbase++ Source zu XbpStatusbar() und XbpToolbar() geliefert ... und was ist mit dem Rest ?

Warum also stellt uns Alaska nicht "einfach" ihre interne Common Control Class zur Verfügung ?
Liegt es vielleicht daran das "nicht alle Controls", als XbPart vorliegen ? ...

zur Demo :
wenn man den Marquee angefordert hat bleibt der Effect obwohl man in der Checkbox das Kreuz
rausgenommen hat. Workaround : rausnehmen und auf v6.x umschalten und mal starten und
dann zur v5 zurück.

Color & Marquee passen manchmal nicht und verhindern den Marquee Effekt

Color / Styles : manchmal muss man es 2x starten

Styles : funktionieren IMHO nur mit der v5.x

"ausgegraute" Element funktionieren IHMO nicht mit dem OS() oder der gewählten Version.

viel Spass nun beim zusammenstellen "eures" Progressbar
Dateianhänge
PB56DEMO.ZIP
Demo Progressbar Marquee Effekt, Styles
!!! NEED Comctl32.ocx v5.82.xxx AND
MSCOMCTL.OCX v6.x !!!
(15.77 KiB) 225-mal heruntergeladen
VISTA Progressbar Grün
VISTA Progressbar Grün
V5Normal.jpg (54.97 KiB) 3123 mal betrachtet
Zuletzt geändert von AUGE_OHR am Sa, 20. Sep 2008 10:29, insgesamt 2-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ActiveX und Vista

Beitrag von Jan »

Moin Jimmy,

vielen Dank für die zeitintensiven Ausprobierereien und Nachforschungen. Ich hatte da ja während meines Urlaubes auch einige Tage reininvestiert, so weit bin ich aber nicht gekommen.

Aber ein paar Anmerkungen dazu:
Jimmy hat geschrieben:Unter VISTA scheint die SL1 nun, was die "visual Styles" angeht, auf die v6.x zu setzten oder
aber unterstützt v5.x nicht ... kein oranger Balken auf der Tabpage warum ?
... wie wäre denn ein UseAllwaysV5 := .T.
Ja, das war mir auch aufgefallen. Hatte erst noch Alaska blöd angemacht, weil ich die Schuld bei denen gesucht hatte. Aber: Wenn Vista eben keine orangen Tab-Balken hat, warum soll dann ein Xbase++-Programm das anbieten? Das doch "nur" die Themes nutzen soll? Ich denke was Du da machen willst, gehört dann eher in den Bereich OwnerDrawing.
Jimmy hat geschrieben:Nachdem ich ja "zu feige" war es zu installieren hab ich mich nach Jan´s Tip doch getraut und
einfach die Comctl32.ocx (5.82.2900.xxxx) vom XP Rechner genommen und wollte die in das
VISTA Verzeichnis C:\WINDOWS\system32\ kopieren ... Error ... hm ... Rechte ?

... aber ich bin doch als (Co)Administrator unterwegs ?

... irgendwann hatte ich die dann doch ins \System32 Verzeichnis geschaufelt und wollte die
mit "C:\WINDOWS\system32\regsvr32.exe comctl32.ocx" registrieren und schon wieder Error

Also am besten geht man gleich so vor :
VISTA - Startbutton
CMD eintippen und in der "Liste" erschein es dann
mit der linken Maustaste auf das Icon in der Liste
dann rechte Maustaste und "run as Administrator"

nun öffnet er die CMD Box.
copy X:\comctl32.ocx C:\WINDOWS\system32\
C:\WINDOWS\system32\regsvr32.exe comctl32.ocx

beides sollte jetzt ohne Probleme gegangen sein.
Ich hab das zwar damals anders gemacht, aber so wie Du das beschreibst müsste das meiner Meinung auch gehen. Aber: Von meinen Kunden kann ich ja schlecht erwarten, daß die das alle machen. Hast Du mal ausprobiert, ob das z. B. auch mit dem InnoSetup geht? Oder ob der da mangels Rechten vor die Wand fährt?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ActiveX und Vista

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: Aber: Von meinen Kunden kann ich ja schlecht erwarten, daß die das alle machen.

Hast Du mal ausprobiert, ob das z. B. auch mit dem InnoSetup geht? Oder ob der da mangels
Rechten vor die Wand fährt?
http://support.microsoft.com/kb/173091
zeigt wie man per DLL es machen könnte ...

was VISTA angeht "spiele" ich ungern mit der Kiste ... zu viele Unbekannten und Beschränkungen
wodurch viele "Werkzeuge" nicht funktionieren ... :(

auch bei der Registry, wo ja etwas registriert werden soll, hab ich unter VISTA das Gefühl das
ich nicht "an alles" rankomme was unter XP funktionierte ...
Jan hat geschrieben: ... wie wäre denn ein UseAllwaysV5 := .T.

Ja, das war mir auch aufgefallen. Hatte erst noch Alaska blöd angemacht, weil ich die Schuld bei denen gesucht hatte. Aber: Wenn Vista eben keine orangen Tab-Balken hat, warum soll dann ein Xbase++-Programm das anbieten? Das doch "nur" die Themes nutzen soll? Ich denke was Du da machen willst, gehört dann eher in den Bereich OwnerDrawing.
Nein das meine ich anders : Der grüne Balken wird doch von der v5.82.xxxx unter VISTA erzeugt.
Wenn man die Comctl32.ocx unter VISTA fährt können wir ja mit "visual Style" arbeiten.

Die SL1 arbeitet aber IMHO nicht über das *.OCX damit wir :StyleClass / :StylePart benutzen
können sondern wohl, wie Yukon, direkt auf die Comctl32.dll die es ja auch unter VISTA gibt.

... das "look & feeling" unter VISTA ist nun v.6x, aber der grüne Progressbar ist ein FAKE weil
ja eigendlich v5.82.xxxx

Leider lässt uns Alaska "nicht die Wahl" ob wir nun VISTA "konform" oder nicht arbeiten wollen.

Warum soll ich, unter VISTA, nicht meinen orangen Leuchtbalken auf einen Tab der Tabpage
setzten (vorausgesetzt das Theme hat einen solchen Style / Part als Resource ) ? Was VISTA
mit dem FAKE machen kann das darf ich ja wohl dann auch !

Warum läst uns Alaska nicht die Wahl das es weiterhin so aussieht die mit der v1.9.331 ?

ich habe ja schon aufgerufen zum voten für UseVisualStyle := .F. als default.
Wer will kann es ja dann auf .T. setzten (bei dem Part den man möchte) und genau das selbe
denke ich von nun von UseAllwaysV5 := .T.
gruss by OHR
Jimmy
Antworten