[C++] Custom non-client area

Pagina: 1
Acties:

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
(Using BCB5)

Ik heb custom event-handlers gemaakt voor de messages WM_NCACTIVATE en WM_NCPAINT om een customized border voor een window te kunnen tekenen.

Dit gaat allemaal goed, het enige is, dat in sommige situaties toch de standaard windows-border getekend wordt :( :'( (terwijl de windows event-handlers van bovengenoemde messages als het goed is niet aangeroepen worden).

Iemand een idee?

[note]
Dit kun je natuurlijk ook doen door een borderless window te maken en vervolgens je eigen border te implementeren, maar dat is overhead.
[/note]

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

en waarom is dat dan overhead?

(zet voortaan trouwens even win32 erbij in je topictitel)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op dinsdag 21 mei 2002 12:32 schreef .oisyn het volgende:
en waarom is dat dan overhead?
Omdat het standaard gedrag van een border (resize, minimize, maximize, etc) al in een standaard window gebakken zit, als je dat dus zelf nog eens gaat maken loop je het wiel opnieuw uit te vinden.
(zet voortaan trouwens even win32 erbij in je topictitel)
XQses, ik zal er de volgende keer aan denken :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 21 mei 2002 12:36 schreef MrHuge het volgende:

[..]

Omdat het standaard gedrag van een border (resize, minimize, maximize, etc) al in een standaard window gebakken zit, als je dat dus zelf nog eens gaat maken loop je het wiel opnieuw uit te vinden.
dat is waar, maar je wilt 'm zelf afhandelen, dus je bent in principe het wiel al opnieuw aan het uitvinden :)

ik heb trouwens nog nooit iets met non-client area's gedaan... kzal er eens naar kijken als ik thuis kom

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op dinsdag 21 mei 2002 12:44 schreef .oisyn het volgende:
dat is waar, maar je wilt 'm zelf afhandelen, dus je bent in principe het wiel al opnieuw aan het uitvinden :)
Nope, ik handel alleen het tekenen van de border af, het resizen enzo laat ik gewoon door Windows afhandelen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

mmja maar voor WM_NCPAINT hoef je je toch niet bezig te houden met resizen? :?

(maar misschien zie ik nu wat over het hoofd hoor, zo ja dan moet je dat maar even zeggen :))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op dinsdag 21 mei 2002 12:56 schreef .oisyn het volgende:
mmja maar voor WM_NCPAINT hoef je je toch niet bezig te houden met resizen? :?
Doe ik ook niet :)
Zoals gezegd, het enige wat ik doe, is het tekenen v/d border, niks meer en niks minder.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

ooooh wacht ik zie idd wat over het hoofd

ik wou zeggen: dat kan toch ook wel met een window zonder border, maar dan moet je ook resize features in gaan bouwen :D

ik snap m :)


.edit: hmm ik heb even zitten spelen met WM_NCPAINT, maar GetDCEx geeft bij mij altijd NULL terug. En GetLastError () geeft ook 0 terug, wat aangeeft dat er geen error is :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op dinsdag 21 mei 2002 13:50 schreef .oisyn het volgende:
.edit: hmm ik heb even zitten spelen met WM_NCPAINT, maar GetDCEx geeft bij mij altijd NULL terug. En GetLastError () geeft ook 0 terug, wat aangeeft dat er geen error is :?
Om de DC van het gehele window (inclusief non-client area) te krijgen moet je de functie GetWindowDC gebruiken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja en om de DC van alleen het non-client gedeelte te krijgen moet je GetDCEx gebruiken, dat zeggen ze zelf in de msdn :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Hmmmm, en hoe gebruik je die GetDCEx dan in jouw geval?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

in het voorbeeldje in de msdn bij WM_NCPAINT staat het zo:
code:
1
2
3
4
5
6
7
case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    // Paint into this DC
    ReleaseDC(hwnd, hdc);
}

zo gebruik ik m ook. Heb al wat gespeeld met die parameters, maar hij blijft gewoon NULL retourneren...
Maar met GetWindowDC () werkt het idd ook

kun je eens aangeven in welke gevallen hij de oude border tekent? Voor zover ik kan ontdekken bij mij alleen als hij geactiveerd wordt (dus als je erop klikt en hij had de focus niet), maar dat is omdat ik WM_NCACTIVATE niet heb afgevangen (die ga ik nu eens afvangen)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Het komt bijvoorbeeld voor als ik het window maximized heb, en het vervolgens restore.

Het vage is dat het ook optreedt als ik de applicatie maar lang genoeg laat draaien zonder er ook maar op te klikken of wat dan ook (de app waarin ik dit gebruik moet continue draaien). Op een gegeven moment is de border gewoon weer standaard...

Nog andere mensen met hetzelfde probleem???

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Zijn er nog mensen die dit ook gehad hebben? Op Google Groups vind je wel allemaal posts van mensen die dit probleem ook hebben, maar nergens wordt ook een oplossing gepost :'(

Ik ben er al wel achter gekomen dat het niet gebeurt als ik voor WM_NCHITTEST een dummy event-handler maak (dus totaal geen actie op dit event).
Als ik op dit event DefWindowProc aanroep, heb ik het probleem terug.

Verwijderd

Ik denk dat je windows op een of andere manier zal moeten vertellen dat je een window gaat maken met een custom NC area. Vang je ook messages als WM_NCCREATE, WM_NCCALCSIZE enzo af? Ik kan me voorstellen vooral bij die NCCREATE dat windows gewoon graag zelf z'n NC area af en toe tekent. Dat ie 'm op nieuw tekent bij NC_HITTEST is ook niet zo vreemd, want er is een kans dat er een knopje in je NC area moet worden geupdate. Je kan windows alles verwijten behalve efficient werken, dus tekent ie maar 't hele verhaal :)
</rant>

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Ik vang alleen WM_NCACTIVATE en WM_NCPAINT af.

Het is ook erg vaag, want het gebeurt vooral als ik met m'n muis op het resize-gedeelte van het venster ga staan (en dus op het moment dat de pointer dus verandert in de resize-pointer).
Dit alles na een restore vanuit maximized, en ook meteen na het opstarten van de app.

Als het probleem zich 1x (na het starten van de app) voorgedaan heeft, gebeurt het niet weer totdat ik het venster maximize, en vervolgens weer restore. Op dat moment gebeurt het weer 1x etc...

Verwijderd

Sja... moeilijk. Er is welgeteld 1 knowledge base artikeltje over te vinden op microsoft's site, maar ik betwijfel of dat je veel verder helpt: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q99046
Pagina: 1