Page 1 of 1

Font changes the width rather than size.

Posted: Sun Sep 18, 2016 11:51 am
by sexy96
Przy uruchomieniu mam font Courier New 11, ilość widocznych linii jest 43,
a linijka na końcu pokazuje, że okno ma szerokość 181 kolumn.
Gdy chcę zmniejszyć font z 11 na 10 i wybiorę czcionkę 10,
to ilość widocznych linii jest 45 (o 2 więcej), a okno ma szerokość 204 (o 23 więcej) kolumn.
To jest OK.

A jeżeli chcę zmniejszyć font z 11 na 10 poprzez kliknięcie na ikonie "A-" to:
wielkość czcionki dalej pokazuje 11.
ilość widocznych linii jest nadal 43 (wysokość czcionki nadal sama),
ale zmienia się szerokość czcionki, a linijka na końcu pokazuje, że okno ma teraz 204 kolumny.

Dopiero następne kliknięcie zmieni font na 10.
Dotyczy to AkelPad86(4.9.8) i AkelPad64(4.9.7).

Czy to jest wina w moim systemie, czy to AkelPad tak działa?

Posted: Sun Sep 18, 2016 8:10 pm
by KDJ
sexy96

To nie jest błąd.
AkelPad podaje rozmiar czcionki w punktach typograficznych zaokrąlony do liczby całkowitej.
Dokładny rozmiar jest wynikiem przeliczenia wysokości czcionki w pikselach na punkty.
Za pomocą poniższego skryptu odczytasz dokładne wartości:

Code: Select all

var hEditWnd = AkelPad.GetEditWnd();
var hFont;
var aFont;

if (hEditWnd)
{
  hFont = AkelPad.SendMessage(hEditWnd, 0x0031 /*WM_GETFONT*/, 0, 0);
  aFont = GetFontArray(hFont, hEditWnd);

  WScript.Echo("Font name: "   + aFont[0] + "\n" +
               "Font style: "  + aFont[1] + "\n" +
               "Font size: "   + aFont[2] + " (points, rounded)\n" +
               "Font size: "   + aFont[3] + " (points, not rounded)\n" +
               "Font height: " + aFont[4] + " (pixels)");
}

function GetFontArray(hFont, hWnd)
{
  var oSys    = AkelPad.SystemFunction();
  var nLFSize = 28 + 32 * 2; //sizeof(LOGFONTW)
  var lpLF    = AkelPad.MemAlloc(nLFSize);
  var hDC     = oSys.Call("User32::GetDC", hWnd);
  var aFont   = [];
  var nHeight;
  var nWeight;
  var bItalic;

  oSys.Call("Gdi32::GetObjectW", hFont, nLFSize, lpLF);

  nHeight  = AkelPad.MemRead(_PtrAdd(lpLF,  0), 3 /*DT_DWORD*/);   //lfHeight
  nWeight  = AkelPad.MemRead(_PtrAdd(lpLF, 16), 3 /*DT_DWORD*/);   //lfWeight
  bItalic  = AkelPad.MemRead(_PtrAdd(lpLF, 20), 5 /*DT_BYTE*/);    //lfItalic
  aFont[0] = AkelPad.MemRead(_PtrAdd(lpLF, 28), 1 /*DT_UNICODE*/); //lfFaceName
  aFont[2] = -oSys.Call("Kernel32::MulDiv", nHeight, 72, oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/));
  aFont[3] = -nHeight * 72 / oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/);
  aFont[4] = -nHeight;

  if (nWeight < 600)
    aFont[1] = 1;
  else
    aFont[1] = 2;

  if (bItalic)
    aFont[1] += 2;

  oSys.Call("User32::ReleaseDC", hWnd, hDC); 
  AkelPad.MemFree(lpLF);

  return aFont;
}


Posted: Mon Sep 19, 2016 4:07 pm
by sexy96
OK. dzięki

Fatal: Not able to open ./cache/production/data_global.php