Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Оптимизация программы под различные разрешения экр


Автор: Rostik Ultra 1.1.2005, 03:21
Подскажите программные средства оптимизации интерфейса под экранные разрешения меньше 1024х768 ( чтобы ничё не вылазило ) smile

Автор: Naghual 1.1.2005, 20:52
Ты сам то свой вопрос понял?
Вот попробуй, не зная о чем речь, ответь на свой собственный вопрос.

Автор: Vach 1.1.2005, 23:47
Обрабатывай все контролы ручками, в событии Form_Resize. Поищи контрол "Resize Splitter".

Автор: Гость_Rostik Ultra 2.1.2005, 01:58
Цитата(Vach @ 1.1.2005, 23:47)
Обрабатывай все контролы ручками, в событии Form_Resize. Поищи контрол "Resize Splitter".

Мне плз API аналог контрола Resize Splitter smile

Автор: Vach 2.1.2005, 02:13
Тебе такую API команду? Тут помочь ничем нельзя! smile

Автор: Rostik Ultra 2.1.2005, 04:58
Vach А как сделать чтобы оно само smile (без ручек )

Автор: Vach 2.1.2005, 05:17
smile Не получется. Даже с использованием всяческих сплитеров, всёравно приходится чтото докручивать.
И как это "оно само"? что само? куда надо? как надо? сверстается как HTML?

Автор: Rostik Ultra 3.1.2005, 02:41
Цитата(Vach @ 2.1.2005, 05:17)
smile Не получется. Даже с использованием всяческих сплитеров, всёравно приходится чтото докручивать.
И как это "оно само"? что само? куда надо? как надо? сверстается как HTML?

А это я в правильном направлении мыслю smile

Frame1.Left = Form1.Width * 240 / 15360 ( типа пропорциональная позиция контролов относительно размеров формы ) ( 15360 - ширина развёрнутой формы при 1024х768 )

ЗЫ : Как кстати програмно определить разрешение экрана smile

Автор: Vach 3.1.2005, 03:14
Чего ты хочешь добиться, я так и не понял?
Код что ты привел, может иметь право на существование
если известна система измерения (ScaleMode) (а это зачем "240 / 15360")
Что за форма такая, где всё расползается пропорционально?
Зачем это всё привязывать моде экрана?
А если человеку просто кусочек десктопа захочется увидеть?

Автор: Rostik Ultra 3.1.2005, 06:57
Цитата(Vach @ 3.1.2005, 03:14)
Чего ты хочешь добиться, я так и не понял?
Код что ты привел, может иметь право на существование
если известна система измерения (ScaleMode) (а это зачем "240 / 15360")
Что за форма такая, где всё расползается пропорционально?
Зачем это всё привязывать моде экрана?
А если человеку просто кусочек десктопа захочется увидеть?

Я хочу чтобы например при разрешении экрана 800х600 точек все элементы интерфейса оставались в пределах экрана ИЛИ при разрешении больше чем 1024х768 эти самые элементы нормально были распределены по форме , а не жались в верхнем левом углу .

Ну типа если шаришь подскажи как , а то меня как то не вставляет что процентов 40 людей не смогут по достоинству оценить мою программу smile

Автор: Naghual 3.1.2005, 13:44
Цитата
Ну типа если шаришь подскажи как , а то меня как то не вставляет что процентов 40 людей не смогут по достоинству оценить мою программу  smile


Смех и только!

Автор: cardinal 3.1.2005, 23:01
Rostik Ultra, ну сделай ты форму неизменяемой в размере и подгони расположения кнопок под разные разрешения экрана. При Form_Load будешь смотреть какое разрешение установлено и раскидывать элементы по форме как хочешь...

Автор: Rostik Ultra 4.1.2005, 06:13
Naghual Потрудись объяснить чё смешного smile smile smile smile smile
Добавлено @ 06:15
Цитата(cardinal @ 3.1.2005, 23:01)
Rostik Ultra, ну сделай ты форму неизменяемой в размере и подгони расположения кнопок под разные разрешения экрана. При Form_Load будешь смотреть какое разрешение установлено и раскидывать элементы по форме как хочешь...

У меня с самого начала форма была неизменяемой в размерах ( и не двигается )

Расскажи тогда как програмно определять разрешение экрана smile

Автор: cardinal 4.1.2005, 17:05
http://forum.vingrad.ru/index.php?showtopic=888

Автор: Rostik Ultra 5.1.2005, 03:29
Цитата(cardinal @ 4.1.2005, 17:05)
http://forum.vingrad.ru/index.php?showtopic=888

Та спасибо , я тогда сам как нибудь smile

ЗЫ : надо придумать универсальный алгоритм подгона размеров без всяких 2-х 3-х и тем более 10-х форм
Добавлено @ 03:39
Цитата(cardinal @ 4.1.2005, 17:05)
http://forum.vingrad.ru/index.php?showtopic=888

Вот , нарыл на другом форуме

wid = Screen.Width \ Screen.TwipsPerPixelX
hgt = Screen.Height \ Screen.TwipsPerPixelY


Автор: Gannibal 5.1.2005, 10:29
Код

Private frmForm As Form
Private ctrlHeight As Integer
Private ctrlWidth As Integer
Private frmScaleHeight As Integer
Private frmScaleWidth As Integer
Private ctrlControls As New Collection
Private ctrlTopCollection As New Collection
Private ctrlLeftCollection As New Collection

Public Sub SendForm(frm As Object, ScaleHeight As Integer, ScaleWidth As Integer)
   Set frmForm = frm
   frmScaleHeight = ScaleHeight
   frmScaleWidth = ScaleWidth
End Sub

Public Sub SendControl(Ctrl As Control, Optional Top As Variant, Optional left As Variant)
   'Adding the control in the Controls Collection
   ctrlControls.Add Ctrl
   
   If IsMissing(Top) Then
       ctrlTopCollection.Add -1
   Else
       ctrlTopCollection.Add Top
   End If
   
   If IsMissing(left) Then
       ctrlLeftCollection.Add -1
   Else
       ctrlLeftCollection.Add left
   End If
   
End Sub

Public Sub ResizeControls()
Dim cnt As Integer
   For cnt = 1 To ctrlControls.Count
       If ctrlTopCollection.Item(cnt) >= 0 Then
           Call ChangeHeight(ctrlControls.Item(cnt), ctrlTopCollection.Item(cnt))
       End If
       If ctrlLeftCollection.Item(cnt) >= 0 Then
           Call ChangeWidth(ctrlControls.Item(cnt), ctrlLeftCollection.Item(cnt))
       End If
   Next cnt
End Sub

Private Sub ChangeHeight(ctrlControl As Control, ctrlTop As Integer)
Dim Ctrl As Control
   ctrlHeight = frmScaleHeight - ctrlTop - 100
   For Each Ctrl In frmForm.Controls
       If Ctrl Is ctrlControl Then
           Ctrl.Height = ctrlHeight
       End If
   Next
End Sub

Private Sub ChangeWidth(ctrlControl As Control, ctrlLeft As Integer)
Dim Ctrl As Control
   ctrlWidth = frmScaleWidth - ctrlLeft - 100
   For Each Ctrl In frmForm.Controls
       If Ctrl Is ctrlControl Then
           Ctrl.Width = ctrlWidth
       End If
   Next
End Sub

Автор: Rostik Ultra 9.1.2005, 04:33
Цитата(cardinal @ 3.1.2005, 23:01)
Rostik Ultra, ну сделай ты форму неизменяемой в размере и подгони расположения кнопок под разные разрешения экрана. При Form_Load будешь смотреть какое разрешение установлено и раскидывать элементы по форме как хочешь...

http://forum.vingrad.ru/index.php?showtopic=888

Это cardinal не правильно

Причины :
- нужно создать много форм под разные разрешения экрана => увеличение размера проги
- этот метод не позволяет обработать экзотические разрешения , о которых даже и не знал , но которые обязательно есть на всяких там сверхсовременных мониторах

Использование контролов тоже не подойдёт ( если у кого-то его не окажется , то прога не пойдёт)

Вот как я енто решил :

Код

Dim ew as Integer , eh as Integer

    ew = (Screen.Width \ Screen.TwipsPerPixelX) / 1024 ' определяем "коэффициент горизонтальноего разрешения" исходя из разрешения в котором создавалясь прога

    eh = (Screen.Height \ Screen.TwipsPerPixelY) / 768 ' определяем "коэффициент вертикального разрешения"

         Text1.Left = 4080 * ew
         Text1.Top = 4920 * eh
         Text1.Width = 7200 * ew
              Label18.Left = 6745 * ew
              Label18.Top = 4560 * eh
' и т.д. для других элементов



Я провеоил свою прогу у себя : всё круто помещается , даже при 800*600

А потом ещё у знакомого ( у него крутой такой , узкий монитор ) - ещё 12 разных разрешений
И в результате всё круто поместилось как было задумано smile

Автор: Rostik Ultra 9.1.2005, 06:26
Кстати как программно отследить изменение разрешения экрана ( Boolean )

Автор: Gannibal 9.1.2005, 12:08
может быт вот так вот можно? smile

Код

Option Explicit
Const WM_DISPLAYCHANGE = &H7E
Const HWND_BROADCAST = &HFFFF&
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1
Const BITSPIXEL = 12
Private Type DEVMODE
   dmDeviceName As String * CCDEVICENAME
   dmSpecVersion As Integer
   dmDriverVersion As Integer
   dmSize As Integer
   dmDriverExtra As Integer
   dmFields As Long
   dmOrientation As Integer
   dmPaperSize As Integer
   dmPaperLength As Integer
   dmPaperWidth As Integer
   dmScale As Integer
   dmCopies As Integer
   dmDefaultSource As Integer
   dmPrintQuality As Integer
   dmColor As Integer
   dmDuplex As Integer
   dmYResolution As Integer
   dmTTOption As Integer
   dmCollate As Integer
   dmFormName As String * CCFORMNAME
   dmUnusedPadding As Integer
   dmBitsPerPel As Integer
   dmPelsWidth As Long
   dmPelsHeight As Long
   dmDisplayFlags As Long
   dmDisplayFrequency As Long
End Type
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As Any) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Dim OldX As Long, OldY As Long, nDC As Long
Sub ChangeRes(X As Long, Y As Long, Bits As Long)
   Dim DevM As DEVMODE, ScInfo As Long, erg As Long, an As VbMsgBoxResult
   'Get the info into DevM
   erg = EnumDisplaySettings(0&, 0&, DevM)
   'This is what we're going to change
   DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
   DevM.dmPelsWidth = X 'ScreenWidth
   DevM.dmPelsHeight = Y 'ScreenHeight
   DevM.dmBitsPerPel = Bits '(can be 8, 16, 24, 32 or even 4)
   'Now change the display and check if possible
   erg = ChangeDisplaySettings(DevM, CDS_TEST)
   'Check if succesfull
   Select Case erg&
       Case DISP_CHANGE_RESTART
           an = MsgBox("You've to reboot", vbYesNo + vbSystemModal, "Info")
           If an = vbYes Then
               erg& = ExitWindowsEx(EWX_REBOOT, 0&)
           End If
       Case DISP_CHANGE_SUCCESSFUL
           erg = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
           ScInfo = Y * 2 ^ 16 + X
           'Notify all the windows of the screen resolution change
           SendMessage HWND_BROADCAST, WM_DISPLAYCHANGE, ByVal Bits, ByVal ScInfo
           MsgBox "Everything's ok", vbOKOnly + vbSystemModal, "It worked!"
       Case Else
           MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
   End Select
End Sub
Private Sub Form_Load()
   Dim nDC As Long
   'retrieve the screen's resolution
   OldX = Screen.Width / Screen.TwipsPerPixelX
   OldY = Screen.Height / Screen.TwipsPerPixelY
   'Create a device context, compatible with the screen
   nDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
   'Change the screen's resolution
   ChangeRes 640, 480, GetDeviceCaps(nDC, BITSPIXEL)
End Sub
Private Sub Form_Unload(Cancel As Integer)
   'restore the screen resolution
   ChangeRes OldX, OldY, GetDeviceCaps(nDC, BITSPIXEL)
   'delete our device context
   DeleteDC nDC
End Sub

Автор: Exception 9.1.2005, 12:15
А зачем тебе? При загрузке узнаёшь, а так-то на что? smile
Это уже юзера проблемы - приспичит вдруг менять - перезапускает прогу пусть smile

Автор: Rostik Ultra 10.1.2005, 03:54
Цитата(Run @ 9.1.2005, 12:15)
А зачем тебе? При загрузке узнаёшь, а так-то на что? smile
Это уже юзера проблемы - приспичит вдруг менять - перезапускает прогу пусть smile

Надо smile
Добавлено @ 03:57
M.E.G.U.S Код который ты послал меняет разрешение экрана , нафиг он мне smile Я уже проблему решил , так что благодарствую smile

Автор: cardinal 10.1.2005, 04:08
Rostik Ultra, а чем тебе написанное в сообщении
http://forum.vingrad.ru/index.php?showtopic=38561&view=findpost&p=294670
не понравилось?
Цитата(Rostik @ 9.1.2005, 02:33)
Я провеоил свою прогу у себя

Ну только что твоя прога не уникальна для всех контролов... В смысле, что все самому прописывать надо
Код

        Text1.Left = 4080 * ew
        Text1.Top = 4920 * eh
        Text1.Width = 7200 * ew
             Label18.Left = 6745 * ew
             Label18.Top = 4560 * eh
' и т.д. для других элементов

Автор: Rostik Ultra 10.1.2005, 04:52
Цитата(cardinal @ 10.1.2005, 04:08)
Rostik Ultra, а чем тебе написанное в сообщении
http://forum.vingrad.ru/index.php?showtopic=38561&view=findpost&p=294670
не понравилось?
Цитата(Rostik @ 9.1.2005, 02:33)
Я провеоил свою прогу у себя

Ну только что твоя прога не уникальна для всех контролов... В смысле, что все самому прописывать надо
Код

        Text1.Left = 4080 * ew
        Text1.Top = 4920 * eh
        Text1.Width = 7200 * ew
             Label18.Left = 6745 * ew
             Label18.Top = 4560 * eh
' и т.д. для других элементов

Зато работает во всех разрешениях и не надо таскать за собой дополнительные контролы или несколько форм, которые , как я сказал, всё равно не предусмотрят все, возможные разрешения экрана

А моим способом - прописать процедуру - пара минут , зато потом голова не болит (ИМХО)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)