Newsgroup: it.comp.programmare.win32
Titolo: Problemi con VC++ 5.0 e DX7.0

Ciao a tutti!
Sono da poco passato al VC++5.0 e sto cercando di utilizzare le dx 7.0. Ho
scaricato l'SDK light da 
microsoft.com
, e l'ho installato correttamente. ho
compilato un programma (era in un tutorial sulle dx7) e funziona
correttamente.
Ho provato a scrivere un prog molto simile, giusto per iniziare dalle basi,
ma non vuole nemmeno sapere di partire. Ogni volta che uso una funzione
delle ddraw, il compilatore mi da il seguente errore "error C2039: 'xxxxx' :
is not a member of 'IDirectDrawSurface7'", dove xxxxx è qualsiasi funzione
ddraw!
Come mai? Ho incluso il file ddraw.h, e ho inserito i file .lib nella
configurazione del vc++.
Credo dipenda da me, dal mio sorgente, visto che il sorgente del tutorial
veniva compilato correttamente.
Ecco il sorgente:
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <stdio.h>
#define WIN32_LEAN_AND_MEAN
#define NOME "Applicazione base"
#define TITOLO "Base"
LRESULT CALLBACK WinProc(HWND hWnd, unsigned msg, WPARAM wParam, LPARAM
lParam);
HRESULT InitDD(HINSTANCE hInstance, int nCmdShow);
HRESULT InitFail(HWND hWnd, HRESULT hRet, LPCTSTR szError);
void CloseDD(void);
void game(void);
////////////////Direct Draw 7/////////////////
LPDIRECTDRAW7   oggetto = NULL;  //
LPDIRECTDRAWSURFACE7 front = NULL;  //
LPDIRECTDRAWSURFACE7 back = NULL;  //
//////////////////////////////////////////////
DDSURFACEDESC2  ddsd;  // Struttura che serve per inizializzare le surface
DDSCAPS2        ddscaps; // anche questa
HRESULT         hRet;  // Serve per vedere se c'è un errore
HWND   hWnd;  // handler alla win
BOOL   theApp;  // stato della mainproc
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR
lpCmdLine,int nCmdShow)
{
 MSG msg;
 if (InitDD(hInstance, nCmdShow) != DD_OK)
  return (1);
 for(;;)
 {
 if(PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ))
 {
  if( !GetMessage( &msg, NULL, 0, 0 ) )
   return msg.wParam;
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 if(theApp)
 {
  game();
 }
 }
return (0);
}
LRESULT CALLBACK WinProc(HWND hWnd, unsigned msg, WPARAM wParam, LPARAM
lParam)
{
 switch (msg)
 {
  case WM_DESTROY :
     {
      PostQuitMessage(0);
      CloseDD();
      return 0;
     }
 }
 return DefWindowProc(hWnd, msg, wParam, lParam);
}
HRESULT InitDD(HINSTANCE hInstance, int nCmdShow)
{
 WNDCLASS wc;
 wc.style = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc = WinProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
 wc.lpszMenuName = NOME;
 wc.lpszClassName = TITOLO;
 RegisterClass(&wc);
 hWnd = CreateWindowEx(0,
        TITOLO,
        NOME,
        WS_POPUP,
        0,
        0,
        GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
        NULL,
        NULL,
        hInstance,
        NULL);
 if (!hWnd)
  return FALSE;
 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
 SetFocus(hWnd);
 SetCursor(NULL);
 hRet = DirectDrawCreateEx(NULL, (VOID**)&oggetto, IID_IDirectDraw7, NULL);
 if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "DirectDrawCreateEx Fallito");
  hRet = oggetto->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN);
  if (hRet != DD_OK)
   return InitFail(hWnd, hRet, "SetCooperativeLevel Fallito");
  hRet = oggetto->SetDisplayMode(640, 480, 16, 0, 0);
  if (hRet != DD_OK)
   return InitFail(hWnd, hRet, "SetDisplayMode Fallito");
  ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize = sizeof(ddsd);
  ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
   DDSCAPS_FLIP |
   DDSCAPS_COMPLEX;
  ddsd.dwBackBufferCount = 1;
  hRet = oggetto->CreateSurface(&ddsd, &front, NULL);
  if (hRet != DD_OK)
   return InitFail(hWnd, hRet, "CreateSurface Fallito");
  ZeroMemory(&ddscaps, sizeof(ddscaps));
  ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  hRet = front->GetAttachedSurface(&ddscaps, &back);
  if (hRet != DD_OK)
     return InitFail(hWnd, hRet, "GetAttachedSurface Fallito");
  return (0l);
}
void CloseDD(void)
{
 if (oggetto != NULL)
 {
        if (front != NULL)
        {
            front->Release();
            front = NULL;
        }
        if (back != NULL)
        {
            back->Release();
            back = NULL;
        }
     }
 oggetto->Release();
 oggetto = NULL;
}
HRESULT InitFail(HWND hWnd, HRESULT hRet, LPCTSTR szError)
{
    char szBuff[128];
 sprintf(szBuff, "DirectDraw7: ");
 sprintf(szBuff, szError);
    CloseDD();
    MessageBox(hWnd, szBuff, TITOLO, MB_OK);
    DestroyWindow(hWnd);
    return hRet;
}
void game(void)
{
  BYTE *surface;
  register x,y;
  int r = 0;
  int g = 100;
  int b = 200;
  back->Lock(0,&ddsd,DDLOCK_WAIT,0);
  surface = (BYTE *)ddsd.lpSurface;
  for(x=0; x<ddsd.dwWidth; x++)
 for(y=0; y<ddsd.dwHeight ;y++)
 {
  surface[x+y*ddsd.lPitch] = RGB(r,g,b);
  if(r==255)r=0;
  if(g==255)g=0;
  if(b==255)b=0;
  r++; g++; b++;
 }
  back->Unlock( NULL );
}
Dove sta il problema? Il compilatore mi da anche un errore con la chiamata a
DirectDrawCreateEx. (il 3° parametro).
Grazie in anticipo.
Tdx

 ha scritto nel messaggio
news:15Nx5.49144$XZ4.6...@news.infostrada.it...


Ciao e grazie per l'aiuto!
Ho gia risolto il prob e ho capito dove sta l'errore. Il file sorgente in
questione aveva una estensione .c , e quindi il compilatore non "leggeva" il
c++ (le classi e relativi metodi delle DX). Ho rinominato il file in .cpp e
ora funzia tutto.
Pero ho un problema: non riesco proprio a capire il funzionamento del
sistema....cioe:
creo una superfice (LPDIRECTDRAWSURFACE7 lpDDS;), la inizializzo. Non
dovrebbe essere quello il mio "schermo virtuale"? Cosa c'entrano gli
"oggetti directdraw"? (LPDIRECTDRAW lpDD;) Cioe...non ne capisco
l'utilita...o meglio, mi sono fatto la seguente opinione: secondo me un
oggetto dd č una porzione di memoria che contiene una potenziale img. Questa
img viene poi blittata sulla surface principale (o sul back buffer...ah!
altro dubbio: devo usare per forza il double buffer?), e basta. E' cosi? mi
sa di no,,,
ringrazio anticipatamente chi mi volesse spiegare. (ho letto SDK e tutorial
vari, ma non sono chiarissimi su questo punto, tutti preferiscono parlare di
come inizializzare le dd, e poi si piantano li...
Grazie, Tdx

configurazione del vc++.
Il tuo sorgente e' in C, non in C++. Devi quindi aggiungere un "lpVtbl->"
nelle chiamate alle funzioni membro e passare come primo parametro il
puntatore all'oggetto. Esempio:
lpdd2->lpVtbl->SetCooperativeLevel(lpdd2, ...);
Oppure usi le macro apposite, che ti consiglio di cercare tra gli header
delle directx.
Saluti,
    Mardy

 oggetto dd è una porzione di memoria che contiene una potenziale img.
