[API Win32] Rebar qui ne s'affiche pas dans DialogBox

Rebar qui ne s'affiche pas dans DialogBox [API Win32] - API Win32 - Programmation

Marsh Posté le 15-12-2007 à 16:06:40    

Salut  :hello:  
 
Je suis en train d'essayer d'utiliser le control Rebar, je souhaite l'inclure dans ma fenetre mais rien ne s'affiche. Tout compile tres bien.
 
Quelques precisions :
- pas de MFC utilisees ici, tout en win32.
- DialogBox & fichier .rc utilises pour construire la boite de dialogue, pas de CreateWindow donc.
- Application Unicode
- compilation avec Visual C++ 2008 Express edition, Windows XP SP2
 
Initialisation en regle pour l'utilisation de Rebar (et eventuellement une Toolbar classique aussi), ceci apres le RegisterClass dans le WinMain.

Code :
  1. INITCOMMONCONTROLSEX icex;
  2. icex.dwSize = sizeof INITCOMMONCONTROLSEX;
  3. icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
  4. InitCommonControlsEx(&icex);


ensuite, appel de la macro DialogBox pour creer et affiche la boite de dialogue :

Code :
  1. DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC) DlgProc);


et enfin creation de la Rebar dans la DialogProc (WM_INITDIALOG) :

Code :
  1. BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2. {
  3. // ....
  4. case WM_INITDIALOG:
  5. // creation de la Rebar
  6. HWND hwndRebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,
  7. RBS_BANDBORDERS | RBS_VARHEIGHT | CCS_NODIVIDER | CCS_NOPARENTALIGN | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, 0, 0, 480, 20, hDlg, (HMENU)NULL, hInstance, NULL);
  8. // creation d'un bouton destine a aller dans la rebar
  9. HWND hButton = CreateWindowEx(WS_EX_TOOLWINDOW, WC_BUTTON, TEXT("test" ), WS_VISIBLE | WS_CHILD, 0, 0, 50, 14, hwndRebar, (HMENU)NULL, hInstance, NULL);
  10. // creation d'une "Band", conteneur qui sera insere dans la Rebar
  11. REBARBANDINFO rbBand;
  12. rbBand.cbSize = sizeof REBARBANDINFO;
  13. rbBand.fMask = RBBIM_STYLE | RBBIM_TEXT | RBBIM_SIZE | RBBIM_CHILD;
  14. rbBand.fStyle = RBBS_CHILDEDGE | RBBS_GRIPPERALWAYS;
  15. rbBand.lpText = TEXT("Font" );
  16. rbBand.cx = 480;
  17. rbBand.hwndChild = hButton;
  18. // ajout de la Band dans la Rebar
  19. SendMessage(hwndRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
  20. return TRUE;
  21. // ... autres messages
  22. }


 
ha et puis un extrait du .RC concernant la boite de dialogue

Code :
  1. IDD_MAIN DIALOGEX 0, 0, 480, 250
  2. STYLE WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SIZEBOX | DS_SHELLFONT | DS_CENTER
  3. CAPTION "ColumnReader"
  4. FONT 8, "MS Shell Dlg"
  5. BEGIN
  6. // ... 2 RichEdit controls uniquement ici
  7. END


 
j'ai essaye au debut de creer la rebar comme mes autres controles dans le fichier RC mais vu que rien n'etait rendu a l'ecran j'ai decider de coller un peu plus a la doc et le faire avec un CreateWindowEx... sans grand resultat.
 
La premiere question qui m'est venue et n'est pas explicitee dans MSDN, est est-ce que le hwnd parent du controle qui sera dans la rebar (hButton ici) doit etre la dialog box (hDlg) ou la rebar (hwndRebar) ?
Le plus logique serait hwndRebar comme parent. Enfin ca ne resoud pas le probleme.
 
Toujours est-il que strictement rien n'est affiche / peint dans la boite de dialogue.
(InitCommonControlsEx() est appelee avec succes j'ai verifie)
Si quelqu'un a une idee...
 
merci
 :)

Reply

Marsh Posté le 15-12-2007 à 16:06:40   

Reply

Marsh Posté le 27-09-2008 à 11:21:37    

Bonjour
Désolé du retard, je ne sais pas si la question est toujours d'actualité  :D  
 
Avant d'ajouter les 'band' il faut initialiser la rebar:
REBARINFO  rbInfo;
 
ZeroMemory(&rbInfo, sizeof(REBARINFO));
rbInfo.cbSize = sizeof(REBARINFO);
SendMessage(hwndRebar, RB_SETREBARINFO, (WPARAM)0, (LPARAM)&rbInfo);
 
voilà  :D  
 
Jean

Reply

Marsh Posté le 27-09-2008 à 13:27:35    

Je n'ai pas réessayé depuis, merci pour la réponse c'est toujours un élément de plus.
 
Après de plus amples recherches, le problème semble (aussi ?) venir de la définition de REBARBANDINFO suivant les différents systèmes (XP, Vista).
 
C'est bien expliqué ici : http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3020349&SiteID=1
 
Rq: c'est toujours un problème d'initialisation de structure.
 
Je devrais bientôt retester, affaire à suivre...

Reply

Marsh Posté le 27-09-2008 à 15:09:26    

oui, c'est à ça que sert le cbSize.
 
perso j'ajoute toujours
#define _WIN32_WINNT  0x561
#define _WIN32_IE 0x600

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed