Newsgroup: it.comp.programmare.win32
Titolo: AIUTO! piccola interfaccia - ne ho MOLTO bisogno...

Questa è una supplica:
Devo fare, entro tempi brevissimi e rigorosamente in visual c++ (microsoft
visual studio 6), la seguente cosa:
E' una interfaccina ridicola e semplice, si tratta di disegnare una griglia
di quadratini bianchi in una app win32.
Diciamo 10x15 quadratini di dimensioni 32x32pixel.
Una volta fatto questo, se l'utente clicca su un quadratino questo diventa
nero. Se riclicca torna bianco.
Alla fin della fiera, mi deve scrivere un file, diciamo "ingressi.txt", un
semplice file di testo, con un vettore di 0 e 1 rappresentante quella
matrice di quadratini.
Nel mio caso quindi un vettore di 150 elementi, o se preferite un file di
testo di 150 caratteri, 0 quando l quadratino è bianco, 1 se è nero.
ad esempio:
O @ @ @ O
@ O O O @
@ O O O O
@ O O O O
@ O O O @
O @ @ @ O    .......Deve essere un vettore così:
011101000110000100001000101110
Vi prego, ho bisogno ALMENO di CAPIRE come si fa. E' il mio primo giorno col
visual C++, ho sempre fatto tutto in modo testo e non so dove mettere le
mani. Se non consegno questa interfaccia stupidina passo dei guai.

 dove mettere le mani.
Hehe, mi ha colpito il tono sconsolato del tuo messaggio, dato che non ho
sonno ti do l'imbeccata sull'interfaccia utente sperando che basti. Crea col
wizard un progetto Win32 GUI che mostra una semplice finestra. Definisci nel
sorgente principale l'array:
BOOL quadrati[10][15];
E inizializza tutti gli elementi a FALSE. Vai nella window procedure della
finestra, che e` una funzione con prototipo del tipo LRESULT CALLBACK
WndProc( HWND, UINT, WPARAM, LPARAM) e aggiungi dentro al blocco switch
(potrebbe esserci qualche errorino, non ho provato):
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint( hwnd, &ps);
    HBRUSH oldbrush = SelectObject( hdc, GetStockObject( BLACK_BRUSH));
    int x,y;
    for( x=0;x<10; x++)
        for(y=0; y<15; y++)
        {
            if( quadrati[x][y])
                SelectObject( hdc, GetStockObject( BLACK_BRUSH));
            else
                SelectObject( hdc, GetStockObject( WHITE_BRUSH));
            Rectangle( hdc, x*32, y*32, (x+1)*32, (y+1)*32);
        }
    SelectObject( oldbrush);
    EndPaint( hwnd, &ps);
}
break;
case WM_LBUTTONUP:
{
    int x = LOWORD(lParam) / 32;
    int y = HIWORD(lParam) / 32;
    if( 0<=x && x<10 && 0<=y && y<15)
    {
        RECT rc;
        quadrati[x][y] = !quadrati[x][y];
        rc.top = y*32; rc.bottom = (y+1)*32; rc.left=x*32;
            rc.right=(x+1)*32;
        InvalidateRect( hwnd, &rc, FALSE);
        UpdateWindow( hwnd);
    }
}
break;
Questo ti fa l'interfaccia grafica, non ti resta da fare che il salvataggio.
Se hai gia` programmato sotto DOS o altrove lo sai gia` fare, fopen() e
amiche funzionano anche sotto a Windows.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

 
http://antani.virtualave.net/
Lorenzo Lutti.... tra l'altro io in un modo o nell'altro ti ho già riletto
un sacco di volte.

     HBRUSH oldbrush = SelectObject( hdc, GetStockObject( BLACK_BRUSH));
Ehm..... so che ci farň la figura del bischero, ma tanto l'ho detto in
anticipo che sono un principiante assoluto col visual..
ho fatto il cast (HBRUSH__*) e non ho piů errori, solo 2 warning...
ma quando vado a eseguire il programma, non mi fa vedere nulla.
Come mai nelle Resources vedo solo l'about box che mi ha creato il wizard?
E dove cappero č finito il buon vecchio void main() ??????
sigh
il tempo stringe

 Io i puntatori a void non li ho mai usati... se è void, cosa putano??
Non è un problema è solo una noia ;-)
Eccoti il casting:
HBRUSH oldbrush = (HBRUSH) SelectObject( hdc, GetStockObject( BLACK_BRUSH));
Un puntatore void definisce un puntatore generico. In questo caso la
funzione SelectObject può restituire diversi puntatori (HBRUSH,HPEN,HFONT
ecc.) ed è per questo che è necessario specificare quale di questi
restituirà.
ciao ciao

 HBRUSH oldbrush = (HBRUSH) SelectObject( hdc,
etStockObject( BLACK_BRUSH));
Fatto il casting.. ma.....
Mi sai dire perchč non appare niente di niente, in esecuzione?? :-)
Nelle resources l'unica dialog che riesco a vedere č l'about box.
So di approfittare della tua cortesia ma.. potresti darmi info piů
dettagliate su come fare questa tristissima interfaccia?
Adesso il codice lo abbiamo... il problema č che proprio non so usare
l'ambiente visual. :-((((
Come fo a dirgli in QUALE finestra eseguire tutto questo?
Io sono abituato conil buon vecchio void main(), lui lo eseguiva da capo a
piedi e buonanotte. Qui come si fa? ;-(((

"Emily" <non...@nonmirispondere.mai> ha scritto nel messaggio
news:AkmA6.4225$hU1.9...@news4.aus1.giganews.com...

Guarda potrei postarti il codice completo dell'applicazione per quanto č
semplice.
Perň penso che non ti sarebbe d'aiuto nella comprensione "dell'ambiente
visual" ma sopratutto del funzionamento di una applicazione win32.
Quindi mi limiterň a fornirti delle "dritte":
1) Sviluppi col Microsoft Visual C++ 6.0
    quindi dovresti avere anche la documentazione MSDN.
    Leggi Subito: Platform SDK ->Windows Programming Guideline -> Win32
Programmig
    Ci trovi un applicazione tipo con i sorgenti (Source Code). La esegui te
la studi e sostituisci la MainWindowProc con quella che ti ha postato Lorezo
Lutti.
2) Il buon vecchio void main() č sostituito nelle applicazioni windows dal
int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int).
3) Se le MSDN ti risulta troppo dispersiva comprati un buon libro.
4) Se dopo tutto ciň hai ancora problemi e stai pensando di usare un
rivoltella... rispondimi privatamente possibilmente con un path di ritorno
valido cosě evitiamo di intasare il newsgroup con domande e risopste di
scarso interesse generale.

 il tempo stringe
Dato che ormai l'ho compilato, non mi costa niente spedirti l'intero
"progetto" via e-mail. Se non riesci a risolvere dimmi qualcosa.


Potrei sapere come e' possibile che una persona al primo giorno con il VC++
possa essere in grado di fare una applicazione di questo genere (anche se
semplice) ???
L'unico modo e' dargli il sorgente, ma ...
Insomma se ti leggi i primi 6 (mi pare) capitoli del Petzold sulle Win32
API(ci si mette un paio di giorni) ci arrivi e alla grande.
Quello che ti manca non e' "l'ambiente visual", ma bensi' l'uso delle API di
windows ed in particolare dell GDI.
Di visual qui non ti serve proprio nulla !!!
Alex
P.S. se veramente ti serve questo codice (faccio fatica a comprenderne la
fretta e l'utilita') possiamo postartelo tranquillamente, personalmente con
un po' di copia incolla e qualche modifica sono in grado di fartelo di crica
2 minuti, ma ti serve consegnarlo od imparare ????????????

Ah, per favore non postare su piu' NG :
free.it.programmazione,it.comp.lang.c++,it.comp.programmare.win32
Basta it.comp.programmare.win32 !!!

Apri Ms VC++ 6
Fai new dal menu File
ed in progetti clicca su Win32Application
inserisci il nome del progetto : quadratini
seleziona "un progetto vuoto"
Nella vista files del progetto clicca sulla cartella files sorgenti (source
files) con il tasto sinistro.
ora fai file->nuovo e su files sciegli C++.
chiamalo file1
ora nel foglio bianco (file1.cpp) copia il seguente codice:
//////////////////////////////////////////////////////////////////
// Includes:
//////////////////////////////////////////////////////////////////
#define WIN32_LEAN_AMD_MEAN
#include<windows.h>
//////////////////////////////////////////////////////////////////
// Defines:
//////////////////////////////////////////////////////////////////
#define X_SIZE 10
#define Y_SIZE 15
#define WHITE 1
#define BLACK 0
//////////////////////////////////////////////////////////////////
// Globals:
//////////////////////////////////////////////////////////////////
int aBoard[X_SIZE][Y_SIZE];
int cxClient=0,cyClient=0,cxBox=0,cyBox=0,cxMod=0,cyMod=0;
//////////////////////////////////////////////////////////////////
// Prototypes:
//////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void Prepare();
//////////////////////////////////////////////////////////////////
// WinMain:
//////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR
lpCmdLine,int nShowCmd)
{
 WNDCLASS wndclass;
 HWND hwnd;
 MSG msg;
 static TCHAR szAppName[]=TEXT("Quadratini - alpha v.0001");
 wndclass.cbClsExtra=0;
 wndclass.cbWndExtra=0;
 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 wndclass.hInstance=hInstance;
 wndclass.lpfnWndProc=WndProc;
 wndclass.lpszClassName=szAppName;
 wndclass.lpszMenuName=NULL;
 wndclass.style=CS_VREDRAW|CS_HREDRAW|CS_DBLCLKS;
 if(!RegisterClass(&wndclass)){
  MessageBox(NULL,TEXT("Error: 0001"),TEXT("Fatal
Error:"),MB_OK|MB_ICONERROR);
  return 0;
 }
 hwnd = CreateWindow(
        szAppName,szAppName,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,
        32*X_SIZE,32*Y_SIZE,
        NULL,NULL,hInstance,NULL
       );
 ShowWindow(hwnd,nShowCmd);
 UpdateWindow(hwnd);
 while(GetMessage(&msg,NULL,0,0)){
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return msg.wParam;
}
//////////////////////////////////////////////////////////////////
// MessageHandler:
//////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
 static HDC hdc;
 static PAINTSTRUCT ps;
 switch(msg){
  case WM_CREATE:
  {
   Prepare();
   return 0;
  }
  case WM_SIZE:
  {
   cxClient=LOWORD(lParam);
   cyClient=HIWORD(lParam);
   cxBox=(int)cxClient/X_SIZE;
   cyBox=(int)cyClient/Y_SIZE;
   cxMod=cxClient%X_SIZE;
   cyMod=cyClient%Y_SIZE;
   return 0;
  }
  case WM_LBUTTONDBLCLK:
  {
   static int x=0,y=0;
   static RECT rect;
   x=LOWORD(lParam)/cxBox;
   y=HIWORD(lParam)/cyBox;
   if(aBoard[x][y]==WHITE)
    aBoard[x][y]=BLACK;
   else
    aBoard[x][y]=WHITE;
   rect.top=y*cyBox; rect.bottom=(y+1)*cyBox;
   rect.left=x*cxBox; rect.right=(x+1)*cxBox;
   InvalidateRect(hwnd,&rect,TRUE);
   return 0;
  }
  case WM_PAINT:
  {
   hdc=BeginPaint(hwnd,&ps);
   // Painting goes here...
   for(int
;x<X_SIZE;++x){ 
    for(int y=0;y<Y_SIZE;++y){
     if(aBoard[x][y]==WHITE)
      SelectObject(hdc,GetStockObject(WHITE_BRUSH));
     else
      SelectObject(hdc,GetStockObject(BLACK_BRUSH));
     Rectangle(hdc,x*cxBox,y*cyBox,(x+1)*cxBox,(y+1)*cyBox);
    }
   }
   EndPaint(hwnd,&ps);
   return 0;
  }
 
  case WM_DESTROY:
  {
   SelectObject(hdc,(HBRUSH)GetStockObject(WHITE_BRUSH));
   PostQuitMessage(0);
   return 0;
  }
 }
 return DefWindowProc(hwnd,msg,wParam,lParam);
}
//////////////////////////////////////////////////////////////////
// Functions:
//////////////////////////////////////////////////////////////////
void Prepare()
{
 for(int
;x<X_SIZE;++x){ 
  for(int y=0;y<Y_SIZE;++y){
   aBoard[x][y]=WHITE;
  }
 }
}
//////////////////////////////////////////////////////////////////
// __EOF__
//////////////////////////////////////////////////////////////////
N.B. nel copia incolla potrebbe essersi incasinato un pochino (inoltre outlook express cancella molte graffe di apertura, boh ?!?)
A questo punto compilalo e vedrai che e' quello che volevi: salvataggi a parte !!!
Un'altra cosa definiscilo come Release e (ora e' come debug) in questo modo occupera' 5 volte di meno circa !!!
Alex
P.S. se il codice non funziona comunicami la tua mail e te lo mandero' come file allegato !
Spero che possa esserti utile, ma e' meglio che ti compri un buon libro, il Vc++ non si impara a forza di provare come il VBasic !!!
Emily ha scritto nel messaggio ...


Come previsto sono state spezzate tutte le righe, i tab si sono xxxxx,
etc....
Beh, visto che conosci il C/C++ se ci lavori un attimo sopra dovresti
riportarlo come prima !!!
Alex

 Basta it.comp.programmare.win32 !!!
Era un problema di emergenza. Cercavo aiuto moooolto immediato. Qualcuno me
l'ha dato e ringrazio.

Te l'ho dato anche io , controlla !!!
Ufhh !
Alex
"Emily" <non...@nonmirispondere.mai> ha scritto nel messaggio
news:bQTA6.142004$lj4.4...@news6.giganews.com...


Mi intrometto......
cosa è il Petzold ??
Grazie
StefaM
"Alex" <Nom...@wow.boh> ha scritto nel messaggio
news:NDBA6.330$xC3....@news.infostrada.it...


 ha scritto nel messaggio
news:w2ZE6.82510$s93.8...@news.infostrada.it...


 +++++++++++++++++++++++++++
una mattonata sui coglioni.....
ma ne vale la pena.
--
Byez
Nukkager
"Entrare è stata la parte facile, uscirne sara' la parte piu'
complessa"

 ha scritto nel messaggio
news:hiiF6.2588$PE.1...@news.infostrada.it...
