[Delphi] dialog units naar pixels omrekenen

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Topicstarter
Kort vraagje waarvan ik nergens het antwoord kan vinden: hoe reken ik dialog units om naar pixels?

Een goede grap mag vrienden kosten.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22-08 10:45

mulder

ik spuug op het trottoir

oogjes open, snaveltjes dicht


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Topicstarter
Kom op, niet zo flauw, dacht je dat ik dat niet geprobeerd had? Er verschijnt een ongelooflijke rij verwijzingen naar code in C of C++ waar ik niet zo veel mee kan. In Delphi help kan ik het antwoord niet vinden en in P&W ook niet.

Een goede grap mag vrienden kosten.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22-08 10:45

mulder

ik spuug op het trottoir

Die eerste link geeft toch aardig wat aanknopingspunten dacht ik zo :? Er staan een aantal API's die je net zo goed in Delphi kunt gebruiken. En die API's staan ook weer in de Delphi help ;)

oogjes open, snaveltjes dicht


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een dialog unit is 1/8 van de hoogte van een hoofdletter in het font van een dialog (meestal Sans Serif 8pt), maar ze zijn een beetje uit de mode geraakt sinds TrueType fonts en het verdwijnen van win3.11. Mag ik vragen waarom je ze nodig hebt? Misschien is er een modernere oplossing voor je probleem.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
tomatoman schreef op 09 maart 2003 @ 18:33:
Kom op, niet zo flauw, dacht je dat ik dat niet geprobeerd had? Er verschijnt een ongelooflijke rij verwijzingen naar code in C of C++ waar ik niet zo veel mee kan. In Delphi help kan ik het antwoord niet vinden en in P&W ook niet.


Zoals Don Facundo al zegt: je krijgt hiermee toch een hele hoop tips? C/C++ code kan je toch makkelijk naar Delphi-code omzetten? Vanuit Delphi kan je ook API calls doen, etc...

https://fgheysels.github.io/


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
niet alle api calls zijn goed omgezet in delphi. Sommige api calls die beschikbaar zijn in C/C++ zijn niet aanwezig in Delphi volgens mij

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Just_a_Gamer schreef op 09 March 2003 @ 19:14:
niet alle api calls zijn goed omgezet in delphi. Sommige api calls die beschikbaar zijn in C/C++ zijn niet aanwezig in Delphi volgens mij
Het wel of niet kunnen maken van een API call heeft niet zo zeer met de taal te maken. Omdat MicroSoft zijn API's ook defineerd in C is het vaak sneller in C/C++ compilers te vinden. API call's zijn niets anders dan aanroepen van functies in bepaalde DLL's. Als je de juiste import van de DLL functie in Delphi maakt kan je de functie aanroepen. Als je het allemaal niet zelf wilt doen kan je op www.delphi-jedi.org een meer completere vertaling vinden van de WinAPI en andere API's.

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Topicstarter
LordLarry schreef op 09 March 2003 @ 19:00:
Mag ik vragen waarom je ze nodig hebt? Misschien is er een modernere oplossing voor je probleem.
Ik ben bezig om een wizard in Windows 2000-stijl te implementeren in een TComponent met behulp van een property sheet. Na ruim duizend regels code is die bijna af, maar ik zat met het probleem dat de layout van het niet-gereserveerde gebied in de welkomstpagina van de wizard (waar je zelf al je contols in mag pleuren) alleen in dialog units is gedefinieerd en niet in pixels. Datzelfde geldt voor de uitlijning van allerlei controls op de wizardpagina's (zie hier). Daar werd ik niet zo blij van.

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Topicstarter
[knip]

[ Voor 99% gewijzigd door Tomatoman op 09-03-2003 19:52 . Reden: verkeerde knop gedrukt (quote i.p.v. edit) ]

Een goede grap mag vrienden kosten.


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
LordLarry schreef op 09 maart 2003 @ 19:29:
[...]

Het wel of niet kunnen maken van een API call heeft niet zo zeer met de taal te maken. Omdat MicroSoft zijn API's ook defineerd in C is het vaak sneller in C/C++ compilers te vinden. API call's zijn niets anders dan aanroepen van functies in bepaalde DLL's. Als je de juiste import van de DLL functie in Delphi maakt kan je de functie aanroepen. Als je het allemaal niet zelf wilt doen kan je op www.delphi-jedi.org een meer completere vertaling vinden van de WinAPI en andere API's.
Weer wat bijgeleerd :)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Topicstarter
Het wil nog niet lukken. Ik heb GetDialogBaseUnits gedefinieerd:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface

var
  AveCharSize: TPoint;

function GetDialogBaseUnits: TSmallPoint; stdcall;

implementation

function GetDialogBaseUnits: TSmallPoint; external user32
  name 'GetDialogBaseUnits';

initialization
  AveCharSize.X := MulDiv(GetDialogBaseUnits.x, 72, Screen.PixelsPerInch);
  AveCharSize.Y := MulDiv(GetDialogBaseUnits.y, 72, Screen.PixelsPerInch);
end;
Daarna kan er vrolijk worden omgenummerd:
Delphi:
1
2
3
4
5
function DlusToPixels(Dlus: TPoint): TPoint;
begin
  Result.X := MulDiv(Dlus.X, AveCharSize.X, 4);
  Result.Y := MulDiv(Dlus.Y, AveCharSize.Y, 8);
end;

Aan de manier te zien waarop de wizard zichtbaar wordt, is AveCharSize niet goed berekend. AveCharSize krijgt de waarde (6, 12). Na wat terugrekenen aan de hand van wat ik in de wizard had moeten zien, kom ik tot de conclusie dat AveCharSize eigenlijk de waarde (6, 13) had moeten hebben. Anders gezegd: mijn plaatje is niet iets te weinig uitgerekt in de hoogte.

Ik heb ook nog een andere berekening geprobeerd aan de hand van GetExtentPoint, maar ook dan krijg ik de foutieve waarde (6,12).

Ziet iemand wat ik fout doe?

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Topicstarter
Voor de geïnteresseerden:
Na veel testen heb ik niet één keer gezien dat de venstergrootte anders werd, hoe ik de Windows-instellingen voor knopgrootte, standaardlettertype en dergelijke ook instelde. AveCharSize zou dus ook onveranderlijk (6, 13) moeten zijn. Daarom heb ik het mezelf gemakkelijk gemaakt en AveCharSize hard gecodeerd:
AveCharSize := Point(6, 13);

Case closed :)

Een goede grap mag vrienden kosten.

Pagina: 1