Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

перевод пикселей в 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 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
2-1144733806
Сергей И.
2006-04-11 09:36
2006.04.23
Работа с принтером


9-1128284221
Ricks
2005-10-03 00:17
2006.04.23
Многопроходная отрисовка ландшафта


2-1144441233
Gamer
2006-04-08 00:20
2006.04.23
Проблема с нетипизированным файлом


2-1144535831
iyshnik
2006-04-09 02:37
2006.04.23
Относительный путь


3-1141392474
ancot
2006-03-03 16:27
2006.04.23
Не отробатывает IsEmpty в TQuery