uaip
Messages postés1466Date d'inscriptionmardi 20 février 2007StatutMembreDernière intervention 7 février 2011
-
12 déc. 2008 à 17:19
uaip
Messages postés1466Date d'inscriptionmardi 20 février 2007StatutMembreDernière intervention 7 février 2011
-
12 déc. 2008 à 17:56
Bonjour.
Comme cité dans le titre, j'ai remarqué que mon programme (encore en cours de construction) ne s'ouvrait que sur mon PC (XP sp2). J'ai essayé sur une autre machine de même type, le programme ne s'ouvre même pas et on entend le "beep" d'erreur de Windows. Idem pour une troisième machine (Windows 2000 je crois).
Après de nombreuses recherches, je me suis dit que le problème venait de la compilation debug/release. Or sur ma version de Code::Blocks, je n'ai pas trouvé d'options de ce type (et Dieu sait si j'ai cherché). En plus le débugeur fait tout planter, donc ça doit compiler "automatiquement" en release.
N'étant pas un pro dans l'utilisation d'un IDE, je me suis ensuite tourné vers les links. J'ai viré toutes les bibliothèques relatives à mon PC (OpenGL, FMOD, etc) mais toujours pareil.
En testant alors le code ligne après ligne, je me suis (enfin !) rendu compte que c'était la création de ma REBAR qui posait problème.
Cependant, je voudrais absoluement la mettre (question de design). Mais du coup je ne sais pas comment faire pour que le programme soit exécutable sur tous les PC.
Au cas où, voilà quelques lignes de la REBAR.
J'ai d'abord ça : (mais ça ne pose aucun problème puisque mes anciens programmes l'ont et sont ouvrables partout)
#define _WIN32_IE 0x0500
Et voilà la fonction d'initialisation de la REBAR : (j'ai grisé les lignes qui ajoutent un COMBO et une TOOLBAR dans la REBAR pour plus de clarté)
bool InitRebar(HWND hwnd)
{
HINSTANCE hinstance= hinst;
hwndRebar=CreateWindowEx(WS_EX_TOOLWINDOW , REBARCLASSNAME,NULL, WS_CLIPCHILDREN|RBS_BANDBORDERS|WS_CHILD|WS_VISIBLE|RBS_VERTICALGRIPPER
,0,0,200,50,hwnd,(HMENU)NULL,hinstance, NULL); htb =CreateWindowEx(0,TOOLBARCLASSNAME,NULL,WS_CHILD|WS_VISIBLE|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|TBSTYLE_WRAPABLE,50,0,0,0,hwndRebar,(HMENU)ID_TOOLBAR,hinst,NULL);
SendMessage(htb,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);
SendMessage(htb,TB_SETBUTTONSIZE,0,MAKELONG(16,16));
int ToolBar_elts[]=
{
1,2,3,-1,7,8,-1,9,10,11,16,-1,12,-1,ID_COMBO,-1,0,ID_START,ID_STOP
};
int nbButtons=0;
for(int i=0;i < (sizeof(ToolBar_elts)/sizeof(int));i++)
if (ToolBar_elts[i] != -1)
nbButtons++;
TBADDBITMAP tbBmp=
{
0
};
tbBmp.hInst=hinst;
tbBmp.nID=IDC_TOOLBAR;
SendMessage(htb,TB_ADDBITMAP,nbButtons,(LPARAM)&tbBmp);
int index=0;
for (int i=0;i < (sizeof(ToolBar_elts)/sizeof(int));i++)
{
TBBUTTON tbButton=
{
0
};
if (ToolBar_elts[i] == -1)
tbButton.fsStyle=TBSTYLE_SEP;
else if (ToolBar_elts[i] == ID_COMBO)
{
tbButton.iBitmap=-1;
tbButton.idCommand=ToolBar_elts[i];
tbButton.fsState=TBSTATE_ENABLED;
tbButton.fsStyle=TBSTYLE_BUTTON;
}
else
{
tbButton.iBitmap=index++;
tbButton.idCommand=ToolBar_elts[i];
if ((ToolBar_elts[i] != ID_UNDO) &&
(ToolBar_elts[i] != ID_REDO) && (ToolBar_elts[i] != ID_STOP))
tbButton.fsState=TBSTATE_ENABLED;
tbButton.fsStyle=TBSTYLE_BUTTON|BTNS_WHOLEDROPDOWN;
}
SendMessage(htb,TB_ADDBUTTONS,1,(LPARAM)&tbButton);
}
//Modification la largeur du combo
TBBUTTONINFOA tbinfo;
ZeroMemory(&tbinfo,sizeof(TBBUTTONINFOA));
tbinfo.cbSize=sizeof(TBBUTTONINFOA);
tbinfo.dwMask=64;
tbinfo.cx=170;
SendMessage(htb,(WM_USER+66),ID_COMBO,(LPARAM)&tbinfo);
//Récupération de l'index du boutton et de son emplacement
int indexx=SendMessage(htb,TB_COMMANDTOINDEX,ID_COMBO,0);
RECT rect;
SendMessage(htb,TB_GETITEMRECT,indexx,(LPARAM)&rect);
//Séparateur -> combo
hCombo=CreateWindow("Combobox",NULL,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_VSCROLL,rect.left,rect.top+2,rect.right-rect.left,200,htb,(HMENU)ID_COMBO,hinst,NULL);
ShowWindow(hCombo,SW_SHOW);
SendMessage(hCombo,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
UpdateWindow(htb);
//Création d'une "Band", conteneur qui sera inseré dans la Rebar
REBARBANDINFO rbBand ;
rbBand.cbSize =sizeof(REBARBANDINFO); rbBand.hwndChild= htb ;
rbBand.cyMinChild =28; //Ajout de la Band créée ci-dessus dans la Rebar
SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand); //2ème Band pour la note du manche de guitare
rbBand.fMask= RBBIM_TEXT|RBBIM_HEADERSIZE|RBBIM_STYLE ;
rbBand.fStyle =RBBS_NOGRIPPER; rbBand.cxHeader= 160 ;
rbBand.lpText ="Note : aucune"; SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand); //3ème Band pour l'accordage du manche de guitare
rbBand.lpText= "..." ;
rbBand.cxHeader =100; SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand); //3ème Band pour l'accordage du manche de guitare
rbBand.lpText= "..." ; rbBand.cxHeader =200; SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand); //Initialisation du combo
SendMessage(hCombo,CB_RESETCONTENT,0,0);
char* tok=strtok(data,"$");
while(tok != NULL)
{
if (tok[0] != '-')
SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)tok);
tok=strtok(NULL,"$");
}
SendMessage(hCombo,CB_SETCURSEL,25,0);
if((hwndRebar) && (htb))
returntrue; returnfalse; }
Donc je dois faire quoi, tester la version de Windows et afficher (ou non) la REBAR ? J'ai oublié de préciser des éléments ?
Merci d'avance à quiconque aura le courage de lire tout ça .
uaip
Messages postés1466Date d'inscriptionmardi 20 février 2007StatutMembreDernière intervention 7 février 2011 12 déc. 2008 à 17:56
Arf, exact, j'avais oublié ceci... Grosse erreur de ma part (étant donné que je copie/colle souvent des morceaux des certaines de mes programmes à d'autres, j'en oublie l'essentiel, et comme je vois que ça compile, je ne me pose pas de question).
Merci beaucoup BruNews.
Je mets ici le code au cas où certains auraient le même soucis :
INITCOMMONCONTROLSEX icex; icex.dwSize= sizeof (INITCOMMONCONTROLSEX); icex.dwICC =ICC_BAR_CLASSES; InitCommonControlsEx(&icex);
Et puis bon, ça m'évitera de m'arracher les cheveux pour des choses aussi "évidentes".