Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: win32 c++

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    70

    win32 c++

    Problema: ho una matrice C++ alimentata da dati in realtime, come posso visualizzarli in una window? meglio...nella window procedure, sotto WM_PAINT ho impostato un ciclo che mi visualizza i dati nella window, ma quando voglio visualizzarli dopo la prima volta utilizzo un SendMessage(hWnd,WM_PAINT,0,0). ma nulla! che fare.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    70
    boh è già il terzo problema che posto e nessuno mi risponde...non so che pensare!

  3. #3
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    forse con titoli più esplicativi (come da regolamento) la gente è più invogliata a risponderti
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  4. #4
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Evidentemente sbagli qualche cosa nella w.p. nel gestire WM_PAINT, se posti del codice possiamo vedere dove...
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    A parte che per chiamare WM_PAINT usereila chiamata ad InvalidateRect() dai un'okkiata qui se vuoi:
    http://msdn.microsoft.com/library/en...asp?frame=true
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    70
    // Il codice è abbastanza incasinato e postalo tutto verrebe una cinquantina di pagine,
    // ti posto degli spezzoni spiegandoti i collegamenti. Altra cosa: il programma di base
    //funziona, è gia stato testato parecchie volte, il problema è sorto solo con l'introduzione della win32
    //per cui gli scripts qui postati sono quelli relativi alla win32 che non funzionano:

    //(1) innanzitutto in head ho richiamato le seguenti variabili,


    //head:
    MSG Msg;
    WNDCLASSEX WndCls;
    HWND hWnd;
    HDC hDC;


    //2) poi, nella win procedure ho inserito il case PAINT che va a sparare una matrice
    //di valori costruida da il loop integrato. Il mio problema è che paint dovrebbe essere
    // richiamato più volte, di preciso, tutte le volte che i dati all'interno della matrice
    // mtx4 variano, in modo che sulla windo mi appare la variazione di valori:


    LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg,
    WPARAM wParam, LPARAM lParam)
    {
    PAINTSTRUCT Ps;
    switch(Msg)
    {
    case WM_DESTROY:
    PostQuitMessage(WM_QUIT);
    break;
    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDM_FILE_EXIT:
    stop8LP=1;
    PostMessage(hWnd, WM_CLOSE, 0, 0);
    break;
    }
    case WM_PAINT:
    char b[8];
    double value;

    hDC = BeginPaint(hWnd, &Ps);

    for(i=1; i<50; i++)
    {
    value=mtx4[i-1];
    int b3;
    gcvt(value,8,b);
    TextOut(hDC, 100, i*20, b, 8);
    }
    EndPaint(hWnd, &Ps);
    break;




    default:
    return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    return 0;
    }



    questa è una porzione di "main" dove registro e costruisco la finestra:
    //{[F01-Main]}[Structure]oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooo

    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow) //{F01_01}
    {//+1







    lamu=2;
    bb_connect_t *ACB; //{F01_02}
    int kont1, kont2;// kont33; //{F01_03}
    onesec=1;

    //A) Registrazione della window class:


    static char szAppName[] = "GDISuite";


    WndCls.cbSize = sizeof(WndCls);
    WndCls.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
    WndCls.lpfnWndProc = WindProcedure;
    WndCls.cbClsExtra = 0;
    WndCls.cbWndExtra = 0;
    WndCls.hInstance = hInstance;
    WndCls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndCls.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndCls.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    WndCls.lpszClassName = szAppName;
    WndCls.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
    RegisterClassEx(&WndCls);
    //B) Creazione della finestra:
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
    szAppName,
    "8 LONDON PLUS",
    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    /* while( GetMessage(&Msg, NULL, 0, 0) )
    {
    TranslateMessage(&Msg);
    DispatchMessage( &Msg);
    }*/


    //....la main continua ma non centra più nulla con win32....


    //Dopo una ventina di funzioni e roba varia viene richiamata qesta funzione che
    //genera e continua ad aggiornare la matrice mtx4. Oggni volta che la aggiorna vorrei che venisse
    //fatto partire lo spezzone di windowprocedure sotto WM_PAINT in modo che nella window siù
    // possa vedere la variazione di dati:

    io ho scritto un bel SendMessage(hWnd, WM_PAINT,0,0) , il codice in fase di compilazione
    non mi da errori, ma la window non mi si aggirona continuamente. Mi si aggiorna solo quando
    io modifico la dimensione della finestra il che è normale perche me la ricostruisce.
    //funzione:...
    ....
    int f_PrintTicks(int i_Tk)
    {//+1
    int n_mean;
    n_mean =6;
    int rank;
    int n;
    double somma;
    double bmean;
    int cBk1;
    int cBk2;
    int i_Bk; //i-esimo book;
    int unoBk; // inizio i-esimo book;
    int dueBk; // fine i-esimo book;
    double bestB;
    double bestA;

    if ((i_Tk+1)/nCtp>0)
    i_Bk=((i_Tk+1)/nCtp)+1;
    else
    i_Bk=((i_Tk+1)/nCtp);


    n=0;
    somma=0;
    bmean =0;
    unoBk=i_Bk*nCtp-nCtp;
    dueBk=i_Bk*nCtp-1;

    for(cBk1=unoBk;cBk1<(dueBk+1);cBk1++)
    {//+3
    rank=nCtp; //si calcola il rank di cBk1;
    if(pbfBid[cBk1]<=0 || pbfBSize[cBk1]<=0 || pbfTm[cBk1]<=0)
    {//+4
    rank=rank;
    }//-4
    else
    {//+4
    for(cBk2=unoBk;cBk2<(dueBk+1);cBk2++)
    {//+5
    if(pbfBid[cBk2]<=0 || pbfBSize[cBk2]<=0 || pbfTm[cBk2]<=0)
    rank=rank-1;
    else
    {//+6
    if(pbfBid[cBk1]>=pbfBid[cBk2]) rank=rank-1;
    }//-6
    }//-5
    }//-4
    pbfBRank[cBk1]=rank;

    if(rank<n_mean && n<n_mean)
    {//+4
    n=n+1;
    somma +=pbfBid[cBk1];
    if(rank==0) bestB=pbfBid[cBk1];
    }//-4


    }//-3
    if(n==n_mean) bmean=somma/n_mean;
    else
    bmean=somma/n;
    VARIANT cellxls;
    cellxls.vt = VT_R8;
    cellxls.dblVal = bmean;
    long indices[] = {i_Bk,1};
    SafeArrayPutElement(mtx.parray, indices, (void*)&cellxls);
    mtx4[i_Bk]=bmean;
    SendMessage(hWnd,WM_DESTROY,0,0);

    VARIANT cellxls2;
    cellxls2.vt = VT_R8;
    cellxls2.dblVal = bestB;
    long indices2[] = {i_Bk,3};
    SafeArrayPutElement(mtx.parray, indices2, (void*)&cellxls2);
    // si preleva il valore dalla cella e lo si converte in ascii

    // f_GI3(DISPATCH_PROPERTYPUT, NULL,pR1, L"value", 1,mtx);


    // Creazione dell'array di sparo in excel:

    n=0;
    somma=0;
    bmean =0;
    unoBk=i_Bk*nCtp-nCtp;
    dueBk=i_Bk*nCtp-1;

    for(cBk1=unoBk;cBk1<(dueBk+1);cBk1++)
    {//+3
    rank=nCtp; //si calcola il rank di cBk1;
    if(pbfAsk[cBk1]<=0 || pbfASize[cBk1]<=0 || pbfTm[cBk1]<=0)
    {//+4
    rank=rank;
    }//-4
    else
    {//+4
    for(cBk2=unoBk;cBk2<(dueBk+1);cBk2++)
    {//+5
    if(pbfAsk[cBk2]<=0 || pbfASize[cBk2]<=0 || pbfTm[cBk2]<=0)
    rank=rank-1;
    else
    {//+6
    if(pbfAsk[cBk1]<=pbfAsk[cBk2]) rank=rank-1;
    }//-6
    }//-5
    }//-4

    if(rank<n_mean && n<n_mean)


    {//+4
    n=n+1;
    somma +=pbfAsk[cBk1];
    if(rank==0) bestA=pbfAsk[cBk1];
    }//-4



    }//-3
    if(n==n_mean) bmean=somma/n_mean;
    else
    bmean=somma/n;
    VARIANT cellxls3;
    cellxls3.vt = VT_R8;
    cellxls3.dblVal = bmean;
    long indices3[] = {i_Bk,2};
    SafeArrayPutElement(mtx.parray, indices3, (void*)&cellxls3);



    VARIANT cellxls4;
    cellxls4.vt = VT_R8;
    cellxls4.dblVal = bestA;
    long indices4[]= {i_Bk,4};
    SafeArrayPutElement(mtx.parray, indices4, (void*)&cellxls4);


    // si preleva il valore dalla cella e lo si converte in ascii
    if(onesec==1)
    {
    time(&secuno);
    onesec=2;
    }
    time(&secdue);
    if(secdue-secuno>2)
    {
    onesec=1;
    f_GI3(DISPATCH_PROPERTYPUT, NULL,pR1, L"value", 1,mtx);
    }

    return 0;
    }//-1

  7. #7
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Mi spiace ma ora nn sono a casa e nn posso guardare bene il codice, ma nel case WM_PAINT ti ci entra? Altrimenti prova a sostituire il sendMess con il IvalidateRect() come ti ho suggerito...

    PS: la prossima volta il codice mettilo tra i tag appositi!!
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    70
    ok, adesso provo a fare un po di test poi ti posto tutto come vuoi.
    No, mi entra nel PAINT solo quando modifico la dimensione della finestra con il mouse...il che è normale.
    Mentre non mi entra con il SendMessage.
    Vado a fare qualche esperimento poi ti informo meglio.
    ciao e grazie.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    70
    Mi sto incasinando, provo a semplificare il problema:

    1. ho fatto un programmino in C che è strutturato con una winprocedure, una WINAPI main e una ventina di altre funzioni.
    2. quando faccio partire l'aplicazione questa, tramite un'API si connette ad un server è comincia una comunicazione asincronica con questo aggiornandomi continuamente una matrice di dati.
    3. il risultato che vorrei ottenere è la visualizzazione di questi dati su una window, ovviamente quando i dati nella matrice, anche nella finestra window vorrei che cambiassero.
    4.La prima soluzione che avevo tentato era quella di inserire la matrice di dati nel case PAINT e di richiamare PAINT con SendMessage, ognivolta che mi arrivavano i nuovi dati, ma in questo modo l'aggiornamento dei dati si verificava solo quando andavo a modificare la dimensione della finestra con il mouse.
    5. una seconda soluzione che ho tentato, è stata: ogni qualvolta arrivavano i nuovi dati, io sparavo questi alla window attraverso TextOut. In questo modo il problema si è ridotto, ma non risolto, in sostanza i dati nella window si aggiornano solo se passo con la freccetta del mouse sopra la window.
    6. che dovrei fare?...adesso proseguo con i test, ma se qualcuno sa darmi qualche indicazione, le tento tutte!!!Cavoli è tre giorni che non ne vengo a capo.
    Grazie

  10. #10
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Allora io farei così:
    1)Aggiorni la matrice memorizzata nella Windows Procedure (ricorda di dichiararlo static) e chiami InvaldateRect(hwd,NULL,TRUE) in questo modo cancelli tutta l'area e chiami il metodo WM_PAINT.
    2)Nel WM_PAINT con un semplice TextOut disegni vari dati.
    In questo modo non dovresti aver problemi!
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

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.