Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.017 c
1-1142768719
Jean Claude
2006-03-19 14:45
2006.04.23
Сборка линкером от M$


3-1140950035
Prog
2006-02-26 13:33
2006.04.23
Работа с DBF фалами


4-1138866916
tse
2006-02-02 10:55
2006.04.23
Запуск scktsrvr.exe в режиме сервиса от имени пользователя


15-1143721344
Mike Kouzmine
2006-03-30 16:22
2006.04.23
Не успели запустить бразильца в космос, как


15-1143114528
Der Nechk@ssoff
2006-03-23 14:48
2006.04.23
Политика Мелкософта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский