![]() |
HtmlHelp-API - HH_Get_Win_Type
Moin, Moin,
bin gerade dabei meine Hilfen von .HLP auf .CHM umzustellen. Units, die auch Delphi7 einen Zugriff auf die HtmlHelp-API ermöglichen, gibt es ja im Internet in vielen Varianten. Für mich ist es besonders wichtig, in MultiMonitorsystemen das Hilfefenster durch das Programm positionieren zu können. Da habe ich für Delphi nix finden können und bin dann bei MSDN gelandet (und bereue es erneut, praktisch keine Kenntnisse in C oder VB zu besitzen). Anyway, habe jetzt folgende Prozedur zusammengebastelt, die es tatsächlich schafft das unmittelbar danach aufzurufende Hilfefenster an eine beliebige Position und eine beliebige Caption zu setzen:
Delphi-Quellcode:
Nun gibt es auch die Konstante HH_Get_Win_Type, mit der man - davon gehe ich mal aus - z.B. die Position und Größe des gerade offenen Hilfefensters ermitteln kann. Wenn ich die Werte setzen kann, dann sollte es doch einfach sein diese auch zu lesen. Habe ich zumindest gedacht. Folgende Prozedur sollte das tun:
procedure TForm1.buSetWinPosClick(Sender:TObject); // call SetWinPos separately
var WT : HH_WinType; // before HelpCall, begin // otherwise HelpWindow will have fillchar(WT,SizeOf(WT),0); // default position and -size with WT do begin cbStruct :=SizeOf(WT); pszType :=PChar('MainWindow'); // name of window type MUST be given!!! fsValidMembers:=HHWin_Param_Rect; // we will change rectangle of helpwindow pszCaption :=PChar('blabla'); // new caption rcWindowPos.Top :=0; // new rcWindowPos.Left :=1051; // position rcWindowPos.Right :=1551; // and rcWindowPos.Bottom:=600; // size end; HtmlHelp(0,PChar(Application.HelpFile),HH_Set_Win_Type,DWord(@WT)); end;
Delphi-Quellcode:
Tja, das tut das Mist-Stück aber nicht. Egal was ich bisher versucht habe, ich bekomme immer die Initialisierungswerte (0) zurück. Kann mir da einer auf die Sprünge helfen?procedure TForm1.buGetWinPosClick(Sender:TObject); // doesn't work ??? var WT : HH_WinType; Hnd : HWND; begin fillchar(WT,SizeOf(WT),0); with WT do begin cbStruct :=SizeOf(WT); pszType :=PChar('MainWindow'); // needed ? fsValidMembers:=HHWin_Param_Rect; // needed ? end; Hnd:=HtmlHelp(0,PChar(Application.HelpFile{+'>MainWindow'}),HH_Get_Win_Type,DWord(@WT)); if Hnd>=0 then with WT.rcWindowPos do begin laLeft. Caption:='Left=' +IntToStr(Left); // always 0 laTop. Caption:='Top=' +IntToStr(Top); // always 0 laRight. Caption:='Right=' +IntToStr(Right); // always 0 laBottom.Caption:='Bottom='+IntToStr(Bottom); // always 0 end; end; Gruß Ralph :wall: PS : Ich gehe mal davon aus, dass diejenigen, die hier helfen können/wollen die InterfaceUnit nicht benötigen (falls doch, werde ich sie als Attachment natürlich nachliefern) |
Re: HtmlHelp-API - HH_Get_Win_Type
Hmmmm, ich bin jetzt im HTML Help auf folgendes gestossen...
bei HH_Set_Win_Type wird der Aufruf wie folgt erklärt ...
Code:
HtmlHelp(
GetDesktopWindow(), "..\\help.chm>mainwin", HH_SET_WIN_TYPE, (DWORD) &WinType) ; // points to an HH_WINTYPE structure bei HH_Get_Win_Type ist die Aufrufkonvention etwas anders (?!- man beachte das kleine p vor WinType) ...
Code:
Tja, daran wird es wohl liegen. Meine Prozeduren übergeben die Datenstruktur "WinType" ja in beiden Prozeduren auf die gleiche Art und Weise - und das ist offenbar falsch. Aber mir schwirrt der Kopf und ich seh' den Wald vor lauter Bäumen nicht mehr. Was muss ich nur anders machen?
HtmlHelp(
GetDesktopWindow(), "Help.chm>mainwin", HH_GET_WIN_TYPE, (DWORD) &pWinType) ; // specifies a pointer to an HH_WINTYPE structure Gruß Ralph |
Re: HtmlHelp-API - HH_Get_Win_Type
Hi! Das sieht ganz danach aus, als würde HH_GET_WIN_TYPE einen Zeiger auf eine WinType-Struktur zurückgeben...
Also ein
Delphi-Quellcode:
Chris
type
pWinType = ^HH_WinType; |
Re: HtmlHelp-API - HH_Get_Win_Type
Hallo Ralph,
bei HH_SET_WIN_TYPE lieferst du einen Zeiger auf deine eigene Struktur, bei HH_GET_WIN_TYPE hingegen erhältst du einen Zeiger auf eine interne Struktur. Probiere es mal so:
Delphi-Quellcode:
Getippt und nicht getestet.
var
pwt: PHHWinType; wt: THHWinType; // ... begin // ... Hnd := HtmlHelp(0, PChar(Application.HelpFile + '>MainWindow'), HH_Get_Win_Type, DWord(@pwt)); end; EDIT: Richtig, Chris - der Zeiger ist ja auch vordefiniert. Freundliche Grüße |
Re: HtmlHelp-API - HH_Set_Win_Type / HH_Get_Win_Type
Hallo Chris, Hallo Achim!
Vielen Dank für die Denkansätze! Es funktioniert jetzt! Diese "Zeigergeschichten" sind mir (leider) immer noch ein Graus :shock: Da war eure Unterstützung und das Gefühl nicht allein zu sein, schon sehr wertvoll! Für die Nachwelt hier noch mal beide Prozeduren in einer leicht verallgemeinerten Form ...
Delphi-Quellcode:
Gruß Ralph :hi:
procedure ~~.SetHtmlWindowPos(NewCaption:String;
Top,Left,Width,Height:Integer); // Aufruf unmittelbar VOR var WT : HH_WinType; // Hilfeaufruf, sonst wird begin // Fenster an vordefinierter fillchar(WT,SizeOf(WT),0); // Position geöffnet with WT do begin cbStruct :=SizeOf(WT); pszType :=PChar('MainWindow'); // << Name des FensterTyps an DIESER Stelle übergeben! fsValidMembers:=HHWin_Param_Rect; // NICHT im Aufruf von HtmlHelp() pszCaption :=PChar(NewCaption); rcWindowPos.Top :=Top; rcWindowPos.Left :=Left; rcWindowPos.Right :=Left+Width; rcWindowPos.Bottom:=Top+Height; end; HtmlHelp(0,PChar(Application.HelpFile),HH_Set_Win_Type,DWord(@WT)); end; function ~~.GetHtmlWindowPos(var iLeft, iTop, iWidth, iHeight:Integer):Boolean; // Ermittelt NUR die aktuell var WT : HH_WinType; // gültige "Startposition/-größe" pWT : ^HH_WinType; // Werte eines von Anwender Hnd : HWND; // verschobenen/in der Größe veränderten begin // Fensters werden NICHT zurückgeliefert! Result:=false; pWT:=@WT; fillchar(pWT^,SizeOf(pWT^),0); pWT^.cbStruct:=SizeOf(pWT^); // v- Name des FensterTyps an DIESER Stelle übergeben! Hnd:=HtmlHelp(0,PChar(Application.HelpFile+'>MainWindow'),HH_Get_Win_Type,DWord(@pWT)); if Hnd>0 then with pWT^.rcWindowPos do begin iLeft :=Left; iTop :=Top; iWidth :=succ(Right-Left); iHeight:=succ(Bottom-Top); Result:=true; end; end; //edit: Tippfehler beseitigt |
Re: HtmlHelp-API - HH_Get_Win_Type
Hihihihi,
noch ein (letzter) Nachtrag - der wiederum zeigt, wie sehr das jetzt ein "Basteln" war. Es geht offenbar noch kürzer:
Delphi-Quellcode:
Zu beachten ist aber folgender Hinweis aus der Html Help, wenn man das Ergebnis verändern will ...
function ~~.GetHtmlWindowPos(var iLeft,
iTop, iWidth, iHeight:Integer):Boolean; // Ermittelt NUR die aktuell // gültige "Startposition/-größe" var pWT : ^HH_WinType; // Werte eines von Anwender Hnd : HWND; // verschobenen/in der Größe veränderten begin // Fensters werden NICHT zurückgeliefert! Result:=false; // v- Name des FensterTyps an DIESER Stelle übergeben! Hnd:=HtmlHelp(0,PChar(Application.HelpFile+'>MainWindow'),HH_Get_Win_Type,DWord(@pWT)); if Hnd>0 then with pWT^.rcWindowPos do begin iLeft :=Left; iTop :=Top; iWidth :=succ(Right-Left); iHeight:=succ(Bottom-Top); Result:=true; end; end; Zitat:
//edit: Tippfehler beseitigt |
Re: HtmlHelp-API - HH_Get_Win_Type
Moin, Moin,
zur Anwendung der Prozedur SetHtmlWindowPos muss ich eine ergänzende Bemerkung nachliefern. Der Hinweis Zitat:
Gruß Ralph |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz