Fenster mit Aero Hintergrund



  • Hallo erstmal,
    zu meinem Problem:
    Ich möchte ein Windows Fenster erzeugen das komplett in Aero ist, also nicht nur der Rand.

    Im Internet habe ich leider nur ein Beispiel gefunden das sich auf C++ bezieht, die anderen waren entweder für C# oder VB.
    Dort habe ich folgende Funktion gefunden:

    HRESULT ExtendIntoClientBottom(HWND hwnd)
    {
    //Set margins, extend bottom
    MARGINS margins = {0,0,0,25};
    HRESULT hr = S_OK;

    //extend frame on bottom of client area
    hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
    if (SUCCEEDED(hr))
    {
    //do more things
    }
    return hr;
    }

    soweit ich das verstanden habe giebt mann mit der margins Variable an wo und wie weit der Ramen in das eigentliche Fenster verschoben werden soll.
    Allerdings bekomme ich beim Debuggen des Codes folgende Fehlermeldung:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__DwmExtendFrameIntoClientArea@8" in Funktion ""long __cdecl ExtendIntoClientBottom(struct HWND__ *)" (?ExtendIntoClientBottom@@YAJPAUHWND__@@@Z)".

    Soweit ich das verstehe (ich kenne mich noch nich soo gut aus) heist das das er die betreffende Funktion nicht findet. Auf der Seite von der ich den Code habe steht mann muss die dwmapi.h einbinden, das habe ich auch getan und wenn ich den Code ohne den obigen Codeblock (aber mit #include <dwmapi.h>) compiliere, bekomme ich keine Fehlermeldung was ja eingetlich heist das er die Header Datei findet oder?

    Weis jemand woran das sonst noch liegen könnte, oder kennt eine andere Möglichkeit Aero als Fensterhintergrund zu erhalten?

    MfG DrunkenHope



  • DrunkenHope schrieb:

    Weis jemand woran das sonst noch liegen könnte,...

    Verwendest du auch die aktuelle WindowsSDK? Die Aero-Funktionalitäten erfordern meines Wissens eine recht Neue...

    cu André



  • Das WinSDK war bei der VS2008 Installation dabei daher denke ich es müsste eigentlich zumindest ein relativ neues sein. Ich werde mir trozdem einmal das neueste holen vlt liegt es ja wirklich daran.
    Danke für den Tipp

    MfG DrunkenHope

    [edit]Wo kann ich denn das Windows SK herunterladen ? Auf der HP von MS hab ich nur ein Framework SDK gefunden und was ist von 2006 in dem Fall müsste das von VS2008 neuer sein (oder binn ich einfach nur blind und habe den Download übersehen)

    MfG DrunkenHope
    [edit]



  • Hast du dwmapi.lib gelinkt, wie es in der Dokumentation zu DwmExtendFrameIntoClientArea steht?



  • gelinked = den pfad zum Ordner in dem sich die Datei befindet angeben oder ?
    Ich habe bei Projekteigenschaften -> c/c++ -> zusätzliche Includeverzeichnisse den Pfad zum Includeverzeichniss des Microsoft SDK angegeben. Muss ich den sonst noch wo angeben ?

    Wenn ich den Code ohne den Block mit dem Aero zeug ausführe lässt er sich ausführen (auch wenn ich die dwmapi.lib per include eingebunden habe) wenn er die lib nicht findet müsste er da ja eigentlich einen Fehler bringen oder bringt er den nur wenn ich die auch verwende?

    MfG DrunkenHope

    [edit]
    Habe eben gesehen das ich nicht die dwmapi.lib sondern die dwmapi.h eingebunden habe, wenn ich die lib einbinde bekomme ich den fehler das er eine include Datei nicht öffnen kann. Wo muss ich denn die lib noch einbinden?

    MfG DrunkenHope
    [edit]



  • DrunkenHope schrieb:

    Habe eben gesehen das ich nicht die dwmapi.lib sondern die dwmapi.h eingebunden habe, wenn ich die lib einbinde bekomme ich den fehler das er eine include Datei nicht öffnen kann.

    Lib-Dateien bindet man auch nicht mit Includedirektive ein, sondern gibt sie bei den Linkereinstellungen an.



  • Hier mal der Code so wie ich ihn im Momment verwende.

    #include <windows.h>
    #include <dwmapi.lib>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    LRESULT CALLBACK MessageHandler(HWND hWnd,
    								UINT msg,
    								WPARAM wParam,
    								LPARAM lParam);
    
    HWND hWnd = 0;
    
    HRESULT ExtendIntoClientBottom(HWND hwnd);
    
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrevInstance,
    				   LPSTR lpCmdLine,
    				   int nCmdShow)
    {
    	hWnd = CreateMainWindow(hInstance);
    	MSG msg;
    
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
    		WNDCLASSEX wndClass = {
    			sizeof(WNDCLASSEX),
    			CS_DBLCLKS | CS_OWNDC |
    			CS_HREDRAW | CS_VREDRAW,
    			MessageHandler,
    			0,
    			0,
    			hInstance,
    			LoadIcon(NULL,IDI_WINLOGO),
    			LoadCursor(NULL,IDC_ARROW),
    			(HBRUSH)GetStockObject(WHITE_BRUSH),
    			NULL,
    			L"CGlassWindow",
    			LoadIcon(NULL,IDI_WINLOGO)
    		};
    
    		RegisterClassEx(&wndClass);
    
    		return CreateWindowEx(
    			NULL,
    			L"CGlassWindow",
    			L"GlassWindow",
    			WS_OVERLAPPEDWINDOW |
    			WS_VISIBLE,
    			0,
    			0,
    			400,
    			300,
    			NULL,
    			NULL,
    			hInstance,
    			NULL);
    }
    
    LRESULT CALLBACK MessageHandler(HWND hWnd,
    								UINT msg,
    								WPARAM wParam,
    								LPARAM lParam)
    {
    
    	switch(msg)
    	{
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    		break;
    	}
    
    	return (DefWindowProc(hWnd,msg,wParam,lParam));
    }
    
    HRESULT ExtendIntoClientBottom(HWND hwnd)
    {
       //Set margins, extend bottom
       MARGINS margins = {0,0,0,25};
       HRESULT hr = S_OK;
    
       //extend frame on bottom of client area
       hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
       if (SUCCEEDED(hr))
       {
          //do more things
       }
       return hr;
    }
    

    die dwmapi.lib habe ich gegen die dwmapi.h ersetzt.

    MfG DrunkenHope



  • Weist du wo ich die Linker einstellungen bei VS2008 finde?

    Grus DrunkenHope



  • DrunkenHope schrieb:

    Weist du wo ich die Linker einstellungen bei VS2008 finde?

    Mhh... ohne ihn gerade zur Hand zu haben, würde ich tippen das eine Möglichkeit wie folgt ist: RMT in dem Projektexplorer auf das Projekt, Eigenschaften, Unterpunkt Linker...


  • Mod

    Einfacher:

    #pragma comment(lib,"dwmapi.lib")
    


  • Danke,
    habe das Verzeichniss auch da eingebunden.
    Geht leider immer noch nicht, allerdings ist mir aufgefallen das weder die dwmapi.lib noch die dwmapi.h im verzeichniss "Microsoft SDK's/windows/v5.0/include bzw /lib vorhanden sind. Ist das garnicht das Windows SDK ? Weist du wo ich das herbekomme? habe auf der MS Homepage unter Downloads nach "Windows SDK" gesucht aber nichts gefunden.

    MfG DrunkenHope

    [edit] wenn ich des mit #pragma mache lässt er sich debuggen (auch wenn mir unklar ist woher er sich die lib nimmt 😃 )
    danke für den Tipp
    [edit]



  • OK, der Code lässt sich debuggen, aber egal was ich für margins eingebe (-1,-1,-1,,-1) oder (50,50,50,50) es ändert sich nichts am Fenster. Ich habe vorher die zeile "ExtendIntoClientBottom(hWnd);" vor den beginn der While schleife eingefügt, diese ist bei dem Code den ich gepostet habe noch nicht vorhanden.
    Das müsste doch eingentlich dazu führen das die Funktion HRESULT ExtendIntoClientBottom(HWND hwnd) ausgeführt wird, die wiederum den Aero Rand breiter machen müsste.

    Jemand eine Idee warum es nicht funktioniert?

    MfG DrunkenHope


Anmelden zum Antworten