Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi HtmlHelp-API - HH_Get_Win_Type (https://www.delphipraxis.net/106548-htmlhelp-api-hh_get_win_type.html)

taaktaak 12. Jan 2008 17:39


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:
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;
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:

Delphi-Quellcode:
 
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;
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?

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)

taaktaak 12. Jan 2008 18:31

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:
 HtmlHelp(
          GetDesktopWindow(),
          "Help.chm>mainwin",
          HH_GET_WIN_TYPE,
          (DWORD) &pWinType) ; // specifies a pointer to an HH_WINTYPE structure
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?

Gruß Ralph

CK_CK 12. Jan 2008 19:14

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:
type
pWinType = ^HH_WinType;
Chris

marabu 12. Jan 2008 19:21

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:
var
  pwt: PHHWinType;
  wt: THHWinType;
  // ...
begin
  // ...
  Hnd := HtmlHelp(0, PChar(Application.HelpFile + '>MainWindow'), HH_Get_Win_Type, DWord(@pwt));
end;
Getippt und nicht getestet.

EDIT: Richtig, Chris - der Zeiger ist ja auch vordefiniert.

Freundliche Grüße

taaktaak 12. Jan 2008 20:32

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:
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;
Gruß Ralph :hi:

//edit: Tippfehler beseitigt

taaktaak 12. Jan 2008 20:58

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:
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;
Zu beachten ist aber folgender Hinweis aus der Html Help, wenn man das Ergebnis verändern will ...

Zitat:

"Deep copy the structure to which dwData points before modifying the structure"
Gruß Ralph :-D

//edit: Tippfehler beseitigt

taaktaak 14. Jan 2008 18:25

Re: HtmlHelp-API - HH_Get_Win_Type
 
Moin, Moin,
zur Anwendung der Prozedur SetHtmlWindowPos muss ich eine ergänzende Bemerkung nachliefern. Der Hinweis

Zitat:

// Aufruf unmittelbar VOR
// Hilfeaufruf, sonst wird
// Fenster an vordefinierter
// Position geöffnet
ist nur gültig, wenn das benannte Fenster (d.h. WindowType) im HTML Help Workshop OHNE die Option "Save user defined window position after first use" definiert wurde. Ist diese Option aktiviert, korrigiert das Anzeigeprogramm die von dieser Prozedur gesetzte Position/Größe sofort wieder auf die vom Anwender zuletzt eingestellte Position/Größe - d.h. in diesem Fall muss die Prozedur NACH dem Aufruf der Hilfeseite erfolgen.
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