DLLFUNCTION Parameter "reset" ?

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
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

DLLFUNCTION Parameter "reset" ?

Beitrag von AUGE_OHR »

hi,

ich rufe eine Function mit Parametern auf. Der 3th Parameter dwFlags with aus Konstanten (hex) zusammengesetzt (addieren ?)

Nun funktioniert der 1st Aufruf, aber wenn ich dann die dwFlags ändere scheint er es "in seinem Speicher zu addieren".

Ich habe die ja LOCAL definiert und "erstelle" die jedes mal "neu" ... :-k

Code: Alles auswählen

#define AW_HIDE         0x10000
#define AW_ACTIVATE     0x20000
#define AW_SLIDE        0x40000
#define AW_BLEND        0x80000
#define AW_HOR_POSITIVE 0x00000001
#define AW_HOR_NEGATIVE 0x00000002
#define AW_VER_POSITIVE 0x00000004
#define AW_VER_NEGATIVE 0x00000008
#define AW_CENTER       0x00000010
DLLFUNCTION AnimateWindow(hwnd,dwTime,dwFlags) USING STDCALL FROM USER32.DLL

METHOD AnimateDialog:ShowIt(hwnd)
LOCAL nFlag1 := 0
LOCAL nFlag2 := 0

IF(lHIDE1        = .T., nFlag1 += AW_HIDE        ,NIL)
IF(lACTIVATE1    = .T., nFlag1 += AW_ACTIVATE    ,NIL)
IF(lSLIDE1       = .T., nFlag1 += AW_SLIDE       ,NIL)
IF(lBLEND1       = .T., nFlag1 += AW_BLEND       ,NIL)
IF(lHOR_POS1     = .T., nFlag1 += AW_HOR_POSITIVE,NIL)
IF(lHOR_NEG1     = .T., nFlag1 += AW_HOR_NEGATIVE,NIL)
IF(lVER_POS1     = .T., nFlag1 += AW_VER_POSITIVE,NIL)
IF(lVER_NEG1     = .T., nFlag1 += AW_VER_NEGATIVE,NIL)
IF(lCENTER1      = .T., nFlag1 += AW_CENTER      ,NIL)

IF(lHIDE2        = .T., nFlag2 += AW_HIDE        ,NIL)
IF(lACTIVATE2    = .T., nFlag2 += AW_ACTIVATE    ,NIL)
IF(lSLIDE2       = .T., nFlag2 += AW_SLIDE       ,NIL)
IF(lBLEND2       = .T., nFlag2 += AW_BLEND       ,NIL)
IF(lHOR_POS2     = .T., nFlag2 += AW_HOR_POSITIVE,NIL)
IF(lHOR_NEG2     = .T., nFlag2 += AW_HOR_NEGATIVE,NIL)
IF(lVER_POS2     = .T., nFlag2 += AW_VER_POSITIVE,NIL)
IF(lVER_NEG2     = .T., nFlag2 += AW_VER_NEGATIVE,NIL)
IF(lCENTER2      = .T., nFlag2 += AW_CENTER      ,NIL)

AnimateWindow(hwnd,0,0)
AnimateWindow(hwnd,::nTime1,nFlag1)
*TONE(1234)
AnimateWindow(hwnd,0,0)
AnimateWindow(hwnd,::nTime2,nFlag2)

RETURN self
der "Versuch" mit 0,0 brachte keine "Verbesserung" ... er nimmt immer den "letzten Höchstwert" den man benutzt hat :(

wie kann ich nun dwFlags wieder "reset"ten :?:
Dateianhänge
ANIWIN.ZIP
3th Parameter dwFlags wird nicht "reset"tet ?
(54.86 KiB) 326-mal heruntergeladen
gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: DLLFUNCTION Parameter "reset" ?

Beitrag von Günter Beyes »

Hallo Jimmy,

in der MSDN-Doku für AnimateWindow() http://msdn.microsoft.com/en-us/library ... 85%29.aspx steht
Parameters
hwnd [in] Handle to the window to animate. The calling thread must own this window.
Das heisst, dass unter Xbase++ der Funktionsaufruf nur innerhalb des GUI-Threads funktionieren kann, ähnlich wie die globalen Hotkeys in http://www.xbaseforum.de/viewtopic.php?f=16&t=4078.

Frohe Ostern!
Günter
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: DLLFUNCTION Parameter "reset" ?

Beitrag von AUGE_OHR »

hi,
frohe Ostern wünsche ich euch
Günter Beyes hat geschrieben:Das heisst, dass unter Xbase++ der Funktionsaufruf nur innerhalb des GUI-Threads funktionieren kann, ähnlich wie die globalen Hotkeys in http://www.xbaseforum.de/viewtopic.php?f=16&t=4078.
hm ... ja ... ich habe es mal versucht aber noch ein (gedankliches) Problem.

Ich nutze ein XbpPushbutton um den Effect "auszulösen", was ja auch jetzt schon funktioniert, aber wie mache ich es "ohne" einen XbpPushbutton ?

Code: Alles auswählen

CLASS DlgForm FROM XbpDialog
   METHOD init()
   METHOD create()
   METHOD destroy()
   METHOD ShowIt()
ENDCLASS

METHOD DlgForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self

METHOD DlgForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
LOCAL lOK
   ::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
   setappwindow( self )
   lOK := _Subclass( ::getHWND(), {|a,b,c,d,o|WindowProc1(a,b,c,d,o)}, self )
RETURN self

METHOD DlgForm:destroy()
LOCAL lOK
   lOK := _Unsubclass( ::getHWND() )
   ::XbpDialog:destroy()
RETURN self

METHOD DlgForm:Showit()
LOCAL lOK
LOCAL nFlag1 := 0
LOCAL nFlag2 := 0
   //
   // Flags setzten
   //

   lOK := _Subclass( ::getHWND(), {|a,b,c,d,o|WindowProc1(a,b,c,d,o)}, self )
   AnimateWindow(hwnd,::nTime1,nFlag1)
*  TONE(1234)
   AnimateWindow(hwnd,::nTime2,nFlag2)
   lOK := _Unsubclass( ::getHWND() )
RETURN self

FUNCTION WindowProc1( hwnd, msg, wparam, lparam, oObject )
IF msg = WM_PRINT
   ::showit( hwnd )
   RETURN 0
ENDIF
// call Xbase++'s window procedure
RETURN _CallPrevWindowProc( hwnd, msg, wparam, lparam )
so und wie "löse" ich nun den Event aus ?
Dialog boxes, controls, and common controls already handle WM_PRINTCLIENT.
The default window procedure already handles WM_PRINT.
Frage : entspricht ein WM_PRINT -> xbeP_Paint und WM_PRINTCLIENT -> xbeP_Draw ?
gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: DLLFUNCTION Parameter "reset" ?

Beitrag von Günter Beyes »

Hallo Jimmy,

probier's mal so.
Der :Showit()-Aufruf löst den Effekt aus, indem er via SendMessage() den GUI-Thread veranlasst, die Animation zu starten.

Code: Alles auswählen

#define WM_APP  0x8000

METHOD DlgForm:Showit( nTime, nFlags )
    
   SendMessageA( ::getHWND(), WM_APP+1, nTime, nFlags ) 

   RETURN self
    
FUNCTION WindowProc1( hwnd, msg, wparam, lparam )

   if msg == WM_APP+1
      AnimateWindow( hwnd, wparam, lparam )
      return 0
   endif

RETURN _CallPrevWindowProc( hwnd, msg, wparam, lparam )
Um WM_PRINT und WM_PRINTCLIENT braucht man sich nicht zu kümmern. Mit der Anmerkung will MSDN nur sagen, dass diese implementiert sein müssen, damit es funktioniert.

Gruß,
Günter
Benutzeravatar
Pablo Botella
Rookie
Rookie
Beiträge: 14
Registriert: Do, 18. Dez 2008 20:14
Wohnort: Santiago de Compostela - Spain
Kontaktdaten:

Re: DLLFUNCTION Parameter "reset" ?

Beitrag von Pablo Botella »

Oder das gleiche, aber mit Geschmack ot4xb in 1 Zeile :-)

Code: Alles auswählen

#xtranslate AnimateWindow( [<params,...>] ) => ;
delegated_FpQCall({"user32","AnimateWindow"},"__bo__hw__sl__sl"  [ , <params>] )
delegated_FpQCall () und delegated_Eval () ot4xb funktionen sind äquivalent zu FpQCall () und eval () ausgeführt, aber in den GUI-Thread

Gruß,

Pablo Botella
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: DLLFUNCTION Parameter "reset" ?

Beitrag von AUGE_OHR »

hi,

ich "denke" nun zu verstehen das man nicht "alle" möglichen Kombinationen setzten darf ?

ich habe mir gerade mal die "lates" Xoanon Demo angesehen

Code: Alles auswählen

FUNCTION FadeOut()

  oMain:HideExt(AW_BLEND)
  oMain:ShowExt(AW_BLEND)

RETURN .T.

FUNCTION ChangeStyle()

  DO CASE
  CASE nHideStyle==AW_HOR_POSITIVE .AND. lSlide==.F.
    nHideStyle:=AW_HOR_NEGATIVE
  CASE nHideStyle==AW_HOR_NEGATIVE .AND. lSlide==.F.
    nHideStyle:=AW_VER_POSITIVE
  CASE nHideStyle==AW_VER_POSITIVE .AND. lSlide==.F.
    nHideStyle:=AW_VER_NEGATIVE
  CASE nHideStyle==AW_VER_NEGATIVE .AND. lSlide==.F.
    nHideStyle:=AW_CENTER
  CASE nHideStyle==AW_CENTER .AND. lSlide==.F.
    nHideStyle:=AW_HOR_POSITIVE
    lSlide:=.T.
  CASE nHideStyle==AW_HOR_POSITIVE .AND. lSlide==.T.
    nHideStyle:=AW_HOR_NEGATIVE
  CASE nHideStyle==AW_HOR_NEGATIVE .AND. lSlide==.T.
    nHideStyle:=AW_VER_POSITIVE
  CASE nHideStyle==AW_VER_POSITIVE .AND. lSlide==.T.
    nHideStyle:=AW_VER_NEGATIVE
  CASE nHideStyle==AW_VER_NEGATIVE .AND. lSlide==.T.
    nHideStyle:=AW_CENTER
  CASE nHideStyle==AW_CENTER .AND. lSlide==.T.
    nHideStyle:=AW_HOR_POSITIVE
    lSlide:=.F.
  ENDCASE

RETURN .T.
diese Kombinationen lassen sich "überschreiben" und benötigen kein "reset"
gruss by OHR
Jimmy
Antworten