Your DC_GetWorkArea () function correctly determines the available desktop area based on the taskbar location. I tried to redo the procedure FullView (cFile ) function DC_GetWorkArea(). But it does not display the window in the top position, but in the center of the height, and part of it is obtained on the taskbar. Could you tell me how to change this procedure so that it displays the file in the desktop area.
And more.
To make the file visible, you must move the window to update it. Is it possible to make a refresh directly in this function and not outside it?
It would be good if after displaying the file there was no exit from the procedure before closing the window by the user. This is so that you do not have to stop its execution after the display .
Full debug program below:
Code: Select all
PROCEDURE AppSys
// Рабочий стол остается окном приложения
RETURN
********************************************************************************
FUNCTION Main()
DC_IconDefault(1000)
SET DECIMALS TO 15
SET DATE GERMAN
SET ESCAPE On
// Размеры изображения по X и по Y
* nXSize = 4096
* nYSize = 3072
nXSize = 1920
nYSize = 1080
oScr := DC_WaitOn('Немного подождите! Идет формирование и масштабирование изображения!')
// 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 )
*######################################################################################################################
ArchimSpiral() // Графическая функция <<<===###################################################
*######################################################################################################################
*My image original, my image scaled
ERASE("MyImageOriginal.JPG")
oBMP:saveFile("MyImageOriginal.JPG",XBPBMP_FORMAT_JPG)
* aNewSize := {1366,768} // Новый размер изображения
********* Роджер ***********************
aWorkArea := DC_GetWorkArea()
nWidth := aWorkArea[3] - aWorkArea[1]
nHeight := aWorkArea[4] - aWorkArea[2]
aNewSize := {nWidth,nHeight} // Новый размер изображения
****************************************
oRet = BMP2BMP(oBMP,aNewSize) // Масштабирование изображения
ERASE("MyImageScaled.JPG")
oRet:saveFile("MyImageScaled.JPG",XBPBMP_FORMAT_JPG)
DC_Impl(oScr)
* FullView( "MyImageOriginal.JPG" )
FullView( "MyImageScaled.JPG" )
WAIT
* LB_Warning('Готово!')
CLOSE ALL
RETURN NIL
******************************************************************************************************************
FUNCTION ArchimSpiral()
LOCAL GetList[0], GetOptions, oSay, oDevice
LOCAL aX[100000], aY[100000], aZ[100000] // Координаты X,Y,Z точек облака
ERASE('_ColumnNames.arx');ERASE('_482.txt') // Стереть файлы: _ColumnNames.arx и _482.txt
AFILL(aX,0)
AFILL(aY,0)
AFILL(aZ,0)
***** Задать атрибуты линии
aAttr := Array( GRA_AL_COUNT ) // Массив для атрибутов линии
aAttr [ GRA_AL_TYPE ] := GRA_LINETYPE_DEFAULT
graSetAttrLine( oPS, aAttr )
PointsCount = 1000 // число точек
TurnovCount = 20 // число виктов спирали
u = 360 / PointsCount * TurnovCount // угол между точками
**** Поиск минимальных и максимальных X и Y и нормирование
mMinX = +99999999999
mMaxX = -99999999999
mMinY = +99999999999
mMaxY = -99999999999
i = 0
GradRad := 3.14159265358979323846 / 180 // Коэффициент перевода аргументов тригонометрических функций из градусов в радианы
FOR p=1 TO PointsCount
mX := i * COS( p*u * GradRad )
mY := i * SIN( p*u * GradRad )
i++
mMinX = MIN(mMinX, mX)
mMaxX = MAX(mMaxX, mX)
mMinY = MIN(mMinY, mY)
mMaxY = MAX(mMaxY, mY)
NEXT
***** Расчет позиций для одного по X поля изображения шириной nXSizeAr
***** и двух равных промежутков между ними d и слева и справа от изображений до края окна
X_Max := nXSize
Y_Max := nYSize // Размер графического окна для самого графика в пикселях
IF .NOT. FILE('_XYSize.txt')
* LB_Warning(L('Необходимо запустить режим генерации облака точек!','4.8. Геокогнитивная подсистема "Эйдос"' )
StrFile(STR(nXSize,9)+' '+STR(nYSize,9), '_XYSize.txt') // Запись текстового файла с параметрами nXSize, nYSize
ELSE
* StrFile(STR(nXSize,9)+' '+STR(nYSize,9), '_XYSize.txt') // Запись текстового файла с параметрами nXSize, nYSize
nXSize = VAL(SUBSTR(FileStr('_XYSize.txt'), 1,9)) // Загрузка параметра nXSize из текстового файла
nYSize = VAL(SUBSTR(FileStr('_XYSize.txt'),11,9)) // Загрузка параметра nYSize из текстового файла
ENDIF
dX = (X_Max-0.8*Y_Max)/2
dY = (Y_Max-0.8*Y_Max)/2
i = 0
FOR p=1 TO PointsCount
mX := i * COS( p*u * GradRad )
mY := i * SIN( p*u * GradRad )
mZ := p
i++
aX[i] = 0.8 * Y_Max * ( mX - mMinX) / (mMaxX - mMinX) + dX
aY[i] = Y_Max - 0.8 * Y_Max * ( mY - mMinY) / (mMaxY - mMinY) - dY
aZ[i] = mZ
aAttr [ GRA_AL_COLOR ] := GRA_CLR_RED // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aX[i], aY[i] }, 2 ) // Рисует круг стилем линии
aAttr [ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY // Задать цвет линии
aAttr [ GRA_AL_WIDTH ] := 1 // Задать толщину линии
graSetAttrLine( oPS, aAttr )
GraArc ( oPS, { aX[i], aY[i] }, 3 ) // Рисует круг стилем линии
NEXT
PointsCount = i
***** Создать БД для координат X,Y,Z точек облака
aStructure := { { "Num" , "N", 15, 0 }, ;
{ "pX" , "N", 15, 7 }, ;
{ "pY" , "N", 15, 7 }, ;
{ "pZ" , "N", 15, 7 }, ;
{ "pRed" , "N", 3, 0 }, ;
{ "pGreen", "N", 3, 0 }, ;
{ "pBlue" , "N", 3, 0 } }
DbCreate( 'Points_XYZ', aStructure )
CLose All
USE Points_XYZ EXCLUSIVE NEW
SELECT Points_XYZ
FOR p=1 TO PointsCount
APPEND BLANK
REPLACE Num WITH p
REPLACE pX WITH aX[p]
REPLACE pY WITH aY[p]
REPLACE pZ WITH aZ[p]
NEXT
CLose All
RETURN nil
*******************************************************************
******** Масштбалирование bmp-изображения от Джимми
*******************************************************************
FUNCTION BMP2BMP( oBMP, aXbpSize )
LOCAL oHuge
LOCAL oTiny
LOCAL oPS
LOCAL oRet
LOCAL nBits
LOCAL nPlanes
IF aXbpSize[ 2 ] > 0
oHuge := oBMP
nBits := oBMP:bits
nPlanes := oBMP:planes
oPS := XBPPRESSPACE() :new():Create()
oTiny := XBPBITMAP() :New() :Create()
if nBits > 1 .or. nPlanes > 1
oTiny:Make( aXbpSize[ 1 ], aXbpSize[ 2 ], nPlanes, nBits )
ELSE
oTiny:Make( aXbpSize[ 1 ], aXbpSize[ 2 ] )
ENDIF
oTiny:presSpace( oPS )
oHuge:Draw( oPS, { 0, 0, aXbpSize[1], aXbpSize[2] },,,GRA_BLT_BBO_IGNORE )
oRet := oTiny
ELSE
oRet := oBMP
ENDIF
RETURN oRet
**************************************************************
/*
* This procedure displays an image file in a separate window (xdemo.exe)
*/
**************************************************************
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]} )
********* Роджер ***********************
aWorkArea := DC_GetWorkArea()
nWidth := aWorkArea[3] - aWorkArea[1]
nHeight := aWorkArea[4] - aWorkArea[2]
aNewSize := {nWidth,nHeight} // Новый размер изображения
aSize := oDlg:calcFrameRect( {0,0, aSize[1], aSize[2]} ) // <<<===#######################
oDlg:setSize( {nWidth, nHeight} ) // <<<===#######################
****************************************
/*
* 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
* Refresh, Pause // <<<===#######################
RETURN
******** Display a warning message
******** Может выдавать сообщения элементами массива и без ctitle:
*message := {}
*AADD(message,'1-е сообщение')
*AADD(message,'2-е сообщение')
*AADD(message,'3-е сообщение')
*LB_Warning( message )
FUNCTION LB_Warning( message, ctitle )
LOCAL aMsg := {}
DEFAULT cTitle TO ''
IF valtype(message) # 'A'
aadd(aMsg,message)
ELSE
aMsg := message
ENDIF
IF LEN(ALLTRIM(cTitle)) > 0
DC_MsgBox( ,,aMsg,cTitle)
ELSE
DC_MsgBox( ,,aMsg,'(C) Система "Эйдос"')
ENDIF
RETURN NIL