Seite 1 von 1

Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: So, 26. Jul 2020 7:38
von Eugeny Lutsenko
Ich habe alle Grafiken normal gezeichnet, aber nach dem schreiben der Grafik als Datei gibt es einen Stopp. Um weiterzugehen, müssen Sie Esc drücken. Wenn es viele Termine gibt, wird es schwierig. Gibt es eine Möglichkeit, irgendwie zu tun, dass dieser Anschlag nicht stattfindet?

Code: Alles auswählen

   ****** Цикл по будущим сценариям *******************************

   SELECT DrawScen
   DBGOTOP()
   DO WHILE .NOT. EOF()

      PUBLIC X_MaxW := 1800, Y_MaxW := 900           // Размер графического окна для отображения когнитивных диаграмм в пикселях
      PUBLIC nXSize := 1800
      PUBLIC nYSize :=  900
      
      oScr := DC_WaitOn('Немного подождите! Идет формирование изображения в памяти и его масштабирование',,,,,,,,,,,.F.)
      
      // Create new bitmap with given size
      oPS := XBPPRESSPACE() :new() :Create()
      oBMP := XBPBITMAP() :New() :Create()
*     oBMP:Make( nXSize, nYSize, nPlanes, nBits )
      oBMP:Make( nXSize, nYSize )
      oBMP:presSpace( oPS )
      
      // here your GRA* Code 
      
      **** Закрасить фон прямоугольника ***************
*     GraSetColor( oPS, GRA_CLR_WHITE, GRA_CLR_WHITE )
      GraSetColor( oPS, BD_LIGHTGREY, BD_LIGHTGREY )
      GraBox( oPS, { 0, 0 }, { nXSize, nYSize }, GRA_FILL ) 
      
      *########################################################################################################################################
      DrawScenario(oPS, Kod, Name, Kod_Sc, N_PointsScenario, mPar)                                         // Графическая функция <<<===#######
      *########################################################################################################################################
      
      *My image original, my image scaled
      
      DC_Impl(oScr)                                                   

      SELECT DrawScen

      DO CASE
         CASE mPar = 'Cls'

              ****** Запись полноразмерного графического файла в папку: M_PathAppl+"\FutureScenarios\"
              DIRCHANGE(M_PathAppl)                                   // Перейти в папку текущего приложения
              IF FILEDATE("FutureScenarios",16) = CTOD("//")
                 DIRMAKE("FutureScenarios")
                 aMess := {}
                 AADD(aMess, L('В папке текущего приложения: "'+UPPER(ALLTRIM(M_PathAppl))+'"'))
                 AADD(aMess, L('не было директории "FutureScenarios" для будущих сценариев и она была создана!'))
                 AADD(aMess, L('В эту папку записываются исходные изображения высокого качества (без масштабирования)'))
                 LB_Warning(aMess, L('2.1. Классификационные шкалы и градации' ))
              ENDIF
              DIRCHANGE(M_PathAppl+"\FutureScenarios\")                  // Перейти в папку Futurecenarios
              cFileName = 'FutureScen'+'-'+ALLTRIM(STRTRAN(STR(Kod,mNRazr),' ','0'))+'-Splain.jpg'

         CASE mPar = 'Atr'

              ****** Запись полноразмерного графического файла в папку: M_PathAppl+"\PastScenarios\"
              DIRCHANGE(M_PathAppl)                                   // Перейти в папку текущего приложения
              IF FILEDATE("PastScenarios",16) = CTOD("//")
                 DIRMAKE("PastScenarios")
                 aMess := {}
                 AADD(aMess, L('В папке текущего приложения: "'+UPPER(ALLTRIM(M_PathAppl))+'"'))
                 AADD(aMess, L('не было директории "PastScenarios" для прошлых сценариев и она была создана!'))
                 AADD(aMess, L('В эту папку записываются исходные изображения высокого качества (без масштабирования)'))
                 LB_Warning(aMess, L('2.2. Описательные шкалы и градации' ))
              ENDIF
              DIRCHANGE(M_PathAppl+"\PastScenarios\")                  // Перейти в папку Futurecenarios
              cFileName = 'PastScen'+'-'+ALLTRIM(STRTRAN(STR(Kod,mNRazr),' ','0'))+'-Splain.jpg'

      ENDCASE
      
      ERASE(cFileName)
      oBMP:SaveFile(cFileName,XBPBMP_FORMAT_JPG)
      
      IF nWidth > 1800
         FullView( cFileName, "по верху", 65 )                // Визуализация полноразмерного файла на мониторе высокого разрешения
      ELSE
         ****** Формирование с помощью bmp2bmp() и отображение масштабированного изображения
         aNewSize := {nWidth,nHeight-29}                      // Новый размер изображения (еще немного уменьшается, чтобы не рисовать по панели задач)
         oBMP:loadFile(cFileName)                             // Загрузка полноразмерного изображения
         oRet := BMP2BMP(oBMP,aNewSize)                       // Масштабирование изображения
         cFileNameScale = SUBSTR(cFileName,1,AT(".jpg",cFileName)-1)+"_scaled.jpg"
         ERASE(cFileNameScale)
         oRet:saveFile(cFileNameScale,XBPBMP_FORMAT_JPG)      // Запись масштабированного графического файла в в папку приложения для визуализации
         FullView( cFileNameScale, "по верху", 0 )            // Визуализация масштабированного графического файла на мониторе ограниченного разрешения
      
      ENDIF
      DIRCHANGE(M_PathAppl)                                   // Перейти в папку текущего приложения

      SELECT DrawScen
      DBSKIP(1)
   ENDDO

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Mo, 27. Jul 2020 10:05
von ramses
Ich würde einmal die beiden Zeilen:

- oScr := DC_WaitOn(.....
- DC_Impl(oScr)

entfernen und dann Testen.

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Mo, 27. Jul 2020 10:26
von Tom
DC_Waiton() erzeugt einen (unabhängigen) Wartescreen, DC_Implode() löscht ihn wieder, das kann man rausnehmen, aber das ist nicht das Problem. Wenn ich das richtig sehe, wird in der Schleife jeweils zu einem Datensatz eine Bitmap als Datei erzeugt und dann per FullView() angezeigt. Um für alle Datensätze insgesamt eine Bitmap zu erzeugen, müsste man den Code umbauen.

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Mo, 27. Jul 2020 20:12
von Eugeny Lutsenko
Danke für die Hinweise. Ich habe PUBLIC über die Schleife hinausgetragen. Strings oScr: = DC_WaitOn(....), DC_Impl (oScr) machte Kommentare. Immer noch Stoppt nach jeder Zeichnung.

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Mo, 27. Jul 2020 20:23
von ramses
Hast du in deiner Funktion FullView() eine Tastenabfrage eingebaut welche den Stop verursacht?

Du kannst auch mal den Code mit dem Debugger durchgehen dann siehst du genau wo der Stop ist.

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Mo, 27. Jul 2020 21:25
von Eugeny Lutsenko
Nein, das habe ich nicht getan. Ohne die Funktion FullView () weiß ich nicht, wie ich damit umgehen soll. Der Stopp erfolgt nach der Demonstration des erstellten Bildes auf dem Bildschirm. Beenden Sie diesen Zustand nur durch Esc.

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Di, 28. Jul 2020 3:13
von AUGE_OHR
Eugeny Lutsenko hat geschrieben: Mo, 27. Jul 2020 21:25 Nein, das habe ich nicht getan. Ohne die Funktion FullView () weiß ich nicht, wie ich damit umgehen soll. Der Stopp erfolgt nach der Demonstration des erstellten Bildes auf dem Bildschirm. Beenden Sie diesen Zustand nur durch Esc.
in deiner Procedure FullView ist eine Event-Schleife

Code: Alles auswählen

      DO WHILE nEvent != xbeP_Close
         nEvent := APPEVENT( @mp1, @mp2, @oXbp )
         IF nEvent == xbeP_Keyboard .AND. mp1 == xbeK_ESC
            oDlg:destroy()
            EXIT
         ELSE
            oXbp:HandleEvent( nEvent, mp1, mp2 )
         ENDIF
      ENDDO
es dient doch "nur" zur Anzeige eines Bild in "FullScreen-Modus " , oder :?:

einfach ein Static mit maximaler Grösse und das Bitmap mit BMP2BMP anpassen und als o:Caption setzten.
das ganze kann man, im Thread, als Slideshow laufen lassen

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Di, 28. Jul 2020 12:51
von Eugeny Lutsenko
Hey, Jimmy!

Hier ist der Quellcode der FullView-Prozedur (c:\exp20\Samples\Xdemo\ImgView.prg ). Wie ändere ich es so, dass je nach Wert des Parameters nach der Darstellung des Bildes ein Stopp oder kein Stopp angezeigt wird?
/*
* This procedure displays an image file in a separate window
*/
PROCEDURE FullView( cFile )
LOCAL oDlg, oImage, oPS, aSize, aPos

/*
* Only bitmap and meta files are supported
*/
IF cFile <> NIL .AND. ;
( ".BMP" $ Upper( cFile ) .OR. ;
".EMF" $ Upper( cFile ) .OR. ;
".GIF" $ Upper( cFile ) .OR. ;
".JPG" $ Upper( cFile ) .OR. ;
".PNG" $ Upper( cFile ) .OR. ;
".MET" $ Upper( cFile ) )

/*
* Create hidden dialog window
*/
oDlg := XbpDialog():new( AppDesktop(),,,{100,100} )
oDlg:taskList := .F.
oDlg:visible := .F.
oDlg:title := cFile
oDlg:close := {|mp1,mp2,obj| obj:destroy() }
oDlg:create()


/*
* Create a presentation space and connect it with the device
* context of :drawingArea
*/
oPS := XbpPresSpace():new():create( oDlg:drawingArea:winDevice() )

IF ".BMP" $ Upper( cFile ) .OR. ;
".GIF" $ Upper( cFile ) .OR. ;
".JPG" $ Upper( cFile ) .OR. ;
".PNG" $ Upper( cFile )

/*
* File contains a bitmap. Limit the window size to a range
* between 16x16 pixel and the screen resolution
*/
oImage := XbpBitmap():new():create( oPS )
oImage:loadFile( cFile )

aSize := { oImage:xSize, oImage:ySize }
aSize[1] := Max( 16, Min( aSize[1], AppDeskTop():currentSize()[1] ) )
aSize[2] := Max( 16, Min( aSize[2], AppDeskTop():currentSize()[2] ) )
aSize := oDlg:calcFrameRect( {0,0, aSize[1], aSize[2]} )

oDlg:setSize( {aSize[3], aSize[4]} )

/*
* The window must react to xbeP_Paint to redraw the bitmap
*/
oDlg:drawingarea:paint := {|x,y,obj| x:=obj:currentSize(), ;
oImage:draw( oPS, {0, 0, x[1], x[2]}, ;
{0, 0, oImage:xSize, oImage:ySize},,;
GRA_BLT_BBO_IGNORE), Sleep(0.1) }
ELSE
/*
* Display a meta file. It has no size definition for the image
*/
oImage := XbpMetafile():new():create()
oImage:load( cFile )
aSize := { 600, 400 }
oDlg:setSize( aSize )
oDlg:drawingarea:paint := {|| oImage:draw( oPS, XBPMETA_DRAW_SCALE ), Sleep(0.1) }

ENDIF


/*
* Display the window centered on the desktop
*/
aPos:= CenterPos( oDlg:currentSize(), AppDesktop():currentSize() )
oDlg:setPos( aPos )
oDlg:show()
SetAppFocus( oDlg )
ENDIF
RETURN

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Di, 28. Jul 2020 23:59
von AUGE_OHR
hi,
Eugeny Lutsenko hat geschrieben: Di, 28. Jul 2020 12:51 Hier ist der Quellcode der FullView-Prozedur (c:\exp20\Samples\Xdemo\ImgView.prg ).
es ist der Original Code von Alaska aus \Source\samples\apps\ImgView\ImgView.prg den jeder hat
Eugeny Lutsenko hat geschrieben: Wie ändere ich es so, dass je nach Wert des Parameters nach der Darstellung des Bildes ein Stopp oder kein Stopp angezeigt wird?
4 Parameter von AppEvent verwenden und per Parameter ansteuern.

Code: Alles auswählen

PROCEDURE FullView( cFile , nTimeout)
DEFAULT nTimeout TO 0

   nEvent := APPEVENT( @mp1, @mp2, @oXbp, nTimeout )
   DO CASE
      CASE nEvent == xbe_None
            EXIT
      CASE nEvent == xbeP_Keyboard .AND. mp1 == xbeK_ESC
            EXIT   
   OTHERWISE
      oXbp:HandleEvent( nEvent, mp1, mp2 )
   ENDCASE
   oDlg:destroy()
! note : when move Mouse or something else it will start Timeout from begin

Re: Wie kann ich nach dem zeichnen nicht aufhören?

Verfasst: Mi, 29. Jul 2020 12:03
von Eugeny Lutsenko
Ich habe den Code neu erstellt. Vor dem Start der erzeugungsschleife wurde das Bild gefragt, um Sie zu zeigen oder nur zu schreiben? Und wenn nicht angezeigt, dann führe ich einfach nicht die FullView () - Prozedur und alle Fälle aus. Was habe ich mir gedacht? Offensichtlich nicht über das, was es notwendig ist! Vielen Dank, dass Sie den richtigen Weg eingeschlagen haben. Es stellte sich heraus, dass die Wahrheit einfach ist.