Dialoge in Mausnähe öffnen


Auszug aus

faceVALUE-Utils

Version 1.5
17. Juni 1999


2.1.3 Dialoge in Mausnähe öffnen

Autor: Christian Ratsch

Sie können mit der folgenden Routine Dialoge so öffnen, dass sich der Mauszeiger, falls dies möglich ist, genau in der Mitte des Dialoges befindet.

Um Ihr evtl. schon fertiges Programm an diese Routine anzupassen, gehen Sie wie folgt vor:

1. In ihrer RSC-Datei sollte sich ein Voreinstellungen-Dialog befinden, in dem eine Radiobutton-Gruppe platziert ist, mit der man die Position bestimmen kann. Etwa so:

Der erste Radiobutton sollte sinnvollerweise
'DIALPOS' oder ähnlich lauten.

2. Sie müssen auch die Procedure @rsc_set_pos() (in der faceVALUE Extra-Routines-Listbox 'Dialogposition') mit in das Programm einbinden (siehe Wohin mit den Dialogen?).

3. Ersetzen Sie alle handle&=@win_open_dialog(type&,tree&,icfyicon&) durch handle&=@dial_to_mouse(type&,tree&,icfyicon&,PRED(dialpos_var&)), auch in der Fenster-Alert-Routine, den Progress-Routinen und in @handle_keypress() an der Stelle, an der der Dialog fvt_asci& geöffnet wird (ziemlich weit am Ende der Prozedur).

Zur Erläuterung: to_mouse&=0 -> 'wie früher'
  to_mouse&=1 -> Mausposition
  to_mouse&=2 -> immer zentriert


'
REM FVAL_TITLE: Dialog to mousepos
FUNCTION dial_to_mouse(type&,tree&,icon&,to_mouse&)         !call
  LOCAL tree%,x&,y&,w&,h&,x2&,y2&,w2&,h2&,midx&,midy&,titlebar&,menubar&
  LOCAL difx&,dify&,sumx&,sumy&,mx&,my&,dummy&
  '
  ' 10.08.1996 Christian Ratsch V1.2
  '
  ' may only be used with dialogs (not userwindows)
  ' needs @rsc_set_pos() from Holger Herzog
  '
  IF @find_handle_from_tree(tree&)=-1           !window not yet open?
    IF to_mouse&=1
      tree%=@xrsrc_gaddr(0,tree&)
      '
      w&=OB_W(tree%,0)
      h&=OB_H(tree%,0)
      x&=OB_X(tree%,0)
      y&=OB_Y(tree%,0)
      midx&=w&/2
      midy&=h&/2
      ~GRAF_MKSTATE(mx&,my&,dummy&,dummy&)
      difx&=mx&-midx&
      sumx&=mx&+midx&
      dify&=my&-midy&
      sumy&=my&+midy&
      ~WIND_CALC(0,&X1001,x&,y&,w&,h&,x2&,y2&,w2&,h2&)
      titlebar&=h2&-h&
      ~WIND_GET(0,4,dummy&,menubar&,dummy&,dummy&)
      menubar&=PRED(menubar&)
      '
      IF difx&<1
        difx&=1
      ENDIF
      IF dify&<menubar&+titlebar&
        dify&=menubar&+titlebar&
      ENDIF
      IF sumx&>WORK_OUT(0)
        difx&=WORK_OUT(0)-w&
      ENDIF
      IF sumy&>WORK_OUT(1)
       dify&=WORK_OUT(1)-h&
      ENDIF
      @rsc_set_pos(tree&,difx&,dify&)
    ELSE IF to_mouse&=2
      @rsc_set_pos(tree&,0,0)
    ENDIF
  ENDIF
  RETURN @win_open_dialog(type&,tree&,icon&)
ENDFUNC

Legen Sie die Routine einfach in Ihrem DATA\USER\- Verzeichnis ab, damit sie Ihnen immer als EXTRA-Routine zur Verfügung steht.