Toolbar iString -> Tooltip

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Toolbar iString -> Tooltip

Beitragvon AUGE_OHR » Di, 03. Mär 2015 3:08

was manchmal funktioniert und doch nicht richtig ist ...

ich hatte meine DXE_Toolbar ja schon vor einige Zeit veröffentlicht und auch eingesetzt.
nun kam letztens eine Anfrage wegen Tooltip und ich dachte mir das kann ja kein "grosses" Problem sein.

es gab einige Konstanten die man setzten musste und damit funktionierte es auch ... wenn man sich an "einen" Weg hält.
Code: Alles auswählen
a.) oToobar:AddItem(cCaption, xImage, xDisabledImage, xHotImage, cDLL, nStyle, cKey ... )
und das ging nicht
Code: Alles auswählen
b.) oButton := oToobar:AddItem()
    oButton:Caption := cCaption
    oButton:Image   := xImage
na gut ... also mussten paar
Code: Alles auswählen
INLINE ASSIGN METHOD _Caption(xValue)           VAR Caption
INLINE ASSIGN METHOD _image(xValue)             VAR image
INLINE ASSIGN METHOD _key(xValue)               VAR key
INLINE ASSIGN METHOD _tooltipText(xValue)       VAR tooltipText
Methode her um "nachträglich" was zu ändern was auch im Prinzip funktionierte ... da gab es noch den Tooltip ...

ich habe dabei die "simple" Lösung gewählt
The only way that the automatic tooltip is going to be shown is if the button's text doesn't fit.
Sending the TB_SETMAXTEXTROWS message ensures that the text will never fit by setting the maximum number of rows available for text to 0.
und das daraus gemacht
Code: Alles auswählen
SendMessage(hWndToolbar, TB_SETMAXTEXTROWS, 0, 0)
und dieser Trick funktioniert ;)
... aber leider bekomme ich keinen Tooltip wenn ich nachträglich, nach Version b.), die Caption setzte und der Button die Caption haben "müsste" ... :angry5:


ich musste immer tiefer im Source graben bis ich auf ein ursprüngliches Workaround gestossen bin was die ganz Zeit funktionierte. es ging um den iString in der Structure TTButton
https://msdn.microsoft.com/en-us/library/windows/desktop/bb760476%28v=vs.85%29.aspx
iString

Type: INT_PTR

Zero-based index of the button string, or a pointer to a string buffer that contains text for the button.
den ich nicht kannte und durch DYNSZ cString ersetzt hatte.
Code: Alles auswählen
* Toolbar Button Structure
*
* here iString DYNSZ is different
* vs.
* ot4xb winapi_CommonStructures.cpp
*
 BEGIN STRUCTURE TBBUTTON
    MEMBER int       iBitmap
    MEMBER int       idCommand
    MEMBER BYTE      fsState
    MEMBER BYTE      fsStyle
    MEMBER BINSTR    bReserved SIZE 2
    MEMBER POINTER32 dwData
    MEMBER LPSTR     iString DYNSZ cString // als "normalen" String
 END STRUCTURE
wie schon gesagt funktionierte das gut mit
Code: Alles auswählen
   oTbButton:cString    := oButton:Caption

   @user32:SendMessageA(::hToolbar, TB_BUTTONSTRUCTSIZE, oTbButton:_sizeof_() , 0)
   @user32:SendMessageA(::hToolbar, TB_ADDBUTTONS, 1, oTbButton )
aber eben nur aber nur die a.) Varianten und bei mehreren TTbuttons müsste man, wie in einer DBF, erst zum passenden Satz "skippen"
Code: Alles auswählen
   oTbButton := TBBUTTON():New()
   pBuffer := _xgrab( oTbButton:_sizeof_() )
   oTbButton:_link_(  pBuffer , .F. ) // link to the first item

   FOR i := 1 TO iMax
      IF oTbButton:idCommand = xValue
         oTbButton:cString   := NewText
         EXIT
      ENDIF
      GwstArrayNext(oTbButton) // go to the next item
   NEXT

   oTbButton:_unlink_()
   _xfree( pBuffer)
   oTbButton := NIL
und auch hier wieder das Ergebnis das der Button die Caption hat ... aber die b.) Variante kein Tooltip anzeigt :banghead:

beim google entdeckte ich dann diesen C# Code
Code: Alles auswählen
//Button Strings
LPSTR toolStrings[ ] = {
"New", "Open", "Save","", "Refresh", "", "Cut", "Copy", "Paste","Undo","","Find","","Calculator",
};


// Associate strings with buttons
for (index = 0;index < 14;index++) {
   if (*toolStrings[index] != *"")
      tbb[index].iString = SendMessage(hwndTB, TB_ADDSTRING, 0, (LPARAM) (LPSTR) toolStrings[index]);
   else tbb[index].iString = 0;
}
da war also mein iString ... aber die Syntax ... hm :-k

nun gibt TB_ADDSTRING den Index, also numerisch zurück
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787293%28v=vs.85%29.aspx

also habe ich meinen Code umgestellt auf
Code: Alles auswählen
   oTbButton:iString := @user32:SendMessageA(::hToolbar,TB_ADDSTRING,0,::aItems[nNo][_cCaption])
und das funktioniert mit (simple) Tooltip =D> ... aber nur die a.) Varianten mit Tooltip :angry4:

allerdings war es bis zur Lösung nur noch ein kurzer Schritt
Code: Alles auswählen
   @user32:SendMessageA(::hToolbar,TB_DELETEBUTTON,nNo-1,0) // zero-based Index
also vorher den alten Button löschen ;)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10206
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Zurück zu Windows, API

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast