Страница: 1 | 2 |
Вопрос: Разрешение экрана и прога
Добавлено: 02.10.04 14:29
Автор вопроса: DaSharm | Web-сайт:
Как адаптировать прогу к разным разрешениям экрана?Ну, чтобы размеры контролов изменялись автоматичеси с изменением разрешения...
?
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 02.10.04 15:13
Ввести какой-то коэфицент для каждого контрола (скажем кол-во процентов от занимаемого экрана) Далее размер экрана по высоте, по ширине умножается на этот коэфицент... А чтобы при смене разрешения все было ок, нужно отлавливать сообщение при смене разрешения, честно говоря какое не помню, знаю что есть такое...
Номер ответа: 2
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #2
Добавлено: 02.10.04 17:45
Блин, да у меня контрролов около 50 штук. Что ВБ сам ресайзить не может???
Номер ответа: 3
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #3
Добавлено: 02.10.04 17:53
Контролы в принципе можно перебрать в цикле.
 im obj As Object
For Each obj In Me
On Error Resume Next
obj.Width =
obj.Height =
obj.Top =
obj.Left =
Next
Но мне кажется серавно не получится, например ListBox понемногу изменять Height не хочет. А разрешение экрана оказывается можно узнать без API Screen.Width / 15
Номер ответа: 4
Автор ответа:
Piton_4m
Вопросов: 10
Ответов: 26
Профиль | | #4
Добавлено: 02.10.04 17:59
Попробуй Screen.... Даст размеры экрана в данный момент, но есть функция возвращающая или выставляющая разрешения как в игрушках, тока никто не делиться..... найдёшь скинь на мыло..........
Номер ответа: 5
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #5
Добавлено: 02.10.04 18:06
А мыло то где?
Номер ответа: 6
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #6
Добавлено: 02.10.04 19:10
2Mihalыch
[code]Screen.Width / 15
[/code]
Нет, так не точно
[code]Screen.Width / Screen.TwipsPerPixelX
[/code]
Хотя результат тот же, но ведь зачем то это делали?
Чтобы ListBox менял размеры вне зависимости от вышины его строчек у него
есть св-во IntegralHeight = False
Номер ответа: 7
Автор ответа:
Piton_4m
Вопросов: 10
Ответов: 26
Профиль | | #7
Добавлено: 03.10.04 04:47
Graymord@mail.ru
Номер ответа: 8
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #8
Добавлено: 03.10.04 07:14
Интересная тема… Попробовал, вот что получилось:
 im wInd As Single
 im hInd As Single
Private Sub Form_Load()
If Screen.Width / Screen.TwipsPerPixelX <> 1024 Then
wInd = (Screen.Width / Screen.TwipsPerPixelX) / (1024 / 100)
hInd = (Screen.Height / Screen.TwipsPerPixelY) / (768 / 100)
RedRaw
End If
End Sub
Sub RedRaw()
 im obj As Object
Me.Width = Me.Width / 100 * wInd
Me.Height = Me.Height / 100 * wInd
For Each obj In Me
On Error Resume Next
With obj
.IntegralHeight = False
.Width = obj.Width / 100 * wInd
.Height = obj.Height / 100 * hInd
.Top = obj.Top / 100 * hInd
.Left = obj.Left / 100 * wInd
.X1 = obj.X1 / 100 * wInd
.X2 = obj.X2 / 100 * wInd
.Y1 = obj.Y1 / 100 * hInd
.Y2 = obj.Y2 / 100 * hInd
.FontSize = obj.FontSize / 100 * wInd
End With
Next
End Sub
Посмотрите кому не влом, проблема с размером шрифта, ну не хочет становиться меньше 8. Может тоже какое нить св-во изменить нужно и он уменьшится?
Номер ответа: 9
Автор ответа:
Piton_4m
Вопросов: 10
Ответов: 26
Профиль | | #9
Добавлено: 03.10.04 09:17
Mihalыch Используй не шрифт "MS Sans Serif", а например "Times New Roman"... тогда мона будет поставить размер хоть 1,5.....
Номер ответа: 10
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #10
Добавлено: 03.10.04 10:40
Со шрифтом на стандартных контролах уже разобрался. Теперь пытаюсь уговорить UserControl’ы . Вот эти согласны работать по хорошему (xpradiobutton и xpgroupbox), вот эти пока нет (xpcmdbutton и xpcheckbox) и еще MonthView вредничает. А вообще уже можно использовать, скажем предупредив пользователя мол разрешение нестандартное для этой программы, со всеми вытекающими…
Номер ответа: 11
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #11
Добавлено: 03.10.04 11:04
Все всех уговорил, даже MonthView сдался. Теперь все выглядит так:
Private Sub Form_Load()
If Screen.Width / Screen.TwipsPerPixelX <> 1024 Then
RedRaw Me, (Screen.Width / Screen.TwipsPerPixelX) / (1024 / 100), (Screen.Height / Screen.TwipsPerPixelY) / (768 / 100)
End If
End Sub
Sub RedRaw(objf As Form, wInd As Single, hInd As Single)
 im Obj As Object
 im i As Byte
objf.Width = objf.Width / 100 * wInd
objf.Height = objf.Height / 100 * hInd
objf.Top = objf.Top / 100 * hInd
objf.Left = objf.Left / 100 * wInd
For Each Obj In objf
On Error Resume Next
With Obj
If TypeOf Obj Is ListView Then
For i = 1 To Obj.ColumnHeaders.Count
Obj.ColumnHeaders.Item(i).Width = Obj.ColumnHeaders.Item(i).Width / 100 * wInd
Next i
End If
If TypeOf Obj Is PictureBox Then .AutoSize = False
.Stretch = True
.IntegralHeight = False
If Not TypeOf Obj Is Label Then
.Font.Name = "Microsoft Sans Serif"
.Font.Size = .Font.Size / 100 * wInd
End If
.Width = .Width / 100 * wInd
.Height = .Height / 100 * hInd
.Top = .Top / 100 * hInd
.Left = .Left / 100 * wInd
.X1 = .X1 / 100 * wInd
.X2 = .X2 / 100 * wInd
.Y1 = .Y1 / 100 * hInd
.Y2 = .Y2 / 100 * hInd
If TypeOf Obj Is Label Or TypeOf Obj Is MonthView Then
.Font.Name = "Microsoft Sans Serif"
.Font.Size = .Font.Size / 100 * wInd
End If
End With
Next
End Sub
Если ListView или MonthView не используются, то все относящиеся к ним нужно убрать или закомментировать, а если используется что-то еще, нужно поглядеть как это «что-то» ведет себя и возможно поработать индивидуально… В таком виде процедура вставлена в мою прогу, все работает приемлемо, хотя понятно что она не универсальна.
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 03.10.04 18:52
Тю народ! OCX то есть! Он в примерчике там де есть полный стиль xp (ну там где форма, чексбоксы итп...) вто там есть Resizer он вроде нормально всё делает...
Номер ответа: 13
Автор ответа:
AASoft
Вопросов: 86
Ответов: 920
Профиль | | #13
Добавлено: 05.10.04 00:15
2 HACKER,
nu dyk eto-zhe ved` ActiveX, ne svoe...naskoka ya pomnyu DaSharm ne lyubitel` chuzhih kontrolov, tak chto kod Mihalыch'a klevoe reshenie....
kstati, interesno kak on s podsvetkoj smotritsya...
[CODE]Private Sub Form_Load()
If Screen.Width / Screen.TwipsPerPixelX <> 1024 Then
RedRaw Me, (Screen.Width / Screen.TwipsPerPixelX) / (1024 / 100), (Screen.Height / Screen.TwipsPerPixelY) / (768 / 100)
End If
End Sub
Sub RedRaw(objf As Form, wInd As Single, hInd As Single)
Dim Obj As Object
Dim i As Byte
objf.Width = objf.Width / 100 * wInd
objf.Height = objf.Height / 100 * hInd
objf.Top = objf.Top / 100 * hInd
objf.Left = objf.Left / 100 * wInd
For Each Obj In objf
On Error Resume Next
With Obj
If TypeOf Obj Is ListView Then
For i = 1 To Obj.ColumnHeaders.Count
Obj.ColumnHeaders.Item(i).Width = Obj.ColumnHeaders.Item(i).Width / 100 * wInd
Next i
End If
If TypeOf Obj Is PictureBox Then .AutoSize = False
.Stretch = True
.IntegralHeight = False
If Not TypeOf Obj Is Label Then
.Font.Name = "Microsoft Sans Serif"
.Font.Size = .Font.Size / 100 * wInd
End If
.Width = .Width / 100 * wInd
.Height = .Height / 100 * hInd
.Top = .Top / 100 * hInd
.Left = .Left / 100 * wInd
.X1 = .X1 / 100 * wInd
.X2 = .X2 / 100 * wInd
.Y1 = .Y1 / 100 * hInd
.Y2 = .Y2 / 100 * hInd
If TypeOf Obj Is Label Or TypeOf Obj Is MonthView Then
.Font.Name = "Microsoft Sans Serif"
.Font.Size = .Font.Size / 100 * wInd
End If
End With
Next
End Sub[/CODE]
Номер ответа: 14
Автор ответа:
AASoft
Вопросов: 86
Ответов: 920
Профиль | | #14
Добавлено: 05.10.04 00:15
[CODE]
Private Sub Form_Load()
If Screen.Width / Screen.TwipsPerPixelX <> 1024 Then
RedRaw Me, (Screen.Width / Screen.TwipsPerPixelX) / (1024 / 100), (Screen.Height / Screen.TwipsPerPixelY) / (768 / 100)
End If
End Sub
Sub RedRaw(objf As Form, wInd As Single, hInd As Single)
Dim Obj As Object
Dim i As Byte
objf.Width = objf.Width / 100 * wInd
objf.Height = objf.Height / 100 * hInd
objf.Top = objf.Top / 100 * hInd
objf.Left = objf.Left / 100 * wInd
For Each Obj In objf
On Error Resume Next
With Obj
If TypeOf Obj Is ListView Then
For i = 1 To Obj.ColumnHeaders.Count
Obj.ColumnHeaders.Item(i).Width = Obj.ColumnHeaders.Item(i).Width / 100 * wInd
Next i
End If
If TypeOf Obj Is PictureBox Then .AutoSize = False
.Stretch = True
.IntegralHeight = False
If Not TypeOf Obj Is Label Then
.Font.Name = "Microsoft Sans Serif"
.Font.Size = .Font.Size / 100 * wInd
End If
.Width = .Width / 100 * wInd
.Height = .Height / 100 * hInd
.Top = .Top / 100 * hInd
.Left = .Left / 100 * wInd
.X1 = .X1 / 100 * wInd
.X2 = .X2 / 100 * wInd
.Y1 = .Y1 / 100 * hInd
.Y2 = .Y2 / 100 * hInd
If TypeOf Obj Is Label Or TypeOf Obj Is MonthView Then
.Font.Name = "Microsoft Sans Serif"
.Font.Size = .Font.Size / 100 * wInd
End If
End With
Next
End Sub
[/CODE]
Номер ответа: 15
Автор ответа:
AASoft
Вопросов: 86
Ответов: 920
Профиль | | #15
Добавлено: 05.10.04 00:16
stryanno....