Startscreen von Adobe-Produkten ...



  • dEUs schrieb:

    [ none] schrieb:

    dEUs schrieb:

    Muss ich wegen dir jetzt Adobe Reader 6 runterladen und installieren?

    Was willste mit dem Reader ?

    Der Reader ist von Adobe?? Und er hat genau diesen Startbildschirm auf den sich der Threadersteller bezieht.

    Und weil er von Adobe ist hat natürlich jedes Adobe Prog den selben Startup Screen. Was für eine krasse Logik 🙄



  • [ none] schrieb:

    dEUs schrieb:

    [ none] schrieb:

    dEUs schrieb:

    Muss ich wegen dir jetzt Adobe Reader 6 runterladen und installieren?

    Was willste mit dem Reader ?

    Der Reader ist von Adobe?? Und er hat genau diesen Startbildschirm auf den sich der Threadersteller bezieht.

    Und weil er von Adobe ist hat natürlich jedes Adobe Prog den selben Startup Screen. Was für eine krasse Logik 🙄

    Was willst du eigentlich? 😕
    Machst mich hier den ganzen Thread lang schon blöd an. Langsam is gut. 👎



  • Ich erkläre dir nun gerne nochmal, dass es vllt. bei dem Reader mit dem Screenshot funktioniert. Bei Photoshop kannst du aber die Fenster im Hintergrund verschieben. Du solltest also nicht von einem prog auf alle anderen verallgemeinern. ich würde erwarten, dass du es nun endlich begriffen hast. Ansonsten würde ich wirklich noch ernsthafter an dir zweifeln.

    btw. Lass mich raten, dass mit Photoshop haste überlesen ? 😮
    oder warum bist du so geil auf den Reader ?



  • Das selbe scheinst du ja acuh zu tun.
    Ich bin hier raus, keine Lust mehr... 👎



  • Mit den normalen Windows Regions geht das nicht, weil die keine Transparenz zwischen 0 und 1 können. Die haben scharfe Ecken - also entweder ganz durchsichtig oder gar nicht.

    Es gibt zwei Möglichkeiten: entweder Screenshot und dann dein eigenes Zeug drüberpappen. Das geht in jedem Windows. Der Hintergrund ändert sich dann an den betroffenen Stellen nicht, wenn man Fenster im Hintergrund verschiebt.

    Oder du verwendest layered Windows. Die gibt es erst seit Win 2000. Dann kann man auch den Hintergrund verschieben, und alles schaut so aus, wie es soll.



  • Okay, also ich hab mich nun für die SplashScreen-Variante von Codeproject entschieden:

    http://www.codeproject.com/miscctrl/ABasuSplash.asp

    Wie hier auch schon oft diskutiert, sind die Übergänge zwischen Splash und Hintergrund aber hart. Um diese "weich" machen zu können, habe ich die Übergangsbereiche in einem separaten Bitmap gespeichert. Dieses Bitmap ist Blau (0,0,255) und besitzt die weichen weißen Übergänge.

    Nun hatte ich vor, mit diesem Sourcecode hier:

    CBitmap bitmap;   
        bitmap.CreateBitmap( 100, 900, 1,24, NULL );   
        CDC MemDC;   
        CDC* pDC = GetDC();   
        MemDC.CreateCompatibleDC( pDC );   
        MemDC.SelectObject(bitmap);   
        MemDC.MoveTo(10,100); // x und y Koordinaten oder ?? 
        MemDC.LineTo(10,100); //dito x,y ?? wozu ist dann BitBlt ?? 
        pDC->SelectObject(bitmap); 
        pDC->BitBlt(0,0,900,100, &MemDC, 0,0, SRCCOPY); 
    
        DC2Bitmap(pDC->m_hDC,1024,768,"c:\\testbild.bmp"); //ok is klar Größe der ganzen Bilddatei angeben
    

    (Den Sourcecode habe ich übrigens aus diesem Thread: http://www.c-plusplus.net/forum/viewtopic.php?t=89890&highlight=dc2bitmap)

    ... einen Screenshot von dem Desktop zu erzeugen, den interessierenden Bereich "auszuschneiden" und mit meinem weichen-Übergangsbitmap logisch UND zu verknüpfen, wobei Blau (0,0,255) jedoch als transparente Farbe nicht betrachtet wird.

    Soweit die Planung, nun das Problem:
    Wenn ich den oben stehenden Sourcecode in mein Projekt einbinde, das praktisch nur aus dem Splashscreen-Sourcecode von Codeproject stammt, dann bekomme ich die folgende Fehlermeldung:

    c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxv_w32.h(18): fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
    

    Grund hierfür ist die notwendige Einbindung von

    afxwin.h
    

    ohne das CBitmap sonst nicht verarbeitet werden könnte. Leider hab ich jetzt irgendwie die Übersicht verloren, aus welchem meiner files ich jetzt

    windows.h
    

    rausnehmen soll. Mein Multiple-Choice-Versuch war leider nur wenig erfolgreich ... und neu schreiben kann man die Bitmapklassen ja nun auch nicht ... naja, nicht unbedingt, wenn es auch einfacher geht.

    Kennt jemand das Problem und kann mir helfen ?



  • schmeiss den afxwin-include raus und setze den include der splashscreenheaderdatei unter den include von stdafx.h. Dann sollte es eigentlich tun.



  • Das funktioniert nicht, ohne afxwin.h hab ich 30 Fehlermeldungen. Alle hängen damit zusammen, dass der CBitmap und davon abgeleitete Parameter nicht erkennt ...

    Hier der Anfang der SplashClient.cpp-Datei:

    //  ===========================================================================
    //  File    SplashClient.cpp
    //  Desc    Test stub for the CSplash class
    //  ===========================================================================
    #include "stdafx.h"
    #include "splash.h"
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	CBitmap bitmap;   
        bitmap.CreateBitmap( 100, 900, 1,24, NULL );   
        CDC MemDC;   
        CDC* pDC = GetDC();   
        MemDC.CreateCompatibleDC( pDC );   
        MemDC.SelectObject(bitmap);   
        MemDC.MoveTo(10,100); // x und y Koordinaten oder ?? 
        MemDC.LineTo(10,100); //dito x,y ?? wozu ist dann BitBlt ?? 
        pDC->SelectObject(bitmap); 
        pDC->BitBlt(0,0,900,100, &MemDC, 0,0, SRCCOPY); 
    
        DC2Bitmap(pDC->m_hDC,1024,768,"c:\\testbild.bmp"); //ok is klar Größe der ganzen Bilddatei angeben
    


  • hm, dann versuch mal, ob es klappt, wenn du in die sourcecodedatei des splashscreens die stdafx.h includierst.



  • Okay, das habe ich jetzt gemacht und es funktioniert. Vielen dank. Nun ist aber leider gleich das nächste Problem aufgetreten ... GetDC() will mein Compiler nicht haben, weil er meint, dass er ein Argument übergeben haben will. Das ist ein Handle ...

    Suche ich auf MSDN nach GetDC bekomme ich nicht wirklich viel Infos:

    *Retrieves the device context that currently has the image selected into it.

    HDC GetDC( ) const throw( );
    Return Value
    A handle to a device context.

    Remarks
    For each call to GetDC, you must have a subsequent call to ReleaseDC.*

    Außerdem wird da HDC und nicht CDC verwendet ...



  • [ none] schrieb:

    Ich erkläre dir nun gerne nochmal, dass es vllt. bei dem Reader mit dem Screenshot funktioniert. Bei Photoshop kannst du aber die Fenster im Hintergrund verschieben. Du solltest also nicht von einem prog auf alle anderen verallgemeinern. ich würde erwarten, dass du es nun endlich begriffen hast. Ansonsten würde ich wirklich noch ernsthafter an dir zweifeln.

    btw. Lass mich raten, dass mit Photoshop haste überlesen ? 😮
    oder warum bist du so geil auf den Reader ?

    hey du ei, die fenster von PS erscheinen erst, wenn der Splashscreen verschwunden ist. Bevor man einen auf klugscheißer macht, sollte man wissen wovon man redet



  • könnt ihr euren persönlichen Streit bitte über diese netten privaten Nachrichten verschicken? Wäre echt super, weil sonst der Zusammenhang dieses Themas total verlorengeht.

    THX



  • Er will ein Handle auf ein Fenster (ein HWND).



  • Ihr seid doch immer noch bei der CDC* pDC = GetDC();, oder? Bei mir funktioniert die Funktion reibunglos, was habt ihr da für Probs?



  • ... nicht mehr ganz. Mittlerweile habe ich ein Bildschirmbild als Bitmap. Das ist ja schonmal nicht schlecht. Was aber momentan noch scheitert, ist das Speichern. Den Code für die Desktop-Aufnahme habe ich aus einem anderen Thread:

    http://www.c-plusplus.net/forum/viewtopic.php?t=64339&postdays=0&postorder=asc&highlight=desktop+bitmap&start=0

    Mein Problem ist, dass mein Filename wie in dem Beispielprogramm beschrieben, ein char ist, CreateFile aber einen anderen Paramter bekommen will. Hier mal meine Fehlermeldung:

    error C2664: 'CreateFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
    

    Eine explizite Typumwandlung hab ich einfach mal probiert (ich weiß: ziemlich diletantisch ... aber naja .. ) ... das klappt natürlich nicht.

    Tipp???



  • Ich finde mich gerade nicht so gut in diesem Code gewür zurecht, kannst de denn nicht einfach stat ne char Variable, ne LPCWSTR Variable anlegen? also

    LPCWSTR Filename;
    


  • Okay, dann kommt hier mal mein kompletter Quelletext:

    #include "stdafx.h"
    
      #include <sstream> 
      #include <string> 
      #include <stdlib.h> 
      #include <iostream> 
      #include <stdio.h> 
    
    int dc2bitmap(HDC hdc, int width, int height); 
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	HDC hdc; 
        RECT rt; 
        HWND hWnd;
    
    	int iBreite = 0;
    	int iHoehe	= 0;
        int result	= 0; 
    
    	hWnd=GetDesktopWindow(); 
      	hdc = GetWindowDC(hWnd); 
        GetWindowRect(hWnd,&rt); 
        iBreite = rt.right - rt.left;         // Wir brauchen die Differenz 
        iHoehe = rt.bottom - rt.top;          // also die Breite und Höhe des Fensters 
        result = dc2bitmap(hdc, iBreite, iHoehe); 
        ReleaseDC(hWnd,hdc);
    
    	return 0;
    }
    
    int dc2bitmap(HDC hdc, int width, int height) 
    { 
    	HDC			hdc2;
    	hdc2 = CreateCompatibleDC(hdc);
    
    	HBITMAP		aBmp; 
    	BITMAPINFO	bi; 
    	HGDIOBJ		OldObj;
    	HANDLE		fileHandle;
    
    	void *dibvalues;
    
    	BITMAPFILEHEADER	bmfh; 
    	BITMAPINFOHEADER	bmih; 
    	DWORD				bytes_write; 
    	DWORD				bytes_written;
    
    	ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); 
    	bmih.biSize=sizeof(BITMAPINFOHEADER); 
    	bmih.biHeight=height; 
    	bmih.biWidth=width; 
    	bmih.biPlanes=1; 
    	bmih.biBitCount=24; 
    	bmih.biCompression=BI_RGB; 
    	bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight; 
    	bmih.biXPelsPerMeter = 0; 
    	bmih.biYPelsPerMeter = 0; 
    	bmih.biClrImportant = 0;
    
    	bi.bmiHeader=bmih;
    	aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL);
    
    	OldObj=SelectObject(hdc2,aBmp); 
    	BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY);
    
    	ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER)); 
    	bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
    	bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
    	bmfh.bfType=0x4d42; 
    	bmfh.bfReserved1 = 0; 
    	bmfh.bfReserved2 = 0; 
    
    	fileHandle=CreateFile(L".\\Bitmap.bmp",GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL, 
          CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); 
    
    	// Write the BITMAPFILEHEADER 
    	bytes_write=sizeof(BITMAPFILEHEADER);
    
    	//Write the BITMAPINFOHEADER 
    	bytes_write=sizeof(BITMAPINFOHEADER);
    
    	//Write the Color Index Array??? 
    	bytes_write=bmih.biSizeImage;//3*bmih.biHeight*bmih.biWidth;
    
    	// CloseHandle(fileHandle); 
    	DeleteObject(SelectObject(hdc2,OldObj)); 
    	DeleteDC(hdc2);
    
    	return 1; 
    }
    

    Das Problem liegt an dieser Zeile:

    fileHandle=CreateFile(L".\\Bitmap.bmp",GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
    

    Nun habe ich das Problem, dass zwar ein Bitmap erzeugt wird, das ist jedoch 0 KB gross. Bei einer normalen Monitorauflösung ... bissl wenig ... scheinbar werden die daten garnicht geschrieben ... *seufz



  • Sorry das ich jetzt mal so dazwischen funke,
    und die Konvertierung zum WideChar haste ja schon selber gelöst 🙂

    aber seit ihr euch sicher das der AdobeReader6 nen Screenshot macht?

    Ich habe die Ehre noch unter WinNT 4.0 zu arbeiten und da ist der gesamte
    vereckige Bereich des SplashScreens einfach nur grau.


Anmelden zum Antworten