[API WIN32]PROGRAQMMA NON FUNZIONANTE

di il
2 risposte

[API WIN32]PROGRAQMMA NON FUNZIONANTE

Premetto che sono nuovo nel campo delle API di microsoft, quindi ho provato a fare questo semplice programma che, in teoria, doveva essere un contatore e, se arrivava a 127, prima mostrava 000 e se si schiacciava di nuovo il programma si chiudeva.. però, dopo che schiaccio il pulsante la prima volta ( quando c'è ancora lo 0 iniziale), scompaiono i numeri e il bottone rimane vuoto e non fa piu niente.. posto il codice..


#include"stdafx.h" 
#define STRICT
 #define WIN32_LEAN_AND_MEAN
 #include<tchar.h> 
#include<iostream>
 #include<string>  
#include <windows.h>    
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{
      DialogBoxParam(0,_T("MioDialogo"), 0,unaDlgProc,0);  
    return 0;
 } 
BOOL CALLBACK unaDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  { 
     if(uMsg==WM_CLOSE)  
    {     
    EndDialog(hwndDlg, 0); 
        return TRUE;
      }  
    else if(uMsg==WM_COMMAND) 
    {
        WORD wNotifica = HIWORD(wParam);
        WORD wId = LOWORD(wParam); 
        if(wNotifica == STN_CLICKED && wId == 101)
        { 
        int buff[10]; 
        int pTesto; 
        pTesto = 0;
        SendMessage(hwndDlg, WM_GETTEXT, 10, buff[0]); 
        int pTesto = GetDlgItemInt(hwndDlg, 101, 0, FALSE);
        if(buff[0]>=0&&pTesto<100)
            {
                pTesto++; 
        int pTesto = SetDlgItemInt(hwndDlg, 101, 0, FALSE);
        SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)pTesto);
        }
        else if (pTesto==100)
        {
            pTesto=000;
            int pTesto = SetDlgItemInt(hwndDlg, 101, 0, FALSE);
            SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)pTesto);
        }
        else if(pTesto>100)
        {
        EndDialog(hwndDlg, 0);
        }
        return TRUE;
        }  
    }     
return FALSE; }

e qui il codice del file .rc correlato..


#include<Windows.h>
 MioDialogo DIALOG DISCARDABLE 0, 0, 186, 92  
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
  CAPTION "Un Dialogo vuoto" 
 FONT 8, "MS Sans Serif"
  BEGIN 
CONTROL "0", 101, "STATIC", SS_CENTER|WS_BORDER|SS_NOTIFY, 60, 40, 40, 10   END

grazie mille a tutti!!

2 Risposte

  • Re: [API WIN32]PROGRAQMMA NON FUNZIONANTE

    Get/Set DialogitemInt al suo interno manda un SendMessage quindi non è il caso di rafforzare l'idea. Poi la variabile ptesto è creata mille volte quando ne serve una. il pBuff serve a niente.
    eccoti un po di modifiche. Ho messo il contatore fino a 10 se no ci metteva una vita. Una volta arrivato a 10 va a 0 ma non esce perche il codice così com'è non permette l'uscita.
    
    BOOL CALLBACK unaDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  {
    	if(uMsg==WM_CLOSE) 
    	{     
    		EndDialog(hwndDlg, 0);
    		return TRUE;
    	} 
    	else if(uMsg==WM_COMMAND)
    	{
    		WORD wNotifica = HIWORD(wParam);
    		WORD wId = LOWORD(wParam);
    		if(wNotifica == STN_CLICKED && wId == 101)
    		{
    			int pTesto = GetDlgItemInt(hwndDlg, 101, 0, FALSE);
    			if(pTesto<10)
    			{
    				pTesto++;
    				SetDlgItemInt(hwndDlg, 101, pTesto, FALSE);
    				
    			}
    			else if (pTesto==10)
    			{
    				pTesto=0;
    				SetDlgItemInt(hwndDlg, 101, pTesto, FALSE);
    				
    			}
    			else if(pTesto>10)
    			{
    				EndDialog(hwndDlg, 0);
    			}
    			return TRUE;
    		} 
    	}     
    	return FALSE; }
    
    Trova te il modo per uscire (manda un WM_CLOSE dopo il set del contatore a 0).
  • Re: [API WIN32]PROGRAQMMA NON FUNZIONANTE

    Ciao drasgo

    La versione di skynet è perfetta, volevo invece farti notare un erroraccio da non ripetere nella versione che hai postato:
    
       SendMessage(hwndDlg, WM_GETTEXT, 10, buff[0]); 
    
    Questo ti avrebbe fatto impiantare il programma, si deve scrivere:
    
       SendMessage(hwndDlg, WM_GETTEXT, 10, (LPARAM)buff); 
    
    In pratica invece che passare l' indirizzo di un array passavi il contenuto della sua prima cella, che tra l' altro non era neppure inizializzata. Il programma avrebbe scritto chissà dove nella memoria con effetti disastrosi.
Devi accedere o registrarti per scrivere nel forum
2 risposte