Forum: PC-Programmierung Steuerelemente in die Titelleiste intigrieren


von Seb (Gast)


Lesenswert?

Hallo,

was ich mich schon seit einiger Zeit frage, ist, wie die Entwickler 
Steuerelemente in die Titelleiste von Windows-Fenster einfügen.

Dies ist z.B. beim aktuellen I-Tunes so und bei Thunderbird:
https://dl.dropbox.com/u/21421516/titelleiste%20integrate1.png
https://dl.dropbox.com/u/21421516/titelleiste%20integrate2.png

Ich arbeite mit C und gcc als Compiler.

Viele Grüße,
Seb

von Arc N. (arc)


Lesenswert?

Die sind nicht in der Titelleiste...
Stichworte wären, wenn es in der Titelleiste sein soll, Ribbon Quick 
Access Toolbar und non-client area
http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx

von Seb (Gast)


Lesenswert?

Arc Net schrieb:
> Die sind nicht in der Titelleiste...
> Stichworte wären, wenn es in der Titelleiste sein soll, Ribbon Quick
> Access Toolbar und non-client area
> http://www.codeproject.com/KB/dialog/AeroNonClient...

Naja, aber z.B. bei Itunes, sind da die normalen schließen usw. Buttons 
obwohl es keine Titelleiste von Windows hat... Und wenn du mal bei 
Thunerbird schaust gehen zumindest die Tabs mit in die Titelleiste rein. 
Die ist nämlich bei Windows 8 normalerweise dicker...

Ich hab mir das mit C angetan und stelle immer häufiger fest, das es 
kaum noch eine C API Dokumentation gibt. Die neueren Sachen sind alle C# 
oder C++ und VB.net (Pfui)...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Seb schrieb:
> und stelle immer häufiger fest, das es
> kaum noch eine C API Dokumentation gibt.

Die Win32-API ist nach wie vor mit C nutzbar, und Owner-Draw-Fenster 
gibt es in Windows auch schon seit Jahrzehnten.

Nichts anderes machen alle von Dir erwähnten Anwendungen, einige davon 
verwenden vielleicht noch Subclassing, um Standard-GUI-Elemente mit 
eigenem Zeichencode auszustatten, anderer zeichnen die gesamte 
Oberfläche komplett selber.

von Seb (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Seb schrieb:
>> und stelle immer häufiger fest, das es
>> kaum noch eine C API Dokumentation gibt.
>
> Die Win32-API ist nach wie vor mit C nutzbar, und Owner-Draw-Fenster
> gibt es in Windows auch schon seit Jahrzehnten.
>
> Nichts anderes machen alle von Dir erwähnten Anwendungen, einige davon
> verwenden vielleicht noch Subclassing, um Standard-GUI-Elemente mit
> eigenem Zeichencode auszustatten, anderer zeichnen die gesamte
> Oberfläche komplett selber.

Das hier ist aber nicht Owner-Draw, und ich weis jetzt gerade nicht mal 
obs zur Win32-Api gehört:
http://www.codeproject.com/KB/dialog/AeroNonClient

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist .Net-Code. Was das genau treibt, wissen nur die, die den 
Quelltext der .Net-Libraries haben.

Final wird das natürlich auch wieder zu Win32-API-Aufrufen.

von heinz (Gast)


Lesenswert?

Könnte man auch ein Fenster ohne Capture machen und einfach die 
Steuerfelder die in einem "normalen" Programm sind zusätzlich zu den 
eigenen Steuerfeldern einfügen. Hätte den Vorteil dass man nur ein 
Fenster verwalten muss.

von Seb (Gast)


Lesenswert?

heinz schrieb:
> Könnte man auch ein Fenster ohne Capture machen und einfach die
> Steuerfelder die in einem "normalen" Programm sind zusätzlich zu den
> eigenen Steuerfeldern einfügen. Hätte den Vorteil dass man nur ein
> Fenster verwalten muss.

Wenns die Titelleiste als APi Funktion und die Buttons auch gibt, dann 
wäre das cool. Aber da ich kein Revererse-Eng. betreibe und mir dazu 
ehrlich gesagt auch die Zeit zu fehlt, wird es mir ein Rätsel bleiben. 
In der Win-32 API Doku habe ich dazu noch nichts gefunden.

PS:
.net Aufrufe müssen nicht zwangsläufig in der Win32-API Enden!

von Seb (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist .Net-Code. Was das genau treibt, wissen nur die, die den
> Quelltext der .Net-Libraries haben.
>
> Final wird das natürlich auch wieder zu Win32-API-Aufrufen.

Woran erkennst du das?
Auf den ersten Blick hätte ich jetzt C++ gesagt. Oder sind das 
Wrapper-Klassen sowas wie DWM etc.?

Ich kenne nur die C-API Funktionen, die dann aber auch sowas in der 
richtung wie DefWindowProc heißen.

von Arc N. (arc)


Lesenswert?

> Das ist .Net-Code. Was das genau treibt, wissen nur die, die den
> Quelltext der .Net-Libraries haben.

Also jeder der lesen kann scnr
http://referencesource.microsoft.com/netframework.aspx

Wobei der CodeProject-Artikel auf die verwendeten Win32-Funktionen 
verlinkt...

Zum eigentlichen Problem
WM_NCHITTEST, WM_NCPAINT usw. dazu DWM und WS_xyz-Kombinationen

von Seb (Gast)


Lesenswert?

Arc Net schrieb:
>> Das ist .Net-Code. Was das genau treibt, wissen nur die, die den
>> Quelltext der .Net-Libraries haben.
>
> Also jeder der lesen kann scnr
> http://referencesource.microsoft.com/netframework.aspx
>
> Wobei der CodeProject-Artikel auf die verwendeten Win32-Funktionen
> verlinkt...
>
> Zum eigentlichen Problem
> WM_NCHITTEST, WM_NCPAINT usw. dazu DWM und WS_xyz-Kombinationen

So ich hab nun versucht das ganze zu benutzen. Intressanterweise ist der 
Header für DWM da, allerdings findet der Linker (ld) die dwmapi nicht. 
Also die Bibliotheksdatei und ich habe ehrlcih gesagt keine Ahnung wo 
ich diese jetzt auftreiben kann, wenn sie anscheinend nicht von den 
gcc-Entwicklern mitgeliefert wurde.

Ich nutze gcc 4.7.0

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Seb schrieb:
> PS:
> .net Aufrufe müssen nicht zwangsläufig in der Win32-API Enden!

Und wo sollten sie es dann tun?

von Arc N. (arc)


Lesenswert?

Seb schrieb:
> So ich hab nun versucht das ganze zu benutzen. Intressanterweise ist der
> Header für DWM da, allerdings findet der Linker (ld) die dwmapi nicht.
> Also die Bibliotheksdatei und ich habe ehrlcih gesagt keine Ahnung wo
> ich diese jetzt auftreiben kann, wenn sie anscheinend nicht von den
> gcc-Entwicklern mitgeliefert wurde.

Die dürften im Windows SDK sein
http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx
Wenn es nicht zu viele Funktionen sind -> LoadLibrary, GetProcAddress

von Seb (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Seb schrieb:
>> PS:
>> .net Aufrufe müssen nicht zwangsläufig in der Win32-API Enden!
>
> Und wo sollten sie es dann tun?

Weis nicht, aber seit Windows 64 Bit nicht mehr zwangsläufig die 
Win32-Api (die ja nicht ohne Grund so heißt wie sie heißt).

Arc Net schrieb:
> Seb schrieb:
>> So ich hab nun versucht das ganze zu benutzen. Intressanterweise ist der
>> Header für DWM da, allerdings findet der Linker (ld) die dwmapi nicht.
>> Also die Bibliotheksdatei und ich habe ehrlcih gesagt keine Ahnung wo
>> ich diese jetzt auftreiben kann, wenn sie anscheinend nicht von den
>> gcc-Entwicklern mitgeliefert wurde.
>
> Die dürften im Windows SDK sein
> http://msdn.microsoft.com/en-us/windows/desktop/hh...
> Wenn es nicht zu viele Funktionen sind -> LoadLibrary, GetProcAddress

Ja hab die dll jetzt aus dem Windows Verzeichnis gefischt und die statt 
die statische Lib genommen. Allerdings zeigt das jetzt ein sehr 
komisches Verhalten:

https://dl.dropbox.com/u/21421516/dwmextend.png

Betreffende Codezeilen:
1
  ...
2
  case WM_CREATE:
3
    {
4
      struct sMARGINS marg = {0,0,20,0};
5
      DwmExtendFrameIntoClientArea(hwnd,&marg);
6
  ...
1
  ...
2
  default:
3
    DwmDefWindowProc(hwnd, msg,wParam,lParam,&result);
4
    return DefWindowProc(hwnd,msg,wParam,lParam);
5
  }
6
  ...
Alles in
1
WndProc

von Sharping (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und wo sollten sie es dann tun?

Neuerdings: in der Windows Runtime.

von Lukas K. (carrotindustries)


Lesenswert?

Sharping schrieb:
> Rufus Τ. Firefly schrieb:
>> Und wo sollten sie es dann tun?
>
> Neuerdings: in der Windows Runtime.

Die wiederum wie .net auch nur Win32 wrappt...

von G. C. (_agp_)


Lesenswert?

Lukas K. schrieb:
> Sharping schrieb:
>> Rufus Τ. Firefly schrieb:
>>> Und wo sollten sie es dann tun?
>>
>> Neuerdings: in der Windows Runtime.
>
> Die wiederum wie .net auch nur Win32 wrappt...

Nein, diesmal nicht ;). Die Windows Runtime ist definitiv eine (Teil-) 
Ablösung der bisherigen Win32-API, also komplett neu und Nativ in C++ 
geschrieben für Metro basierte Anwendungen auf Windows 8 (nur dort gibt 
es bisher die WinRT). Das Rendering läuft auch nicht im GDI sondern mit 
DirectX. Nur hat MS in WinRT nicht alles neu geschrieben (ca. 1800 neue 
Klassen gegenüber den 12.000 in .NET).

Es gibt also neue WinRT-DLLs, die dann nicht mehr sich der bekannten 
Funktionen aus der alten Win32-API bedienen müssen.

Nachzulesen ist das alles auf der Webseite vom ".NET Doktor" H. 
Schwichtenberg.

von Lukas K. (carrotindustries)


Lesenswert?

g. c. schrieb:
> Nein, diesmal nicht ;). Die Windows Runtime ist definitiv eine (Teil-)
> Ablösung der bisherigen Win32-API,
Hier widersprechen sich deutsche und englische wikipedia:
>Examination of the runtime libraries reveals that they are built upon
>Win32 API

Die deutsche Wikipedia sagt, dass Windows RT auf dem Win32-Subsystem 
aufbaut, aber gleichberechtigt mit der Win32-API ist.

von Arc N. (arc)


Lesenswert?

g. c. schrieb:
> Nein, diesmal nicht ;). Die Windows Runtime ist definitiv eine (Teil-)
> Ablösung der bisherigen Win32-API, also komplett neu und Nativ in C++
> geschrieben für Metro basierte Anwendungen auf Windows 8 (nur dort gibt
> es bisher die WinRT). Das Rendering läuft auch nicht im GDI sondern mit
> DirectX. Nur hat MS in WinRT nicht alles neu geschrieben (ca. 1800 neue
> Klassen gegenüber den 12.000 in .NET).
>
> Es gibt also neue WinRT-DLLs, die dann nicht mehr sich der bekannten
> Funktionen aus der alten Win32-API bedienen müssen.
>
> Nachzulesen ist das alles auf der Webseite vom ".NET Doktor" H.
> Schwichtenberg.

Der ... Ahnung hat...
WinRT nutzt Win32...
"Next, a C++ Metro application will still load Win32 DLLs such as 
kernel32 and ntdll. Moreover, the WinRT APIs call into the Win32 DLLs – 
so they are not a replacement but rather a wrapper, an API flavor, on 
top of Win32."
http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/15/winrt-and-net-in-windows-8.aspx

von G. C. (_agp_)


Lesenswert?

Arc Net schrieb:
>> ... Nachzulesen ist das alles auf der Webseite vom ".NET Doktor" H.
>> Schwichtenberg.
>
> Der ... Ahnung hat...

Denke schon bei den Stundensätzen. ;-)

http://win-rt.de/produkte/konditionen.aspx?S

> WinRT nutzt Win32...
> "Next, a C++ Metro application will still load Win32 DLLs such as
> kernel32 and ntdll. Moreover, the WinRT APIs call into the Win32 DLLs –
> so they are not a replacement but rather a wrapper, an API flavor, on
> top of Win32."
>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/15/winrt-and-net-in-windows-8.aspx

Soweit ich das gelesen habe fügt die WinRT auch neue Funktionen hinzu. 
Also nur "Wrapper" kann demnach wohl nicht sein.

http://www.it-visions.de/lserver/artikeldetails.aspx?b=6241

von Arc N. (arc)


Lesenswert?

g. c. schrieb:
> Denke schon bei den Stundensätzen. ;-)
>
> http://win-rt.de/produkte/konditionen.aspx?S

Das sind relativ normale Stundensätze, ob er die auch verdient ist eine 
andere Frage...

>> WinRT nutzt Win32...
>> "Next, a C++ Metro application will still load Win32 DLLs such as
>> kernel32 and ntdll. Moreover, the WinRT APIs call into the Win32 DLLs –
>> so they are not a replacement but rather a wrapper, an API flavor, on
>> top of Win32."
>>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/15/winrt-and-net-in-windows-8.aspx
>
> Soweit ich das gelesen habe fügt die WinRT auch neue Funktionen hinzu.
> Also nur "Wrapper" kann demnach wohl nicht sein.
>
> http://www.it-visions.de/lserver/artikeldetails.aspx?b=6241

"Some Windows Runtime APIs are thin wrappers around existing Win32 APIs 
(XML and the sensor APIs, for example). Some Windows Runtime APIs are 
completely new (the XAML APIs and the input stack). So it's not true to 
say that the windows runtime is a wrapper around Win32, but it is true 
that parts of the windows runtime are layered on top of Win32."
http://stackoverflow.com/questions/7475775/winrt-and-build-in-windows-8-apps
http://blogs.msdn.com/b/larryosterman/archive/2011/09/16/what-has-larry-been-doing-for-two-years-and-why-has-the-blog-been-dark-for-so-long.aspx

Die XAML-APIs sind zwar neugeschrieben worden, waren davor aber schon 
vorhanden (WPF/Silverlight/Windows Phone)..., inwieweit der Input Stack 
noch Win32-Funktionen nutzt entzieht sich meiner Kenntnis

"Auch das Rendering von XAML ist in der WinRT nun in nativem Code 
realisiert und hat damit das Potenzial, schneller zu sein als WPF und 
Silverlight."

Typischer Schwichtenberg... Es gab/gibt in WPF und Silverlight div. 
Rendering Tiers d.h. je nach Hardware bzw. DirectX-Unterstützung der GPU 
wird ein Teil in Software gerendert oder alles der GPU überlassen
http://msdn.microsoft.com/en-us/library/ms742196.aspx

von G. C. (_agp_)


Lesenswert?

Wie auch immer. Ist mir im Grunde auch alles nicht so wichtig, solange 
MS nicht auch WinRT den "ernstgemeinten" ;-) Desktop Windows Versionen 
wie Windows 7 bereitstellt.

von amateur (Gast)


Lesenswert?

Jeder Hype hinterherrennen. Ich weiß nicht.

Aber warte es mal ab bis die "Bringer" erst mal dahinterkommen, dass die 
gesamte Rückseite eines Formulares noch frei und ungenutzt ist...

von Seb (Gast)


Lesenswert?

Könnte mir jemand jetzt evenutell Helfen? Also um mal zum eigentlcihen 
Thema noch mal zurückzukommen, hat das jemand schon mal gehabt. Das 
klappt wie gesagt mit dwm bei mir nicht so wie gewollt. Im zitierten 
Text isn Screenshot.







eee

Seb schrieb:
>
> https://dl.dropbox.com/u/21421516/dwmextend.png
>
> Betreffende Codezeilen:  ...
>   case WM_CREATE:
>     {
>       struct sMARGINS marg = {0,0,20,0};
>       DwmExtendFrameIntoClientArea(hwnd,&marg);
>   ...
>   ...
>   default:
>     DwmDefWindowProc(hwnd, msg,wParam,lParam,&result);
>     return DefWindowProc(hwnd,msg,wParam,lParam);
>   }
>   ...
> Alles inWndProc

von Arc N. (arc)


Lesenswert?

Im Beispiel 
http://msdn.microsoft.com/en-us/library/windows/desktop/bb688195(v=vs.85).aspx 
wird u.a. DwmExtendFrameIntoClientArea in WM_ACTIVATE ausgeführt "This 
ensures that frame extension is handled properly when the window is at 
its default size and when it is maximized."

von Seb (Gast)


Lesenswert?

Arc Net schrieb:
> Im Beispiel
> http://msdn.microsoft.com/en-us/library/windows/de...
> wird u.a. DwmExtendFrameIntoClientArea in WM_ACTIVATE ausgeführt "This
> ensures that frame extension is handled properly when the window is at
> its default size and when it is maximized."

Muss ich mal ausprobieren. Aber ich glaube das ich es auch so gemacht 
habe vorher.
Ich probiers mal aus und meld mich sonst noch mal.
Danke.


Gruß Seb

von Seb (Gast)


Lesenswert?

Arc Net schrieb:
> Im Beispiel
> http://msdn.microsoft.com/en-us/library/windows/de...
> wird u.a. DwmExtendFrameIntoClientArea in WM_ACTIVATE ausgeführt "This
> ensures that frame extension is handled properly when the window is at
> its default size and when it is maximized."

Nein, daran lags also nicht. Habs ausprobiert. Immernoch das selbe 
Ergebnis. Diesmal ausgeführt in WM_ACTIVATE:
1
  case WM_ACTIVATE:
2
  {
3
    margin marg = {0,0,20,0};
4
    DwmExtendFrameIntoClientArea(hwnd,&marg);
5
  break;
6
  }

von Seb (Gast)


Lesenswert?

Seb schrieb:
> Arc Net schrieb:
>> Im Beispiel
>> http://msdn.microsoft.com/en-us/library/windows/de...
>> wird u.a. DwmExtendFrameIntoClientArea in WM_ACTIVATE ausgeführt "This
>> ensures that frame extension is handled properly when the window is at
>> its default size and when it is maximized."
>
> Nein, daran lags also nicht. Habs ausprobiert. Immernoch das selbe
> Ergebnis. Diesmal ausgeführt in WM_ACTIVATE:  case WM_ACTIVATE:
>   {
>     margin marg = {0,0,20,0};
>     DwmExtendFrameIntoClientArea(hwnd,&marg);
>   break;
>   }

Mh, keiner eine Idee, woran es liegen könnte?

von Selbsternannter Weltverbesserer (Gast)


Lesenswert?

Hallo,

das mit dem "intigrieren" wird nicht klappen, du könntest jedoch 
versuchen das Steuerelement zu "integrieren".

Es grüßt Euer
Selbsternannter Weltverbesserer

von Seb (Gast)


Lesenswert?

Selbsternannter Weltverbesserer schrieb:
> Hallo,
>
> das mit dem "intigrieren" wird nicht klappen, du könntest jedoch
> versuchen das Steuerelement zu "integrieren".
>
> Es grüßt Euer
> Selbsternannter Weltverbesserer

Mh, wie meinst du das?

von Sebi (Gast)


Lesenswert?

Selbsternannter Weltverbesserer schrieb:
> Hallo,
>
> das mit dem "intigrieren" wird nicht klappen, du könntest jedoch
> versuchen das Steuerelement zu "integrieren".
>
> Es grüßt Euer
> Selbsternannter Weltverbesserer

Also ich habs jetzt geschafft denn blauen Frame zu erweitern. Der Trick 
ist, dass man den Anwendungshintergrund Schwarz einfärben muss, sonst 
funktioniert es nicht. Allerdings hab ich jetzt das Problem, dass er auf 
dem Frame die Sachen alle ganz komisch Anzeigt. halt Alles was Schwarz 
ist, wird jetzt zum Frame, so auch die Texte der Buttons. und ich hab 
keine Ahnung wie ich das für die Buttons deaktivieren soll. Zudem zeigt 
er die Menüleiste auch nicht unter dem Frame an, sondern mitten drinne, 
und soweit ich weis kann man die Menüleiste nicht verschieben, aber 
Thunderbird hat das ja auch irgendwie geschafft. Und selbst damit sind 
meine Elemente nicht in der Titelleiste. Bei Microsoft sind sie das aber 
z.B. z.B. die QuickAccess Toolbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.