Newsgroup: it.comp.programmare.win32
Titolo: Programmino C&API che non funza

Ciao a tutti,
il codice sotto, un semplicissimo programmino che apre una finestra con un
menu, e due voci nel menu, dovrebbe aprire un messagebox nel caso di click
sulla priam voce del menu e una DialogBox nell'altro caso.
La compilazione avviene senza errori, ma all'esecuzione i click sulle due
voci del menu non hanno MAI effetto. (si apre il menu a tendina, ma
clicckando sulle voce non succede niente.)
Sapete dirmi come mai? Non so davvero dove sia il problema.
Ciao a tutti!
larss
#include <windows.h>
#include "testgui.h"
#include "testdial.h"
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
char szClasseFinestra1[ ] = "Applicazione Test API";
int WINAPI WinMain (HINSTANCE HInstance,
                    HINSTANCE HPrevInstance,
                    LPSTR LPSZParametri,
                    int ItoCmdShow)
{
    HWND HWHandleWindow;
    MSG MSGMessaggiToWin;
    WNDCLASSEX WCClasseWindow;
    WCClasseWindow.hInstance = HInstance;
    WCClasseWindow.lpszClassName = szClasseFinestra1;
    WCClasseWindow.lpfnWndProc = WindowProcedure;
    WCClasseWindow.style = 0;
    WCClasseWindow.cbSize = sizeof (WNDCLASSEX);
    WCClasseWindow.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WCClasseWindow.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    WCClasseWindow.hCursor = LoadCursor (NULL, IDC_ARROW);
    WCClasseWindow.lpszMenuName = MAKEINTRESOURCE(MENU_1);
WCClasseWindow.cbClsExtra = 0;
    WCClasseWindow.cbWndExtra = 0;
       WCClasseWindow.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    if (!RegisterClassEx (&WCClasseWindow))
        return 0;
    HWHandleWindow = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClasseFinestra1,   /* Classname */
           "Test API Skeleton", /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           400,                 /* The programs width */
           300,                 /* and height in pixels */
           NULL,                /* The window is a child-window to no one */
           NULL,                /* No menu */
           HInstance,           /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
    /* Make the window visible on the screen */
    ShowWindow(HWHandleWindow, ItoCmdShow);
    UpdateWindow(HWHandleWindow);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&MSGMessaggiToWin, NULL, 0, 0) > 0)
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&MSGMessaggiToWin);
        /* Send message to WindowProcedure */
        DispatchMessage(&MSGMessaggiToWin);
    }
    /* The program return-value is 0 - The value that PostQuitMessage() gave
*/
    return MSGMessaggiToWin.wParam;
}
/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure(HWND HWHandleWindow, UINT MSGMessaggiToWin,
WPARAM wParam, LPARAM lParam)
{
    switch(MSGMessaggiToWin)                  /* handle the messages */
    {
        case CM_POPUPITEM1:
        {
            MessageBox(HWHandleWindow, "Dialog exited with IDOK.", "Notice",
MB_OK | MB_ICONINFORMATION);
        }
        case CM_POPUPITEM:
        {
            int ret = DialogBox(GetModuleHandle(NULL),
MAKEINTRESOURCE(DIALOG_1), NULL, AboutDlgProc);
            if(ret == IDOK)
            {
                MessageBox(HWHandleWindow, "Dialog exited with IDOK.",
"Notice", MB_OK | MB_ICONINFORMATION);
           }
            else if(ret == IDCANCEL)
            {
                MessageBox(HWHandleWindow, "Dialog exited with IDCANCEL.",
"Notice", MB_OK | MB_ICONINFORMATION);
            }
            else if(ret == -1)
            {
                MessageBox(HWHandleWindow, "Dialog failed!", "Error", MB_OK
| MB_ICONINFORMATION);
            }
        }
        break;
        case WM_DESTROY:
            PostQuitMessage(0);       /* send a WM_QUIT to the message queue
*/
            break;
        default:                      /* for messages that we don't deal
with */
            return DefWindowProc(HWHandleWindow, MSGMessaggiToWin, wParam,
lParam);
    }
    return 0;
}
BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM
lParam)
{
    switch(Message)
    {
        case WM_INITDIALOG:
        return TRUE;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDOK:
                    EndDialog(hwnd, IDOK);
                break;
                case IDCANCEL:
                    EndDialog(hwnd, IDCANCEL);
                break;
            }
        break;
        default:
            return FALSE;
    }
    return TRUE;
}
  3626 entries in database (bs@|http://)
php.cd
--
0110110001100001011100100111001101
1100110111001100110011001100010100
0000011010000110111101110100011011
0101100001011010010110110000101110
011000110110111101101101

         {
i comandi dei menu si gestiscono nel messaggio WM_COMMAND  (come per gestire
i pulsanti della dialog box) e quale menu è stato selezionato si vede da
lparam o wparam non ricordo
-- 
Pela

 lparam o wparam non ricordo
Ottimo, questo l'ho corretto.
L'unico problema che rimane è che , ora, l'apertura della Dialog con il '?'
mi ritorna sempre il messaggio di errore "Dialog Failed" (valore di ritorno
di DialogBox( ) = -1 ). Ci sono errori nella creazione del dialog? Di che
tipo?
Nessun problema con il messagebox associato ad "apri"
larss


 lparam o wparam non ricordo
LOWORD(wParam)   ;)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 011000110110111101101101
I'm sorry, I don't speak binary. Would you speak English, please? :D
ciao.


 I'm sorry, I don't speak binary. Would you speak English, please? :D
Se otto bit fanno un byte....
larss
#include <windows.h>
#include "testgui.h"
#include "testdial.h"
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
/*  Make the class name into a global variable  */
char szClasseFinestra1[ ] = "Applicazione Test API";
int WINAPI WinMain (HINSTANCE HInstance,
                    HINSTANCE HPrevInstance,
                    LPSTR LPSZParametri,
                    int ItoCmdShow)
{
    HWND HWHandleWindow;               /* This is the handle for our window
*/
    MSG MSGMessaggiToWin;            /* Here messages to the application are
saved */
    WNDCLASSEX WCClasseWindow;
    /* The Window structure */
    WCClasseWindow.hInstance = HInstance;
    WCClasseWindow.lpszClassName = szClasseFinestra1;
    WCClasseWindow.lpfnWndProc = WindowProcedure;      /* This function is
called by windows */
    WCClasseWindow.style = 0;                 /* Catch double-clicks */
    WCClasseWindow.cbSize = sizeof (WNDCLASSEX);
    /* Use default icon and mouse-pointer */
    WCClasseWindow.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WCClasseWindow.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    WCClasseWindow.hCursor = LoadCursor (NULL, IDC_ARROW);
    WCClasseWindow.lpszMenuName = MAKEINTRESOURCE(MENU_1);
/* No menu */
    WCClasseWindow.cbClsExtra = 0;                      /* No extra bytes
after the window class */
    WCClasseWindow.cbWndExtra = 0;                      /* structure or the
window instance */
    /* Use Windows's default color as the background of the window */
    WCClasseWindow.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&WCClasseWindow))
        return 0;
    /* The class is registered, let's create the program*/






    switch(MSGMessaggiToWin)                  /* handle the messages */
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case CM_POPUPITEM1:
                {
                    MessageBox(HWHandleWindow, "C'è poco da aprire...",
"Apri", MB_OK | MB_ICONINFORMATION);
                }
                break;
                case CM_POPUPITEM:
                {
                    int ret = DialogBox(GetModuleHandle(NULL),
MAKEINTRESOURCE(DIALOG_1), HWHandleWindow, AboutDlgProc);
                    switch(ret)
                    {
                        case IDOK:
                        {
                            MessageBox(HWHandleWindow, "Dialog exited with
IDOK.", "Notice", MB_OK | MB_ICONINFORMATION);
                        }
                        case IDCANCEL:
                        {
                            MessageBox(HWHandleWindow, "Dialog exited with
IDCANCEL.", "Notice", MB_OK | MB_ICONINFORMATION);
                        }
                        default:



    return 0;
}


--


 Se otto bit fanno un byte....
e che c'entra? 0_o


 E comunque ricordati di correggere anche l'errore degli ID.
pardon, come non detto; non avevo visto le correzioni.


 e che c'entra? 0_o
Se otto bit = un byte = un char ASCII, basta una piccola "traduzione"....
larss
#include <windows.h>
#include "testgui.h"
#include "dialog.h"













        case WM_COMMAND:

                case CM_POPUPITEM:
                {
                    int IReturnValue = DialogBox(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_ABOUT), HWHandleWindow, AboutDlgProc);
                    if (IReturnValue == IDOK) { MessageBox(HWHandleWindow,
"OK", "OK", MB_OK | MB_ICONINFORMATION); }
                    else { MessageBox(HWHandleWindow, "ERRORE", "ERRORE",
MB_OK | MB_ICONINFORMATION); }
                    /* MessageBox(HWHandleWindow, "About...", "About", MB_OK
| MB_ICONINFORMATION); */
                }
                break;
            }
        break;
        case WM_CLOSE:
            DestroyWindow(HWHandleWindow);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);       /* send a WM_QUIT to the message queue
*/
        break;
        default:                      /* for messages that we don't deal
with */
            return DefWindowProc(HWHandleWindow, MSGMessaggiToWin, wParam,
lParam);
    }
    return 0;
}
BOOL CALLBACK AboutDlgProc(HWND DialogHwnd, UINT DialMessage, WPARAM wParam,
LPARAM lParam)
{
    switch(DialMessage)
    {
        case WM_INITDIALOG:
        return TRUE;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDOK:
                    EndDialog(DialogHwnd, IDOK);
                break;
                case IDCANCEL:
                    EndDialog(DialogHwnd, IDCANCEL);
                break;
            }
        break;
        default:
            return FALSE;
    }
    return TRUE;
}
#include "dialog.h"
DIALOG_1 DIALOG 54, 94, 207, 111
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "DIALOG_1"
FONT 8, "MS Sans Serif"
{
 DEFPUSHBUTTON "OK", IDOK, 35, 70, 50, 14
 PUSHBUTTON "Cancel", IDCANCEL, 133, 71, 50, 14
}
--


 MessageBox, tutto va liscio.
Al dai dammi sta manina pliz! Non riesco a capire dove sbaglio, ed essendo
anche un principiante della programmazione Win32, nn ho nemmeno modo di
capire se il mio è un problema sintattico o concettuale.
Grazie a chiunque voglia aiutarmi!
larss


 011000110110111101101101
ma senti un po': se me lo traduci tu non facciamo prima?


 quindi il default ritorna FALSE. Ma perchč?
-1 non corrisponde a FALSE; -1 sarebbe 0xFFFFFFFF: significa che la
DialogBox fallisce proprio.
int IReturnValue = DialogBox(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_ABOUT), HWHandleWindow, AboutDlgProc);
qui c'č poco da fare: una chiamata del genere č del tutto corretta, sempre
che HWHandleWindow sia valido...
casomai fai 1 cosa: subito dopo la chiamata aggiungi:
TRACE("GetLastError: 0x%X\n", GetLastError());
poi usa il tool "Ricerca Errori" con il valore ottenuto e vedi un po' che
cosa combina 'sta DialogBox.
Prima cmq fai anche 1 altra cosa: dal menu Build fai Rebuild All.
te lo dico xké a volte VC++ fa casini con gli ID dei template; se l'hai
cambiato DialogBox potrebbe non vedere quello nuovo (allora sarebbe quello
il motivo); facendo Rebuild All dici a VC++ (fra le altre cose) di
aggiornare tutte le macro e quindi anche gli ID.
