Как узнать нужный чекбоксу размер?

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Как узнать нужный чекбоксу размер?

Сообщение tyomitch » 05.10.2006 (Чт) 10:59

Типа как AutoSize у лейбла.
Положить рядом с чекбоксом без подписи лейбл с автосайзом не подходит.
Закладываться на конкретный размер квадратика тоже не хочется. А правильный размер должен бы возвращаться из GetSystemMetrics, но не возвращается.

Искал, но чего-то ничего не нашёл :-(
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2006 (Чт) 11:01

Размер чего именно?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.10.2006 (Чт) 11:05

Видимо нужно узнать, какой должен быть Height и Width чекбокса, чтобы ничего не обрезалось (ни текст, ни квадратик).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.10.2006 (Чт) 11:13

А как должно проверятся?
Я у себя только smCYMenuCheck нашел, как самое похожее.
Но оно возвращает данные, причем правильные.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.10.2006 (Чт) 12:57

2GSerg: Хакер прав.

2alibek: проверяться должно, как минимум, при разных нестандартных размерах системных шрифтов.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.10.2006 (Сб) 11:44

Извиняюсь, но ап.
Сильно нужно.
Ни у кого нет идей?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.10.2006 (Сб) 18:56

А помнишь как-то давно ты мне показывал, как определить высоту комбобокса исходя из размера диалоговых единиц окна? Мне кажется, тут так же считается...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2006 (Вс) 7:16

не помню :-(
напомни плз
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.10.2006 (Вс) 12:33

Кстати, если я не путаю, то чекбокс не масштабируется.
Это растр на три фиксированных размера (нормальный, большой, очень большой).
Может быть в этом дело?
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2006 (Вс) 12:56

размер чекбокса уже нашёл где взять: LoadBitmap(NULL,OBM_CHECKBOXES)
ещё пара часиков тестирования, и додавлю код...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2006 (Вс) 13:39

Вот этот код -- является, по-видимому, окончательным.
Не поддерживаются многострочные чекбоксы и чекбоксы с недефолтным выравниванием. Темы тоже не поддерживаются.
Задо поддерживаются все размеры шрифтов.
Тестьте, если кому надо.

Код: Выделить всё
Option Explicit

Private Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal hInstance As Long, ByVal lpBitmapName As Long) As Long
Private Const OBM_CHECKBOXES = 32759
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Type BITMAP
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Const SM_CYBORDER = 6
Private Const SM_CXEDGE = 45
Private Type SIZE
    cx As Long
    cy As Long
End Type
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hDC As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As SIZE) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) 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
Private Const WM_GETFONT = &H31
Private Declare Function SetBkMode Lib "gdi32" (ByVal hDC As Long, ByVal nBkMode As Long) As Long
Private Const TRANSPARENT = 1
Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long

Public Sub AutosizeCheckbox(ByVal cb As CheckBox)
Dim bm As BITMAP, sz As SIZE, sz1 As SIZE
Dim hDC As Long, hBM As Long, hFont As Long
    hBM = LoadBitmap(0, OBM_CHECKBOXES)
    GetObject hBM, Len(bm), bm
    DeleteObject hBM
    hDC = CreateCompatibleDC(0)
    hFont = SendMessage(cb.hwnd, WM_GETFONT, 0, ByVal 0&)
    SelectObject hDC, hFont
    GetTextExtentPoint32 hDC, cb.Caption, Len(cb.Caption), sz
    GetTextExtentPoint32 hDC, "0", 1, sz1 'wtf?
    DeleteDC hDC
    cb.Width = bm.bmWidth / 4 + sz1.cx / 2 + 2 * GetSystemMetrics(SM_CXEDGE) + sz.cx
    cb.Height = bm.bmHeight / 3 ' либо sz.cy + GetSystemMetrics(SM_CYBORDER))
    'проверка
    DoEvents
    hDC = GetDC(cb.hwnd)
    SelectObject hDC, hFont
    SetBkMode hDC, TRANSPARENT
    SetTextColor hDC, vbBlue
    TextOut hDC, bm.bmWidth / 4 + sz1.cx / 2 + GetSystemMetrics(SM_CXEDGE), 0, cb.Caption, Len(cb.Caption)
    ReleaseDC cb.hwnd, hDC
End Sub
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.10.2006 (Пн) 14:14

LoadImage было второе, что пришло мне в голову, но я думал, что там неправильно, без учёта шрифтов :(
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.10.2006 (Ср) 9:45

tyomitch
Если "очень надо", то я бы просто хранил невидимый Label с AutoSise на форме, присваивал сначала ему нужный шрифт и Caption, а потом вычислял размер чекбокса, как сумму размеров чекбокса без названия и этого Label.
Но это, конечно, решение не в стиле "Visual Basic 1-6 для Профессионалов" :roll:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 11.10.2006 (Ср) 9:55

+а заодно еще и невидимый чекбокс без названия придется хранить
Последний раз редактировалось Viper 13.10.2006 (Пт) 7:09, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 11.10.2006 (Ср) 11:11

Не обязательно лейбл. Есть у формы такие методы как TextWidth и TextHeight.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2006 (Ср) 15:40

Mikle писал(а):Если "очень надо", то я бы просто хранил невидимый Label с AutoSise на форме, присваивал сначала ему нужный шрифт и Caption, а потом вычислял размер чекбокса, как сумму размеров чекбокса без названия и этого Label.
Но это, конечно, решение не в стиле "Visual Basic 1-6 для Профессионалов" :roll:

Во-первых, проблема уже решена.
Во-вторых, а где мне взять "размеры чекбокса без названия"? Они же тоже меняются в зависимости от размеров системных шрифтов.
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.10.2006 (Чт) 13:37

где мне взять "размеры чекбокса без названия"? Они же тоже меняются в зависимости от размеров системных шрифтов.

Я имел ввиду что-то вроде этого:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.10.2006 (Чт) 14:23

Mikle писал(а):
где мне взять "размеры чекбокса без названия"? Они же тоже меняются в зависимости от размеров системных шрифтов.

Я имел ввиду что-то вроде этого:

Не заработает.
При изменении размеров системных шрифтов размер квадратика с галочкой тоже меняется.
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.10.2006 (Пт) 9:49

tyomitch
Разве размер системных шрифтов не зависит однозначно от Screen.TwipsPerPixelX и Screen.TwipsPerPixelY ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.10.2006 (Пт) 10:09

Чуть-чуть наоборот: это они от него однозначно зависят.
А что? ты подозреваешь, что размер чекбокса в твипах постоянен?
Может, и так: но надо проверять :-?
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 31.10.2006 (Вт) 23:47

При изменении размеров системных шрифтов размер квадратика с галочкой тоже меняется.

tyomitch, скажи, пожалуйста, что и где нужно поменять, чтобы изменился размер квадратика с галочкой?
У меня он ни черта не меняется :?

Увеличивал размер шрифта до огромного - ноль эмоций. Все те же 13 px...
Перешел на классический стиль, поменял размеры шрифтов на всех доступных элементах. Все то же самое - 13px

Хотя даже темами XP (по крайней мере Луной) предусмотрены 13, 16 и 25 - пиксельные чекбоксы. (Правда многие темы не содержат растры на 16 и 25 px)

alibek писал(а):Кстати, если я не путаю, то чекбокс не масштабируется.
Это растр на три фиксированных размера (нормальный, большой, очень большой).

Во-во: 13, 16 и 25 px. И чекбоксы и радиокнопки.

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 01.11.2006 (Ср) 2:25

а если масштаб увеличить с 96 до 120 ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.11.2006 (Ср) 8:42

Только это не масштаб.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.11.2006 (Ср) 9:51

lister писал(а):
При изменении размеров системных шрифтов размер квадратика с галочкой тоже меняется.

tyomitch, скажи, пожалуйста, что и где нужно поменять, чтобы изменился размер квадратика с галочкой?
У меня он ни черта не меняется :?

Панель управления, Экран, Параметры, Дополнительно, Особые параметры, 200%, OK, OK, OK, перезагрузка.


2alibek: таки-да, в моей русской XP это называется масштабом.
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 01.11.2006 (Ср) 13:09

Ага, понял. Что-то про масштаб я и не подумал :shock:

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 03.11.2006 (Пт) 3:43

А нельзя каким-либо образом получить этот "системный" масштаб?
Подпись находится в стадии разработки...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.11.2006 (Пт) 5:44

По-видимому, 15/Screen.TwipsPerPixelX
Изображение

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 03.11.2006 (Пт) 21:33

tyomitch
Наверное, ты меня не так понял. Можно узнать, какой из этих трех размеров в данный момент установлен юзером?
Подпись находится в стадии разработки...

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 04.11.2006 (Сб) 7:44

GetDeviceCaps(hdc, LOGPIXELSY)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.11.2006 (Сб) 8:38

Конь писал(а):tyomitch
Наверное, ты меня не так понял. Можно узнать, какой из этих трех размеров в данный момент установлен юзером?

Наверное, это ты меня не так понял.
Что, по-твоему, делает мой код?
Изображение


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList