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?