Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Внизперевод пикселей в DialogBaseUnits Найти похожие ветки
← →
kilonet (2006-02-02 16:01) [0]надо сделать сабж для несистемного шрифта
в MSDN есть формула:
horz pixels == 2 * horz dialog units * (average char width of dialog font / average char width of system font)
из неё получаем формулу для перевода:DialogBaseUnits := pixels * (average char width of system font / average char width of dialog font)
Для вычисления средней ширины символа там же приведён код:
hFontOld = SelectObject(hdc,hFont);
GetTextMetrics(hdc,&tm);
GetTextExtentPoint32(hdc,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst"
"uvwxyz",52,&size);
avgWidth = (size.cx/26+1)/2;
avgHeight = (WORD)tm.tmHeight;
пара вопросов по нему:
1.как первая строка влияет на выполнение следующих комманд?
2.Как правильно получить хэндл контекста устройства: hdc := GetDC(ListBox1.Handle) или hdc := ListBox1.Canvas.Handle ?
3.как узнать ширину среднего символа в системном шрифте, если он не используется?
← →
kilonet (2006-02-02 16:03) [1]попрвка: формула для перевода получается такая:
DialogBaseUnits := pixels * (average char width of system font / average char width of dialog font) * 0.5
← →
Игорь Шевченко © (2006-02-02 16:42) [2]
function DialogUnitsToPixelsX(DlgUnits: Word): Word;
begin
Result := (DlgUnits * LoWord(GetDialogBaseUnits)) div 4;
end;
function DialogUnitsToPixelsY(DlgUnits: Word): Word;
begin
Result := (DlgUnits * HiWord(GetDialogBaseUnits)) div 8;
end;
function PixelsToDialogUnitsX(PixUnits: Word): Word;
begin
Result := PixUnits * 4 div LoWord(GetDialogBaseUnits);
end;
function PixelsToDialogUnitsY(PixUnits: Word): Word;
begin
Result := PixUnits * 8 div HiWord(GetDialogBaseUnits);
end;
← →
kilonet (2006-02-02 17:19) [3]Игорь Шевченко
но эти формулы верны только для шрифта с фиксированной шириной символа!
← →
kilonet (2006-02-02 17:28) [4]в MSDN же написано, что формулы
pixelX = (dialogunitX * baseunitX) / 4
pixelY = (dialogunitY * baseunitY) / 8
верны для системного шрифта.
Непонятно, что такое системный шрифт:
1. шрифт с название System, у которого ширина символа не фиксированна, но вышеприведённые формулы работают
2. шрифт, которым пишутся заголовки окон и меню (у Петзольда так написано)- у меня таким шрифтом является Tahoma и для него эти формылы не работают((
← →
Игорь Шевченко © (2006-02-02 17:56) [5]
> Непонятно, что такое системный шрифт:
System
> 1.как первая строка влияет на выполнение следующих комманд?
Все операции будут производиться с указанным шрифтом.
> 2.Как правильно получить хэндл контекста устройства: hdc
> := GetDC(ListBox1.Handle) или hdc := ListBox1.Canvas.Handle
> ?
GetDC
> 3.как узнать ширину среднего символа в системном шрифте,
> если он не используется?
SelectObject (hDC, GetStockObject (SYSTEM_FONT));
и далее
← →
kilonet (2006-02-02 18:59) [6]
hFontOld = SelectObject(hdc,hFont);
чем здесь являются hFontOld и hFont?
и как получить для них начальные значения?
← →
kilonet (2006-02-02 23:01) [7]
SelectObject (hDC, GetStockObject (SYSTEM_FONT));
здесь hdc чей берётся?
← →
kilonet (2006-02-03 16:11) [8]уффф... что-то я запутался(((
на форме у меня есть HeaderControl и ListBox. Надо чтобы ширина колонок в ListBox была равна ширине секций HeaderControl. Формулы, взятые в MSDN работают, но не для всех шрифтов и не для всех размеров (или я ошибся где-то)(((
Если кого не затруднит взгляните на мой код, может ошибку увидите:
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.TabWidth := 1;
ListBox1.Items.Add("one"^I"one"^I"one"^I"one");
ListBox1.Items.Add("two"^I"two"^I"two"^I"two");
ListBox1.Items.Add("three"^I"three"^I"three"^I"three");
ListBox1.Items.Add("four"^I"four"^I"four"^I"four");
end;
procedure TForm1.HeaderControl1SectionResize(HeaderControl: THeaderControl;
Section: THeaderSection);
var
TabArray : array[0..3] of integer; // позиции табуляций
i: Integer;
hdc1, hdc2: HDC;
hFontOld1, hFontOld2: HFONT;
size1, size2: SIZE;
avgWidth, avgSysWidth, k: Real;
begin
for i := 0 to HeaderControl.Sections.Count - 1 do
HeaderControl.Sections[i].Text := IntToStr(HeaderControl.Sections[i].Width);
hdc1 := GetDC(ListBox1.Handle);
hFontOld1 := SelectObject(hdc1,HFONT(SendMessage(Listbox1.Handle, WM_GetFont, 0, 0)));
GetTextExtentPoint32(hdc1,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",52,size1);
avgWidth := (size1.cx/26+1)/2;
hdc2 := GetDC(ListBox1.Handle);
hFontOld2 := SelectObject (hdc2, HFONT(GetStockObject (SYSTEM_FONT)));
GetTextExtentPoint32(hdc2,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",52,size2);
avgSysWidth := (size2.cx/26+1)/2;
// коэф. перевода пикс. в DBU
k := 0.5*(avgSysWidth / avgWidth);
// заполняем массив позициями табуляций в пикселах
TabArray[0] := HeaderControl1.Sections[0].Width;
for i := 1 to 3 do
TabArray[i] := TabArray[i - 1] + HeaderControl1.Sections[i].Width;
// преобразуем в DialogBaseUnits
for i := 0 to 3 do
TabArray[i] := round(TabArray[i] / dbu) ;
SendMessage(ListBox1.Handle,
LB_SETTABSTOPS,
High(TabArray),
LongInt(@TabArray));
Listbox1.Refresh;
end;
← →
Игорь Шевченко © (2006-02-03 16:22) [9]
> Надо чтобы ширина колонок в ListBox была равна ширине секций
> HeaderControl
А зачем здесь DialogBaseUnits ?
← →
kilonet (2006-02-03 18:14) [10]ну так в сообщении LB_SETTABSTOPS ширина колонок должна быть в dbu указана
← →
Игорь Шевченко © (2006-02-03 19:05) [11]Первый совет - вычисли ширину заранее.
← →
Leonid Troyanovsky © (2006-02-03 19:30) [12]
> kilonet (03.02.06 18:14) [10]
Проще сделать ownerdraw listbox в котором делать DrawText по позиции
секций, а на изменение размера секций делать listbox.Invalidate.
--
Regards, LVT.
← →
kilonet (2006-02-03 20:39) [13]Leonid Troyanovsky
Попробую сделать по вашему совету.
Всё равно не понятно, почему "официальные" методы отказываются работать
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.021 c