001
22.01.2006, 01:43 Uhr
overcast
|
Hallo,
ein kleiner Nachtrag (diesmal mit Useraccount ) ich habe ein weiteres Problem bei Verwendung von Manifesten entdeckt Bei Verwendung eines XP-Manifests wurden die Separator nicht korrekt restored. Die Separator wurden mit iBitmap=0 definiert, was ohne Manifest problemlos funktioniert.
C++: |
TBBUTTON tbButtonMain[] = { 0, 0, TBSTATE_ENABLED, BTNS_SEP, 0, 0, 0, -1, 0, MN_OPEN, TBSTATE_ENABLED, BTNS_BUTTON , 0, 0, 0, 0, 1, MN_SAVE, TBSTATE_ENABLED , BTNS_BUTTON , 0, 0, 0, 1, etc. }
|
Auszug aus http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/toolbar/structures/tbbutton.asp
Zitat von MSDN: |
"If the button is a separator, that is, if fsStyle is set to BTNS_SEP, iBitmap determines the width of the separator, in pixels. For information on selecting button images from image lists, see TB_SETIMAGELIST message."
|
Im Comctl32 Source kann man sehen, dass beim Wert und UND Verwendung eines Manifests eine Defaultbreite von 8 gesetzt wird. Obwohl diese bei TBN_RESORE für BTNS_SEP auch zurückgeliefert wird, so wird sie nicht korrekt in der Toolbar dargestellt.
Lösung bzw. Workaround bei Verwendung von Manifesten: Setzen des iBitmap Members von TBBUTTON für BTNS_SEP Elemente auf einen Defaultwert (ideal: ebenfalls 8).
Allerdings tappe ich weiterhin im Dunkeln, warum iBitmap für normale Buttons als -1 zurückgelesen wird, so dass ich hier einen Bug vermute.
Bis zur Lösung nutze ich also folgenden Code nebst Workaround:
C++: |
case TBN_SAVE: { LPNMTBSAVE lpnmtb = (LPNMTBSAVE) lParam; if( lpnmtb->iItem == -1) { lpnmtb->pData = (DWORD*) GlobalAlloc(GPTR, lpnmtb->cbData); lpnmtb->pCurrent = lpnmtb->pData; } return 0; } case TBN_RESTORE: { LPNMTBRESTORE lpnmtb = (LPNMTBRESTORE) lParam; if( lpnmtb->iItem != -1) { // Workaround to correct the invalid iBitmap member lpnmtb->tbButton.iBitmap = tbButtonMain[lpnmtb->iItem].iBitmap; } return 0; }
|
Interessant ist auch die Tatsache, dass die MFC-Dokumentation für die TBBUTTON-Struktur andere Informationen liefert:
Zitat von MSDN: |
Remarks The lpButtons pointer points to an array of TBBUTTON structures. Each TBBUTTON structure associates the button being added with the button's style, image and/or string, command ID, state, and user-defined data:
typedef struct _TBBUTTON { int iBitmap;// zero-based index of button image int idCommand; // command to be sent when button pressed BYTE fsState; // button state--see below BYTE fsStyle; // button style--see below DWORD dwData; // application-defined value int iString;// zero-based index of button label string } TBBUTTON; The members are as follows:
iBitmap Zero-based index of button image, -1 if no image for this button.
|
Der Struktur fehlt also das Member "BYTE bReserved[2] // padding for alignment" und iBitmap ist nicht die SEP-Breite, sondern soll auf -1 gesetzt werden.
Denke, dass der Umstieg auf die MFC dadurch nicht unbedingt erleichtert wird
Gruss, Frank. |