Startscreen von Adobe-Produkten ...
-
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:
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östaber 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.