Direct Draw Clipper Problem



  • Welche andere Wahl habe ich denn?

    Mit welcher Methode kann ich DDraw an Fenster binden?

    Gruß wreid



  • Du hast die Wahl zwischen Clipper benutzen oder nicht benutzen.

    An ein Fenster bindet man DDraw, indem man das hwnd uebergibt. f'`8k

    Autocogito

    Gruß, TGGC (\-/ has leading)



  • Was mache ich den hier Falsch?

    // Clipper anlegen und mit der primären Oberfläche verbinden
    iRet = lpDD->CreateClipper( 0, &lpDDClipper, NULL );
    
    // Clipper mit dem Hauptfenster der Anwendung verbinden, damit er 
    // von Windows auf dem laufenden gehalten wird
    iRet = lpDDClipper->SetHWnd( 0, m_hWnd );
    
    // Clipper mit der primären Oberfläche verbinden, damit Blt
    // Ausgaben entsprechend begrenzt.
    iRet = lpSurface->SetClipper( lpDDClipper )
    
    lpDDClipper->Release();
    

    Gruß wreid



  • Möchte noch paar inforamtionen mit geben.
    in der View-Klasse definiere ich den Fensterbereich und übergebe das ganze an CamDun-Klasse

    m_display.Create(NULL, 
                     WS_CHILD | WS_VISIBLE | WS_BORDER | SS_BLACKFRAME | SS_SUNKEN, 
                     WndBuilder->DisplayArea,
                     this, NULL);
    
    CamHwnd = m_display.GetSafeHwnd();
    m_s = new CamDun(CamHwnd);
    

    in der CamDun-Klasse der Konsturktor

    CamDun::CamDun(HWND hWnd)
    {
    WndBuilder  = new CWndBuilder();
    m_hWnd = hWnd;
    }
    

    Und somit habe ich doch HWND an Clipper übergeben oder ????



  • Sagt dir AdjustWindowRect() was?

    Wenn nicht noch mal melden 😉



  • TGGC schrieb:

    ...Uebrigens ist der DDraw Clipper sehr langsam, ich wuerde ihn nicht benutzen. f'`8k

    TGGC würde einen eigenen Clipper programmieren. Würde ich auch machen. Aber nur wenn ich eine Vollbildanwendung programmieren würde. Ansonsten nimm den DirectDraw Clipper. Ich wüsste jetzt nicht was dagegen sprechen sollte.



  • Netzwerk-Latenz schrieb:

    Ich wüsste jetzt nicht was dagegen sprechen sollte.

    Das damit blitten drei mal so lang dauert? War zumindest bei meiner letzten Messung so. f'`8k

    Gruß, TGGC (\-/ has leading)



  • AdjustWindowRect() hat mir sehr geholfen, jetzt wird alles angezeigt, wie sein sollte.

    Ich weis nicht ob ich noch einen neuen Beitrag eröffnen soll, ich habe ein Problem und weis nicht wie ich es lösen soll.
    Folgendes:
    Über ein LiveBild möchte ich ein Overlay erzeugen.

    /************************************/
    /* Create DirectDraw                */
    /************************************/
    iRet = DirectDrawCreate( NULL, &lpDD, NULL ) ;
    if(iRet!= DD_OK )
    {
    	sprintf(strErrorMSG, "DirectDrawCreate Error[%d]", iRet) ;        
    	::MessageBox(this->m_hWnd,strErrorMSG,"Error",MB_OK) ;
    }
    
    iRet = lpDD->SetCooperativeLevel( this->m_hWnd, DDSCL_NORMAL )  ;
    if(iRet!= DD_OK )
    {
    	sprintf(strErrorMSG, "SetCooperativeLevel Error[%d]", iRet) ;        
    	::MessageBox(this->m_hWnd,strErrorMSG,"Error",MB_OK) ;
    }
    
    ZeroMemory(&ddsd, sizeof(ddsd)) ;
    ddsd.dwSize = sizeof(ddsd) ;
    iRet = lpDD->GetDisplayMode( &ddsd ) ;
    if( iRet != DD_OK )
    {
    	sprintf(strErrorMSG, "GetDisplayMode Error[%d]", iRet) ;        
    	::MessageBox(this->m_hWnd,strErrorMSG,"Error",MB_OK) ;
    }
    
    iRet = lpDD->SetDisplayMode( ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount ) ;
    if( iRet != DD_OK )
    {
    	sprintf(strErrorMSG, "SetDisplayMode Error[%d]", iRet) ;
    	::MessageBox(this->m_hWnd,strErrorMSG,"Error",MB_OK) ;
    }
    
    // Create palette
    LPDIRECTDRAWPALETTE lpDDPalette ;
    
    iRet = lpDD->CreatePalette( DDPCAPS_8BIT, pe, &lpDDPalette, NULL ) ;
    if( iRet != DD_OK )
    {
    	sprintf(strErrorMSG, "CreatePalette Error[%d]", iRet) ; 
    	::MessageBox(this->m_hWnd,strErrorMSG,"Error",MB_OK) ;
    }
    /***********************************/
    /* Erzeuge ein overlay surface      */
    /***********************************/
    ddPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
    ddPixelFormat.dwFlags = DDPF_RGB;
    ddPixelFormat.dwFourCC= 0;
    ddPixelFormat.dwRGBBitCount = 16;
    
    memcpy(&(ddsd.ddpfPixelFormat), &ddPixelFormat, sizeof(DDPIXELFORMAT));
    
    iRet = lpDD->CreateSurface( &ddsd, &lpOverlay, NULL );
    if( iRet != DD_OK )
    {
      TRACE("Kann kein Overlay erzeugen ! 0x%08lx\n", iRet);
    }
    ...
    

    Nun dies funkt noch soweit, aber wenn ich das Overlay seigen möchte stützt das Prog ab.

    /***********************************/
    /* Positioniere und zeige  overlay */
    /***********************************/	
    CRect rectClient, rectOverlay;
    HRESULT iRet;
    GetWindowRect( &rectClient);
    AdjustWindowRect(&rectClient, GetStyle(), NULL);
    
    SetRect(&rectOverlay, 0, 0, 896, 768);
    
    ddofx.dwSize = sizeof(DDOVERLAYFX);
    ddofx.dckDestColorkey.dwColorSpaceLowValue = dwKeyColour;
    ddofx.dckDestColorkey.dwColorSpaceHighValue = dwKeyColour;
    
    dwFlags = DDOVER_KEYDESTOVERRIDE | DDOVER_SHOW;
    
    iRet = IDirectDrawSurface_UpdateOverlay(lpOverlay, &rectClient, lpSurface, &rectClient, dwFlags, &ddofx);
    if(iRet != DD_OK)
    {
    	::MessageBox(this->m_hWnd,"UpdateOverlay kann nicht angezeigt werden.\n","Error",MB_OK);
    }
    

    Es wird fehlerfrei kompiliert.
    Da ich auch Primär sowie Back Surface benutze, denke ich das ich kein Overlay mehr anlegen kann. Beziehungsweise implementiere ich Overlay falsch.
    Auf dem Overlay möchte ich Text ausgeben, sowie verschieden GDI-Methoden ausführen. Könnt ihr mich ein wenig nachhelfen, was ich da falsch mache.

    Gruß Waldemar



  • So wie ich das sehe hast du mehrere Probleme.



  • Ich wäre dir sehr dankbar, wenn du mir mein problem zeigen würdest. Es sieht so aus, als würde ich den wald vor lauter bäumen nicht sehen 😞 .


Anmelden zum Antworten