Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Aiuto GUI win32

    Salve a tutti, ho dei problemi nel realizzare questo programma:
    codice:
    #include <windows.h>
    #include <string>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define Show(Window) RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW);
    using namespace std;
    
    char ClassName1[2048]; // default size
    char ClassName2[2048]; // default size
    MSG msg;
    WNDCLASS wc;
    HINSTANCE hInst;
    enum {ID_BUTTON1,ID_BUTTON2,ID_EDIT1,ID_LISTBOX1,ID_LABEL6,ID_LABEL3};
    HWND form1,label1,label2,label3,label4,label5,label6,edit1,listbox1, button1,button2;
    enum {ID_FORM2,ID_LABEL21};
    HWND form2,label21;
    
    int i=0;
    char buffer[256];
    
    LRESULT CALLBACK WinProc1 (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK WinProc2 (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow)
    {
        hInst = hInstance;
        strcpy(ClassName1,"principale");
        
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        wc.lpfnWndProc = WinProc1;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInst;
        wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);
        wc.hCursor = LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
        wc.lpszMenuName = NULL;
        wc.lpszClassName = ClassName1;
        RegisterClass(&wc);
    	
        form1    = CreateWindow(ClassName1,"Server",WS_MINIMIZEBOX | WS_SIZEBOX | WS_CAPTION | WS_MAXIMIZEBOX | WS_POPUP | WS_SYSMENU,300,300,400,340,NULL,(HMENU)NULL,hInst,NULL);
        label1   = CreateWindow("STATIC","Scrivi la porta:",WS_CHILD | WS_VISIBLE,10,10,175,20,form1,0,hInst,NULL);
        label2   = CreateWindow("STATIC","La porta selezionata è:",WS_CHILD | WS_VISIBLE,200,10,200,20,form1,0,hInst,NULL);
        label3   = CreateWindow("STATIC","",WS_CHILD | WS_BORDER | WS_VISIBLE,200,30,175,20,form1,(HMENU)ID_LABEL3,hInst,NULL);
        label4   = CreateWindow("STATIC","Seleziona il servizio",WS_CHILD | WS_VISIBLE,10,70,175,20,form1,0,hInst,NULL);
        label5   = CreateWindow("STATIC","Descrizione del servizio:",WS_CHILD | WS_VISIBLE,200,70,175,20,form1,0,hInst,NULL);
        label6   = CreateWindow("STATIC","",WS_CHILD | SS_LEFT | WS_BORDER | WS_VSCROLL | WS_VISIBLE,200,90,175,170,form1,(HMENU)ID_LABEL6,hInst,NULL);
    
        edit1    = CreateWindow("EDIT", NULL,ES_NUMBER | WS_BORDER | WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,10,30,140,20,form1,(HMENU)ID_EDIT1,hInst,NULL);
                
        button1  = CreateWindow("BUTTON","OK",BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE ,155,30,30,20,form1,(HMENU)ID_BUTTON1,hInst,NULL);
        button2  = CreateWindow("BUTTON","Avvia il Servizio",BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE ,200,264,175,20,form1,(HMENU)ID_BUTTON2,hInst,NULL);
    
        listbox1 = CreateWindow("LISTBOX",NULL,LBS_STANDARD | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP,10,90,175,200,form1,(HMENU) ID_LISTBOX1,hInst,NULL);
        
        SendMessage(listbox1,(UINT)LB_ADDSTRING,(WPARAM)0,(LPARAM)"1 - Service");
        SendMessage(listbox1,(UINT)LB_ADDSTRING,(WPARAM)0,(LPARAM)"2 - Service");
        SendMessage(listbox1,(UINT)LB_ADDSTRING,(WPARAM)0,(LPARAM)"3 - Service");
        SendMessage(listbox1,(UINT)LB_SETCURSEL, 0, 0);
        SetWindowText(label6,"Reference funzioni");	
        Show(form1);
    	
        while(GetMessage(&msg,NULL,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    
    LRESULT CALLBACK WinProc1(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        RECT rect;
        HDC hdc;
        if (msg==WM_COMMAND)
        {
           if (LOWORD(wParam)==ID_LISTBOX1)
           {
              if (HIWORD(wParam)==LBN_SELCHANGE)
              {
                  i=SendMessage(listbox1,(UINT)LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
                  switch(i)
                  {
                          case 0: strcpy (buffer,"Funzionamento 1° servizio"); break;
                          case 1: strcpy (buffer,"Funzionamento 2° servizio"); break;
                          case 2: strcpy (buffer,"Funzionamento 3° servizio"); break;
                  }
                  SetWindowText(label6,buffer);
              }
           }
           
           if (LOWORD(wParam)==ID_BUTTON1)
           {
                GetDlgItemText(hWnd, ID_EDIT1, buffer, sizeof(buffer));
                if (buffer[0]!=0)
                {
                     SetWindowText(label3,buffer);
                     SetWindowText(edit1,"");
                     i = atoi (buffer);
                     port=(short) i;
                }
           }
             
           if (LOWORD(wParam)==ID_BUTTON2)
           {
               i=SendMessage(listbox1, (UINT) LB_GETCURSEL,(WPARAM) wParam,(LPARAM) lParam);
               switch(i)
               {
                        case 0: 
                                MessageBox (NULL, "1° servizio", "Messaggio", MB_OK | MB_ICONEXCLAMATION);
                        break;
                        
                        case 1: 
                                 strcpy(ClassName2,"figlio");
                                 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
                                 wc.lpfnWndProc = WinProc2;
                                 wc.cbClsExtra = 0;
                                 wc.cbWndExtra = 0;
                                 wc.hInstance = hInst;
                                 wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);
                                 wc.hCursor = LoadCursor(NULL,IDC_ARROW);
                                 wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
                                 wc.lpszMenuName = NULL;
                                 wc.lpszClassName = ClassName2;
    	                     RegisterClass(&wc);
    
                                 form2   = CreateWindow(ClassName2,"Servizio",WS_MINIMIZEBOX | WS_SIZEBOX | WS_CAPTION | WS_MAXIMIZEBOX | WS_POPUP | WS_SYSMENU,320,320,600,440,NULL,(HMENU)ID_FORM2,hInst,NULL);
                                 label21 = CreateWindow("Listbox","",WS_CHILD | SS_LEFT | WS_BORDER | WS_VSCROLL | WS_VISIBLE,1,1,583,403,form2,(HMENU)ID_LABEL21,hInst,NULL);
    /***************************************************************************************/
    /****************************PROBLEMA***************************************************/
    /***************************************************************************************/
                                 while(1)
                                 {
                                 strncat (buffer, "prova prova prova\n", 18);
                                 SetWindowText(label21,buffer);
                                 Sleep(100);
                                 Show(form2);
                                 }
    /***************************************************************************************/
    /***************************************************************************************/
                        break;
               }           
           }       
        }
    
    
    
    if (msg==WM_DESTROY)
    {
        UnregisterClass(ClassName1,hInst);
        PostQuitMessage(0);
    }
    
    
    if (msg==WM_GETMINMAXINFO)
    {
                LPMINMAXINFO pMMI = (LPMINMAXINFO)lParam;
                pMMI->ptMaxTrackSize.x = 400;
                pMMI->ptMaxTrackSize.y = 340;
    }
    
    
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    
    LRESULT CALLBACK WinProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    if (msg==WM_DESTROY)
    {
        UnregisterClass(ClassName2,hInst);
    }
    
    
    if (msg==WM_GETMINMAXINFO)
    {
                LPMINMAXINFO pMMI = (LPMINMAXINFO)lParam;
                pMMI->ptMaxTrackSize.x = 600;
                pMMI->ptMaxTrackSize.y = 440;
    }
    
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    Mettendo il loop perdo completamente il controllo sulle finestre portando al crush l'applicazione
    effettivamente non vengono più eseguite le righe di codice che controllano i messaggi in arrivo sulle finestre ovvero:
    codice:
        while(GetMessage(&msg,NULL,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam;
    Come è possibile scrivere in loop sulla static label21 continuando comunque a mantenere il controllo sulle finestre?

    Altra breve domanda:
    Per scrivere righa per righa nello static io utilizzo questo codice:
    codice:
    while(1)
    {
    strncat (buffer, "prova prova prova\n", 18);
    SetWindowText(label21,buffer);
    Sleep(100);
    Show(form2);
    }
    che aggiunge in append al buffer la stringa da inserire, è possibile invece fare una sorta di "cout<<"";" come nelle applicazioni in console?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: Aiuto GUI win32

    Originariamente inviato da Stormlord1736
    Mettendo il loop perdo completamente il controllo sulle finestre portando al crush l'applicazione
    crash ... non crush ...

    Non ha senso un "loop infinito" ... un programma a finestre con un singolo thread non puo' stare bloccato in un loop senza fine ...

    Rivedi la "logica" di quello che vorresti fare perchè non ha senso un loop infinito ...

    ... righa per righa ...
    riga !

    Italiano ... questo sconosciuto ...

    è possibile invece fare una sorta di "cout<<"";" come nelle applicazioni in console?
    No ... non è un'applicazione console ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non ha senso un "loop infinito" ... un programma a finestre con un singolo thread non può stare bloccato in un loop senza fine ...

    Rivedi la "logica" di quello che vorresti fare perché non ha senso un loop infinito ...
    Si il while nel programma completo non sarà infinito, ma dovrà comunque durare parecchio.

    Quello che mi serve è quindi creare un thread che esegue quel while giusto?

    In tal caso conosci dei tutorial validi per la programmazione multi thread?

    No ... non è un'applicazione console ...
    Si ok non intendevo utilizzare il realmente cout, ma sapere se è possibile evitare di ristampare a video tutto il testo ogni volta, Stampando direttamente la stringa da aggiungere come ad esempio si fa con le listbox:
    SendMessage(listbox1,(UINT)LB_ADDSTRING,(WPARAM)0, (LPARAM)"Stringha");
    Evitando anche di creare un vettore di 2000 e passa byte.


    Grazie in anticipo

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se è un lavoro "lungo", allora la soluzione corretta è un secondo thread ...

    La programmazione multithreading non si studia sui "tutorial" ... ti consiglio di studiare da libri, magari in lingua originale ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.