Toon posts:

[MFC VC++6]Splitter in Splitter

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een outlook achtige interface: Een splitter window met links een treeview, rechts een nieuw splitter window met bovenin een listview en onder een formview. Zie plaatje onder (hopen dat het doorkomt). Omdat er rechts een splitter in een splitter zit, is de rechtse 'pane' meer verzonken dan de linkse 'pane'. Dit is niet zo gek omdat de splitter zichzelf verzinkt binnen het parentframe, maar ik zou deze verzinking graag ongedaan maken. Heeft de CSplitterWnd een property waarmee ik de border eigenschappen kan veranderen?
Of is er een andere betere manier om een dergelijke (outlook achtige) interface te maken?

[img]D:\Sjoerd_Docs\clip.jpg[/img]

Verwijderd

Topicstarter
Hmm het plaatje doorlinken lukt dus niet. Hoe kan ik een plaatje van mijn HD in een bericht linken? Ik snap de GOT faq niet helemaal geloof ik.

  • markvt
  • Registratie: Maart 2001
  • Laatst online: 22-08 14:34

markvt

Peppi Cola

D:\Sjoerd_Docs\clip.jpg

probeer die eens te uploaden naar webspace ergens, anders zul je apache op je pc moeten installeren.

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

maak die rechter splitter pane eens niet met de windowstyle WS_EX_CLIENTEDGE

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.


Verwijderd

Topicstarter
Ik override de PreCreateWindow met:
code:
1
2
3
4
5
6
7
BOOL CRightFrame::PreCreateWindow(CREATESTRUCT& cs) 
{
    // TODO: Add your specialized code here and/or call the base class
    cs.style -=WS_EX_CLIENTEDGE;
    cs.style +=WS_BORDER;
    return CFrameWnd::PreCreateWindow(cs);
}

Het opbouwen van de CREATESTRUCT zit volgens mij te diep in MFC om die te overriden. Daarom probeer ik nu de style op deze manier te veranderen. Het voorbeeld hierboven werkt in ieder geval niet.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmm, die -= en += operators moet je vervangen. Als bijvoorbeeld de WS_EX_CLIENTEDGE flag niet gezet is, dan gaat het gruwelijk fout

dit is beter:
C++:
1
2
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.style |= WS_BORDER;


overigens is WS_EX_CLIENTEDGE een exstyle, dus je moet de dwExStyle member aanpassen ipv style

[ Voor 29% gewijzigd door .oisyn op 05-03-2003 11:43 ]

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.


Verwijderd

Topicstarter
Helaas werkt dit ook niet. Ik heb NOG een flag weggehaald:
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.dwExStyle &= ~WS_EX_WINDOWEDGE;
en cs.style |=WS_BORDER niet eens gebruikt. De pane blijft op dezelfde manier getekend worden.
Ook als ik deze operatie op het MainFrame toepas gebeurt er niets. Ook niet als ik het toepas op de linker listview binnen de hoofdsplitter. Zou het dus wel die flags zijn, of werkt de operatie niet?

Verwijderd

Topicstarter
met if (cs.dwExStyle && WS_EX_CLIENTEDGE) heb ik de flags getest voordat ik ze verander, en de WS_EX_CLIENTEDGE en WS_EX_WINDOWEDGE staan NIET aan.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

draai die statements eens om, dus EERST CFrameWnd::PreCreateWindow () aanroepen, en daarna jouw aanpassingen maken

waarschijnlijk zet CFrameWnd die flags gewoon weer terug namelijk :)

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.


Verwijderd

Topicstarter
Dat zal imo niet gaan omdat CFrameWnd::PreCreateWindow(cs); juist die cs gebruikt om het window op te bouwen. MSDN zegt ook expliciet om cs hier aan te passen als je de default window wil aanpassen.

MSDN:
To change the default window attributes used by a framework application created with AppWizard, override the window?sPreCreateWindow virtual member function. PreCreateWindow allows an application to access the creation process normally managed internally by theCDocTemplate class. The framework calls PreCreateWindow just prior to creating the window. By modifying theCREATESTRUCT parameter to PreCreateWindow, your application can change the attributes used to create the window.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, je begrijpt het verkeerd. PreCreateWindow () wordt aangeroepen voordat een window wordt aangemaakt. Het maakt dus zelf geen window aan, het is er alleen voor om de CREATESTRUCT aan te passen.

Je kunt dus gewoon eerst de functie van de superclass aanroepen, en vervolgens de struct aanpassen. Als de functie retourneert zal de aangepaste CREATESTRUCT worden gebruikt om de window aan te maken. Dit zal dus prima werken:

C++:
1
2
3
4
5
6
7
8
9
10
11
BOOL CRightFrame::PreCreateWindow(CREATESTRUCT& cs) 
{
    if (!CFrameWnd::PreCreateWindow(cs))
        return FALSE;

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
    cs.dwExStyle &= ~WS_EX_WINDOWEDGE;
    cs.style |= WS_BORDER;

    return TRUE;
}


ik weet niet of dit je probleem oplost, maar het werkt iig wel. Ik heb het zelf ook eens zo gebruikt (toen wilde ik juist WS_EX_CLIENTEDGE zetten, maar een superclass resette die flag, dus ik moest m aanpassen nadat de superclass er klaar mee was)

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.


Verwijderd

Topicstarter
Hmm ik heb eens verder in MSDN gekeken, en ze doen het in een voorbeeld toch door eerst de struct aan te passen en dan de function aan te roepen
http://msdn.microsoft.com...ml/_mfc_window_styles.asp

Ik heb nu beide methodes op de MainFrm toegepast en daar werkt het in ieder geval wel. De cs struct aanpassen kan zowel voor als na het aanroepen van
FrameWnd::PreCreateWindow(cs).

Verwijderd

Topicstarter
Nou volgens mij gaat het gewoon niet werken, waarschijnlijk omdat een splitter altijd verzonken windows maakt. Misschien kan dat niet anders omdat er ook die splitter control (die dunne balk in het midden) inzit, waarmee je de splitter kunt resizen

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 05 maart 2003 @ 13:09:
Ik heb nu beide methodes op de MainFrm toegepast en daar werkt het in ieder geval wel. De cs struct aanpassen kan zowel voor als na het aanroepen van
FrameWnd::PreCreateWindow(cs).
Ja het kan idd ervoor en erna. Maar je weet niet wat die ancestorfunctie doet (en mag er dan ook nooit van uitgaan.

Als je het framework het dringende advies wil geven een flag niet te zetten wis je 'm voor de ancestor call. Als je het wil verbieden zet je 'm er[/b]na[/b].
Verwijderd schreef op 05 maart 2003 @ 13:46:
Nou volgens mij gaat het gewoon niet werken, waarschijnlijk omdat een splitter altijd verzonken windows maakt. Misschien kan dat niet anders omdat er ook die splitter control (die dunne balk in het midden) inzit, waarmee je de splitter kunt resizen
Bs. geen enkele window/control tekent ook maar iets op je scherm zonder dat je er expliciet om vraagt dmv flags. Je moet echt zelfs iets verknallen :)

Probeer eens te debuggen, en overload de functie die feitelijk het window maakt. Daar kun je zien wat er van je flag-advies over is gebleven.

Professionele website nodig?

Pagina: 1