Code sans erreurs mais rien ne s'affiche! [Résolu]

Signaler
Messages postés
24
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
24 mars 2008
-
Messages postés
24
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
24 mars 2008
-
Salut à tous,
voilà j'ai un petit projet qui se compile sans erreurs.
(déjà écrit sous Borland C++ Builder)

mais à l'exécution( sous DevC++ ), rien ne s'affiche !
quelqu'un pourrait me dire d'ou vient l'erreur?

Pour renseignement je donne les sources:

//main.c
#include <windows.h>
#include <cstdio>
using namespace std;

#ifdef __BORLANDC__
#pragma argsused
#endif

#include "resource.h"
//---------------------------------------------------------------------------
HWND hWnd;
HINSTANCE hInst;
BOOL CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONTROLSDLG),
hWnd, reinterpret_cast<DLGPROC>(DlgProc));

hInst = hInstance;

return 0;
}
//---------------------------------------------------------------------------
BOOL CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{

char strMarkedPrice[20], strTaxRate[20], strTaxAmount[20], strNetPrice[20];
HWND hWndMarkedPrice, hWndTaxRate, hWndTaxAmount, hWndNetPrice;
double MarkedPrice, TaxRate, TaxAmount, NetPrice;

hWndMarkedPrice = GetDlgItem(hWndDlg, IDC_MARKED_PRICE);
hWndTaxRate = GetDlgItem(hWndDlg, IDC_TAX_RATE);
hWndTaxAmount = GetDlgItem(hWndDlg, IDC_TAX_AMOUNT);
hWndNetPrice = GetDlgItem(hWndDlg, IDC_NET_PRICE);

switch(Msg)
{
case WM_INITDIALOG:
SetWindowText(hWndMarkedPrice, "0.00");
SetWindowText(hWndTaxRate, "5.75");
SetWindowText(hWndTaxAmount, "0.00");
SetWindowText(hWndNetPrice, "0.00");
return TRUE;

case WM_COMMAND:
switch(wParam)
{
case IDC_CALCULATE_BTN:
GetWindowText(hWndMarkedPrice, strMarkedPrice, 20);
GetWindowText(hWndTaxRate, strTaxRate, 20);

MarkedPrice = atof(strMarkedPrice);
TaxRate = atof(strTaxRate) / 100;

TaxAmount = MarkedPrice * TaxRate;
NetPrice = MarkedPrice + TaxAmount;

sprintf(strTaxAmount, "%.2f", TaxAmount);
sprintf(strNetPrice, "%.2f", NetPrice);

SetWindowText(hWndTaxAmount, strTaxAmount);
SetWindowText(hWndNetPrice, strNetPrice);

return TRUE;
case IDCANCEL:
EndDialog(hWndDlg, 0);
return TRUE;
}
break;
}

return FALSE;
}
//-----------------

//resource.rc
#include "resource.h"

IDD_CONTROLSDLG DIALOG 260, 200, 188, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Net Price Calculation"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Marked Price:",IDC_STATIC,10,11,45,8
EDITTEXT IDC_MARKED_PRICE,65,9,55,12,ES_RIGHT | ES_AUTOHSCROLL
LTEXT "Tax Rate:",IDC_STATIC,10,32,32,8
EDITTEXT IDC_TAX_RATE,65,30,45,12,ES_RIGHT | ES_AUTOHSCROLL
LTEXT "%",IDC_STATIC,112,32,10,8
PUSHBUTTON "Calculate",IDC_CALCULATE_BTN,130,30,50,14
PUSHBUTTON "Close",IDCANCEL,130,70,50,14
LTEXT "Tax Amount:",IDC_STATIC,10,52,41,8
EDITTEXT IDC_TAX_AMOUNT,65,50,55,12,ES_RIGHT | ES_AUTOHSCROLL
LTEXT "Net Price:",IDC_STATIC,10,73,32,8
EDITTEXT IDC_NET_PRICE,65,71,55,12,ES_RIGHT | ES_AUTOHSCROLL
END

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN , 7
RIGHTMARGIN , 179
TOPMARGIN , 7
BOTTOMMARGIN, 88
END
END
#endif

//-------------------------------------

//resource.h
#define IDD_CONTROLSDLG 101
#define IDC_MARKED_PRICE 104
#define IDC_TAX_RATE 106
#define IDC_CALCULATE_BTN 107
#define IDC_TAX_AMOUNT 109
#define IDC_NET_PRICE 110

15 réponses

Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Faut que j'aille prendre mes pillules, mon francais devient obscur.. Voila le post précédent une fois francisé..

"
C'est bien ce que je disais... tu as du faire les mêmes modif que moi.

Ce code n'a pas pu être compilé, je n'avais pas révé ! Encore une fois, faire attention aux confusions C/C++ ...
Surtout
cela serait sympa quand on poste un message de ne pas commencer par
dire que le code compile parfaitement alors qu'il est incompilable..
A
moins que le code aie été modifié sans que le fichier obj n'aie été recrée
pour une raison x ce qui aurait pu induire en erreur Etaxi...

Qu'en pense notre ami Etaxi ?
"
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Pour les messages non gérés tu devrais mettre DefWindowProc, c'est peut être ça qui empêche l'affichage.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Oups désolé j'ai rien dit au contraire il faut pas.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
11
Salut,
Je t'avais déja  répondu dans l'autre post.  Je viens de faire un test et ça marche chez  moi après avoir ajouté #define IDC_STATIC 1001  dans le fichier resource.h. La  boite de  dialogue s'affiche bel et bien avec tous les controles dedans.
Messages postés
24
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
24 mars 2008

D'accord, je n'avais remarqué que ctte ligne manquait!
merci.

maintenant j'ai une erreur de syntaxe dans le resource.h
à la ligne:
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
je n'arrive pas à la corriger!
c'est quoi ceette erreur?
Messages postés
24
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
24 mars 2008

Désolé, j'ai corrigé cette ligne (autant pour moi!)
mais TOUJOURS PAREIL!
le projet se compile sans erreurs, j'ai un exécutable
mais mais il inerte! (rien ne se produit)
Que faut-il faire?
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Je me demande comment ce code a pu compiler !!!! A moins que BCB te permette de compiler un fichier C comme du C++ ou tu le lui ai spécifié.

Donc, par défaut un fichier .c est un source C et les lignes suivante sont du C++, donc non reconnue par un ,compilo C  :

#include <cstdio>
using namespace std;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONTROLSDLG),   hWnd, reinterpret_cast<DLGPROC>(DlgProc));

D'ailleurs ce code ne se compile pas avec un compilo Microsoft...

Pour le #define IDC_STATIC 1001, c'est une erreur car par défaut les headers microsoft definissent la valeur à -1 et la valeur 1001 peut être aussi utilisée par d'autres contrôle sur gros fichiers ressources sans s'en apercevoir. Il vaut mieux utiliser #define IDC_STATIC -1

Ce qui peut gener c'est le style DS_MODALFRAME qui n'est plus reconnu par le dernier SDK microsoft
De plus, pour que les styles soient reconnu par le compuilareur de ressources, il faut ajouter #include <windows.h> au début du fichier de ressources.

Un conseil : ton fichier main -> renomme le en cpp si tu veux faire du c++, sinon corrige ton source. Je ne sais pas comment ce code a pou compiler et d'ailleurs si tu changait de compilo, cela ne fonctionnerait plus...

version C de ton code qui fonctionne :

#include <windows.h>
#include <stdio.h>

#include "resource.h"

//---------------------------------------------------------------------------
HWND hWnd;
HINSTANCE hInst;
BOOL CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONTROLSDLG), hWnd, (DLGPROC) DlgProc);

        hInst = hInstance;

  return 0;
}
//---------------------------------------------------------------------------
BOOL CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{

    char strMarkedPrice[20], strTaxRate[20], strTaxAmount[20], strNetPrice[20];
    HWND hWndMarkedPrice, hWndTaxRate, hWndTaxAmount, hWndNetPrice;
    double MarkedPrice, TaxRate, TaxAmount, NetPrice;

    hWndMarkedPrice = GetDlgItem(hWndDlg, IDC_MARKED_PRICE);
    hWndTaxRate     = GetDlgItem(hWndDlg, IDC_TAX_RATE);
    hWndTaxAmount   = GetDlgItem(hWndDlg, IDC_TAX_AMOUNT);
    hWndNetPrice    = GetDlgItem(hWndDlg, IDC_NET_PRICE);

        switch(Msg)
        {
        case WM_INITDIALOG:
            SetWindowText(hWndMarkedPrice, "0.00");
            SetWindowText(hWndTaxRate, "5.75");
            SetWindowText(hWndTaxAmount, "0.00");
            SetWindowText(hWndNetPrice, "0.00");
            return TRUE;

        case WM_COMMAND:
                switch(wParam)
                {
                case IDC_CALCULATE_BTN:
                    GetWindowText(hWndMarkedPrice, strMarkedPrice, 20);
                    GetWindowText(hWndTaxRate, strTaxRate, 20);

                    MarkedPrice = atof(strMarkedPrice);
                    TaxRate = atof(strTaxRate) / 100;

                    TaxAmount = MarkedPrice * TaxRate;
                    NetPrice = MarkedPrice + TaxAmount;

                    sprintf(strTaxAmount, "%.2f", TaxAmount);
                    sprintf(strNetPrice, "%.2f", NetPrice);

                    SetWindowText(hWndTaxAmount, strTaxAmount);
                    SetWindowText(hWndNetPrice, strNetPrice);

                      return TRUE;
                case IDCANCEL:
                        EndDialog(hWndDlg, 0);
                        return TRUE;
                }
                break;
        }

        return FALSE;
}

Bon courage
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
11
Pendant mon test, j'ai remarqué que le problème venait de DialogBox() qui refuse de créer la boite de dialogue. C'est normal car Windows n'arrive pas à trouver certaines valeurs depuis les ressources de l'exécutable. Il s'agit de IDC_STATIC qui n'était pas défini. C'est vrai que j'avais aussi ajouté #include <windows.h> au début du fichier rc pour qu'il reconnaisse certaines constantes mais j'avais oublié de le préciser.
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Racpp,

tu as quoi comme outil de dev ? Car je me demande toujours comment ce code, si le source est un .c, a pu être compilé !
DevCPP et CBC permettent ils de compiler des *.c en tant que cpp ?
De plus si IDC_STATIC n'était pas déclaré, le compilo de ressources ne pouvait pas compiler le fichier rc et le linker ne pouvait pas générer d'éxecutable....
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
11
vicenzo >> J'ai fait le test avec Visual Express 2005. En réponse à cette question dans l'autre post de l'auteur de la question, je me demandais justement comment le compilateur de ressources laisserait passer ce genre d'erreur. Je pensais à une lacune de CBC. Je vais tester maintenant avec Dev CPP.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
11
Je viens de tester le code avec Dev Cpp 4.9.9.2. Après avoir viré  #include <cstdio> et using namespace std; je n'ai fait que trois petites modifications ; comme prévu, pour le faire marcher:
1- Ajouter #define IDC_STATIC 111 dans le fichier resource.h
2- Ajouter #include <windows.h> au début du fichier resource.rc
3- Remplacer reinterpret_cast<DLGPROC>(DlgProc) par (DLGPROC)DlgProc
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
C'est bien ce que je disais... tu as du faire les mêmes modif que moi.

Ce code n'a pas pu être compilé, je n'avias pas révé ! Encore une fois, faire attentrion aux confusions C/C++ ...
Surtout cela serait sympa quand on poste un message de ne pas commencer par dire que le code compile parfaitement alors qu'il est incompilable..
A moins que le code aie été modifié sans le fichier obj n'aie été recrée pour une raison x ce qui aurait pu induire en erreur Etaxi...

Qu'en pense notre ami Etaxi ?
Messages postés
24
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
24 mars 2008

Tout à fait d'accord, ah tu ne peux pas t'imaginer combien
j'ai besoins de tes précieux conseils (et les autres aussi),
Plus sérieusement, en ce moment je suis en train de payer
les conséquences de vouloir aller TROP VITE!
(ce qui fait je mélange tout!!!).
Je te promets que d'aurénavant je ferai d'avantage attention
à tous les détails que tu viens de citer

NB1:bonne nouvelle (CA MARCHE!)
NB2:j'ai dû laisser #include <cstdio> pour le sprintf().
encore merci.
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
En C, le header est "stdio.h" et non pas cstdio qui est un header  c++ fourni par un outils C++ qui mappe vers "stdio.h" .
Si demain, tu compile ton source avec un outils C uniquement, cstdio ne sera alors plus fourni et ton code ne compilera plus.
Messages postés
24
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
24 mars 2008

entendu.
merci.