Модератор: gaidar
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
Mikle писал(а):Если "очень надо", то я бы просто хранил невидимый Label с AutoSise на форме, присваивал сначала ему нужный шрифт и Caption, а потом вычислял размер чекбокса, как сумму размеров чекбокса без названия и этого Label.
Но это, конечно, решение не в стиле "Visual Basic 1-6 для Профессионалов"
где мне взять "размеры чекбокса без названия"? Они же тоже меняются в зависимости от размеров системных шрифтов.
Mikle писал(а):где мне взять "размеры чекбокса без названия"? Они же тоже меняются в зависимости от размеров системных шрифтов.
Я имел ввиду что-то вроде этого:
При изменении размеров системных шрифтов размер квадратика с галочкой тоже меняется.
alibek писал(а):Кстати, если я не путаю, то чекбокс не масштабируется.
Это растр на три фиксированных размера (нормальный, большой, очень большой).
lister писал(а):При изменении размеров системных шрифтов размер квадратика с галочкой тоже меняется.
tyomitch, скажи, пожалуйста, что и где нужно поменять, чтобы изменился размер квадратика с галочкой?
У меня он ни черта не меняется
Конь писал(а):tyomitch
Наверное, ты меня не так понял. Можно узнать, какой из этих трех размеров в данный момент установлен юзером?
Вернуться в Раздел для Профессионалов
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16