Форум » GUI » Симуляция разных разрешений экрана » Ответить

Симуляция разных разрешений экрана

Andrey: Всем привет. Замучился запускать Виртуалку для просмотра как работают мои проги под разными разрешениями. У юзеров разные разрешения экрана, даже есть и такое: 768x560 А прогу просто так на виртуалку не запишешь, иногда ещё кучу баз нужно для проверки. А нельзя в MAIN модуле при запуске задать типа: SetDesktopWidth(800) и SetDesktopHeight(600) ? И чтобы потом функции GetDesktopWidth(), GetDesktopHeight(), System.ClientWidth, System.ClientHeight ну и другие связанные с этим возвращали заданное разрешение. Тогда код можно будет не переписывать нигде и тестировать свою прогу будет удобно.

Ответов - 6

gfilatov2002: Andrey пишет: в MAIN модуле при запуске задать Так вроде уже Алексей Густов делал такое: [pre2] // GAL - coefficients for "auto-zooming" local gkoefh := 1, ; gkoefv := 1 local gw // for grid columns width local nRatio := GetDesktopWidth()/GetDesktopHeight() if nRatio == 4/3 gkoefh := GetDesktopWidth()/1024 gkoefv := GetDesktopHeight()/768 elseif nRatio == 1.6 gkoefv := GetDesktopHeight()/850 endif gw := 50*gkoefh ... [/pre2]Рабочий пример см. в папке samples\Applications\SUDOKU

Andrey: gfilatov2002 пишет: Так вроде уже Алексей Густов делал такое: Не то. Так сложно в коде писать и под разные разрешения протестировать программу невозможно. Отправил рабочий пример на почту.

Andrey: Как вариант можно добавить свои функции и работать через них _GetDesktopWidth() и _GetDesktopHeight() но остаётся ещё System.ClientWidth, System.ClientHeight С ними как поступать ?


Andrey: Разобрался с симуляцией разных разрешений экрана, только про самое главное забыл. Про настройку масштаб - количество точек на дюйм. Для WinХР есть такие варианты: 100% Обычный размер (96 точек/дюйм) 125% Крупный размер (120 точек/дюйм) 150% Крупный размер (144 точек/дюйм) 200% Крупный размер (192 точек/дюйм) Для Win7 уже не помню какие, под рукой нет для проверки. Для Win8 оставили только 3 режима: мелкий, средний и крупный. Вопрос такой - а как симулировать размер фонта ? То есть как вычислить размер фонта который будет в системе допустим при масштабе 200% ? У меня есть такие пользователи, который масштаб выставляют 200% И зная этот размер, то можно уже у себя делать типа такого: [pre2] nFontSize := IIF(Large2Fonts(),12,14)[/pre2] Ну и потом смотреть в симуляторе как форма выглядит, если надо, то исправить. Или может не с той стороны подхожу к этой проблеме ?

krutoff: Для Win7 так же: 100% - 96 точек/дюйм, 125% - 120 точек/дюйм, 150% - 144 точек/дюйм. Ну и я делаю практически, как у Густова - форму готовлю для разрешения 1366x768 (к примеру). Затем для других размеров вычисляю коэф. FUNCTION set_aXY() LOCAL aXY := { GetDesktopWidth(), GetDesktopHeight() } // Screen Mode X,Y: 1920,1080 aXY[1] /= 1366; aXY[2] /= 768 IF aXY[1] < 1; aXY[1] := aXY[2] := 1; ENDIF RETURN aXY И еще делаю поправку для DPI (для себя определил на глаз) : Допустим для разрешения <= 1080: 14 - MakeFontSize(), <= 1152: 16 -... и т.д FUNCTION MakeFontSize() LOCAL nI := GETDPIX() RETURN IIF(nI >= 144,4,IIF(nI>=120,2,0)) Затем перед активацией формы запускаю: PROCEDURE ZoomXY(cForm) LOCAL ControlCount, hWnd LOCAL ControlName, ControlType LOCAL nDivw, nDivh, nDivw2, nDivh2, xRow,xCol,xW,xH LOCAL lInvisible := .T. LOCAL nWidth, nHeight LOCAL i,j LOCAL oBrw aXY := Set_aXY() IF aXY[1] <= 1; RETURN; ENDIF IF (i := AScan(_HMG_aFormNames, cForm))==0; RETURN; ENDIF hWnd := _HMG_aFormHandles nWidth := zX(GetWindowWidth(hWnd)); nWidth := MIN(GetDesktopWidth(), nWidth) nHeight:= zY(GetWindowHeight(hWnd)); nHeight:= MIN(GetDesktopHeight()-50, nHeight) IF IsWindowVisible( hWnd ) .AND. ! IsAppXPThemed() HideWindow( hWnd ) ELSE lInvisible := .F. ENDIF SetProperty(cForm,'Width',nWidth) SetProperty(cForm,'Height',nHeight) IF _HMG_aFormVirtualHeight > 0 _HMG_aFormVirtualHeight := INT(_HMG_aFormVirtualHeight * aXY[2]) ENDIF nDivw2 := nDivw := aXY[1] nDivh2 := nDivh := aXY[2] ControlCount := Len( _HMG_aControlHandles ) FOR i := 1 TO ControlCount IF _HMG_aControlParentHandles == hWnd ControlName := _HMG_aControlNames ControlType := _HMG_aControlType IF !Empty( ControlName ) .AND. !( ControlType $ "MENU,HOTKEY,TOOLBAR,MESSAGEBAR,ITEMMESSAGE,TIMER" ) .AND. ; Empty( GetControlContainerHandle( ControlName, cForm ) ) IF ControlType == "RADIOGROUP" _HMG_aControlSpacing := _HMG_aControlSpacing * iif( _HMG_aControlMiscData1 , nDivw, nDivh ) ENDIF DO CASE CASE ControlType $ "PICK" nDivw2 := 1 nDivh2 := 1 CASE "TEXT" $ ControlType .OR. "LABEL" $ ControlType .OR. ControlType $ "GETBOX,SPINNER,HYPERLINK,PROGRESSBAR,COMBO,HOTKEYBOX" nDivw2 := nDivw nDivh2 := nDivh //1 OTHERWISE nDivw2 := nDivw nDivh2 := nDivh ENDCASE xRow := INT(_GetControlRow( ControlName, cForm ) * nDivh) xCol := INT(_GetControlCol( ControlName, cForm ) * nDivw) xW := INT(_GetControlWidth( ControlName, cForm ) * nDivw2) xH := INT(_GetControlHeight( ControlName, cForm ) * nDivh2) _SetControlSizePos( ControlName, cForm, xRow,xCol,xW,xH) IF ControlType == "TBROWSE" oBrw := _HMG_aControlIds FOR j := 1 TO LEN(oBrw:aColumns) oBrw:aColumns[j]:nWidth := INT(oBrw:aColumns[j]:nWidth * aXY[1]) NEXT j oBrw:nHeightHead := INT(oBrw:nHeightHead * aXY[2]) IF oBrw:lIsDbf oBrw:UpStable() ELSE oBrw:Refresh( .T. ) oBrw:DrawSelect() ENDIF ENDIF ENDIF ENDIF NEXT i IF lInvisible ShowWindow( hWnd ) ENDIF RETURN Только TBrowse пока не поборол - отдельно потом ормирую иначе при редактировании ячейка улетает вверх почему-то. Пока так.

Andrey: Вот для просмотра как будет выглядеть форма на разных разрешениях экрана я и сделал с помощью Сергея вот такую программу Desktop Simulator http://www.hmgextended.com/helpful-application/



полная версия страницы