Форум картографов, карты MapInfo, Google maps

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум картографов, карты MapInfo, Google maps » MapBasic » Ширина и высота в диалогах


Ширина и высота в диалогах

Сообщений 1 страница 11 из 11

1

Подскажите, если кто знает.
Как перевести пиксели в диалоговые единицы?
Следующие формулы не работают так как нужно.

LONG GetDialogBaseUnits(VOID)
The horizontal base unit is equal to the average width, in pixels, of the characters in the system font; the vertical base unit is equal to the height, in pixels, of the font. Furthermore, each horizontal base unit is equal to 4 horizontal dialog units; each vertical base unit is equal to 8 vertical dialog units. Therefore, to convert dialog units to pixels, an application applies the following formulas:

pixelX = (dialogunitX * baseunitX) / 4 
pixelY = (dialogunitY * baseunitY) / 8 

Similarly, to convert from pixels to dialog units, an application applies the following formulas:

dialogunitX = (pixelX * 4) / baseunitX 
dialogunitY = (pixelY * 8) / baseunitY

2

А собсно какое отношение имеет Win32 API к MapBasic ?
Формулы работают не так как надо или не работают вообще ?

3

Здесь на русском почитай, может так понятней будет

У диалога свои единицы измерения. Эти единицы зависят от шрифта используемого в диалоге. С помощью функции GetDialogBaseUnits у нас есть возможность получить единицы диалогового окна в пикселах.
LONG GetDialogBaseUnits
(
VOID
);

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

Для конвертирования единиц измерения диалоговых окон к пикселям нужно применять следующие формулы:
pixelX = MulDiv( templateunitX, baseunitX, 4 );
pixelY = MulDiv( templateunitY, baseunitY, 8 );

И наоборот:
templateunitX = MulDiv( pixelX, 4, baseunitX );
templateunitY = MulDiv( pixelY, 8, baseunitY );

Единицы измерения окна зависят от стиля Style, который был установлен при создании окна в шаблоне. Для дочерних панелей диалога координаты связаны с начальными координатами родительского окна, в противном случае панель диалога имеет тип DS_ABSALIGN, тогда координаты связаны с начальными координатами экрана дисплея.

4

Сорри, не так сформулировал вопрос.  Я насчет оператора Dialog в MapBasic'e
Вот ссылка Spatial News
Вот выдержка из хелпа по MapBasic.

В операторе Dialog размер и расположение элемента диалога измеряются в долях шрифта диалога. Каждая единица измерения ширины в диалоге равна одной четвертой ширины символа (первая координата) и каждая единица измерения высоты в диалоге – одной восьмой высоты символа (вторая координата). Так, если элемент имеет ширину 40 и высоту 40, то это значит, что в элемент можно уместить слово в десять букв и список в пять строк.

Собственно мне нужно перевести эти самые доли в пиксели и наоборот.

Отредактировано selax (2007-10-30 13:05:18)

5

ну тогда вот эти формулы подойдут:

pixelX = (dialogunitX * baseunitX) / 4 
pixelY = (dialogunitY * baseunitY) / 8

dialogunitX = (pixelX * 4) / baseunitX 
dialogunitY = (pixelY * 8) / baseunitY

где:
pixel- пиксели;
dialogunit- диалоговые единицы;
baseunit- базовые единицы измерения блока диалога.

Тебе нужно получить базовые единицы измерения блока диалога (baseunit), вот функция LONG GetDialogBaseUnits(VOID) и возвращает эти единицы. LONG GetDialogBaseUnits(VOID) это функция Win32 API.

Скажи что тебе нужно сделать в итоге, потому что неясно, пишешь ты прогу на MapBasic или хочешь из другой среды (Delphi, VB) вызвать MapInfo и встроить его в свою программу

6

Я пишу программу на делфи. IDE наподобие MBBuilder.
После того как я визуально настроил диалог, мне необходимо преобразовать его в текст диалога на mapbasic.
Но в mapbasic все размеры и расположения элементов диалога измеряются в долях шрифта диалога.
Я именно по этим формулам и сделал.
Функция GetDialogBaseUnits на 5-6 стандартных машинках с WinXP возвращает:
baseunitX = LODWORD(GetDialogBaseUnits) =  8
baseunitY = HIDWORD(GetDialogBaseUnits)  =  16
Из чего  я делаю вывод, что базовые единицы получаются такие не только на моей машинке.
Ввожу, например, следующие данные:
pixelX = 500
pixelY = 500
dialogunitX = (pixelX * 4) / baseunitX = (500*4)/8   = 250
dialogunitY = (pixelY * 8) / baseunitY   = (500*8)/16 = 250
У MBBuilder при создании диалога получается Width 328 Height 291
А из этих значений получается, что
baseunitX = 6,01
baseunitY = 13,7
Пробовал следующий код. Но он возвращает целочисленный код 6 и 13, что опять не то :((

Код:
function GetMenuFont: TFont;
var
  ncm: TNonClientMetrics;
begin
  ncm.cbSize := SizeOf(TNonClientMetrics);
  SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(TNonClientMetrics), @ncm, 0);
  Result := TFont.Create;
 {
lfCaptionFont - regular captions
lfSmCaptionFont - small captions
lfMenuFont - menus
lfStatusFont - status bars
lfMessageFont - message boxes
}
  Result.Handle := CreateFontIndirect(ncm.lfMessageFont);
end;
..................................
var
  TM: tagTEXTMETRICA;
begin
  with TBitmap.Create do
  begin
    Canvas.Font:= GetMenuFont;
    GetTextMetrics(Canvas.Handle,TM);
    baseunitX:= TM.tmAveCharWidth;
    baseunitY:= TM.tmHeight;
    Free;
  end;

7

ну попробуй подставить в формулу
baseunitX = 6
baseunitY = 13

если не получится, то пробуй методом перебора :)

8

Пробовал. Диалог расползается.   :(
Если подбором, то:
baseunitX = 6,0975
baseunitY = 13,7457
Но мне то нужно эти значения получить программно. 
И для текущих настроек диалоговых единиц для MapInfo.
Ведь MBBuilder как - то преобразовывает пиксели в единицы. (диалоги получаются один в один)
Видимо он считает по какой то другой формуле. Вот эту формулу и хотелось бы узнать.

9

ну тогда подставляй в эти формулы константы (разность в отношениях единиц MBBuilder и WinAPI)

10

Мда......

11

Если кто наткнется и ему будет это нужно.
Ответ написан на http://testdrive.mapinfo.com/techsupp/m … A4006BFA62


Вы здесь » Форум картографов, карты MapInfo, Google maps » MapBasic » Ширина и высота в диалогах