zugriff auf classen



  • hallo,

    class CEditD : public CEdit
    {
    DECLARE_DYNAMIC(CEditD)
    virtual void GetWindowRect(LPRECT lpRect) const;

    ...
    };

    mein problem ist, wenn ich einer globalen function:

    void SetClipBefore(CWnd* ob){}

    die klasse CEditD in der form:

    SetClipBefore(this);

    übergebe, kann ich nicht mehr meine virtual function GetWindowRect über

    ob->GetWindowRect(&rc);

    aufrufen, ich erhalte immer den zugriff über CWnd.
    es scheint das die Basisklasse CWnd GetWindowRect nich virtual ausgelegt hat.

    Ausweg:

    if (ob->IsKindOf(RUNTIME_CLASS(CEditD)))
    {
    ((CEditD*)ob)->GetWindowRect(&rc);
    }

    das ist aber ziemlich aufwendig für jeden zugriff auf ob jedesmal eine typüberprüfung zu machen. giebt es da noch andere möglichkeiten oder kann ich diese typüberprüfung in eine classe vornehmen ???

    Volker



  • Wüßte nicht, dass das schonmal jemand überschreiben wollte.
    Ich würde das vergleichen mit:

    String GetStyleOfWheel()
    {
      return "round";
    }
    
    virtual String GetStyleOfWheel()
    {
      return "quadratic";
    }
    


  • void CEditD::GetWindowRect(LPRECT lpRect, BOOL subAddPixel) const
    {
      CEdit::GetWindowRect(lpRect);
      switch (m_tBorder)
      {
        case EBD_2DEx:
          InflateRect(lpRect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); 
          break;
    
        case EBD_NoneEx:
          InflateRect(lpRect, -GetSystemMetrics(SM_CXEDGE), -GetSystemMetrics(SM_CYEDGE));
          break;
      }
      if (subAddPixel) lpRect->bottom -=m_nAddPixel;
    }
    
    wobei:
    
      #define WS_EX_EDIT_EX 0x00000002L      //not in user.h eigene definition !!
    
      typedef enum eBorder
      {
        EBD_None=0,
        EBD_Single,     //WS_BORDER
        EBD_2D,         //WS_EX_STATICEDGE
        EBD_NoneEx,     //WS_EX_EDIT_EX | WS_EX_CLIENTEDGE
        EBD_2DEx,       //WS_EX_EDIT_EX | WS_EX_STATICEDGE
        EBD_3D,         //WS_EX_CLIENTEDGE
      };
    

    void CEditD::OnNcPaint()
    {
    //_RPT0(_CRT_WARN, "OnNcPaint\n");
    m_bNcPaint=true;
    CRgn rgn, trgn; CRect rc;
    CEdit::GetWindowRect(&rc); trgn.CreateRectRgn(0,0,0,0);
    int bx=0, by=0; BOOL bRgn=(GetWindowRgn(trgn)==ERROR);
    switch(m_tBorder)
    {
    case EBD_NoneEx:
    bx=GetSystemMetrics(SM_CXEDGE);
    by=GetSystemMetrics(SM_CYEDGE);
    break;

    case EBD_2DEx:
    bx=GetSystemMetrics(SM_CXBORDER);
    by=GetSystemMetrics(SM_CYBORDER);
    break;
    }
    if (bx||by)
    {
    rc.OffsetRect(-rc.TopLeft());
    rc.DeflateRect(bx,by);
    rgn.CreateRectRgnIndirect(&rc);
    SetWindowRgn(rgn, FALSE);
    }
    CEdit::Default();
    SetWindowRgn(bRgn?NULL:(HRGN)trgn, FALSE);
    if (m_tBorder==EBD_2DEx)
    {
    CDC* pDc=GetWindowDC();
    pDc->DrawEdge(&rc, BDR_SUNKENOUTER, BF_RECT | ((IsFocus() && m_bFlatOnFocus)?BF_FLAT:0));
    ReleaseDC(pDc);
    }
    m_bNcPaint=false;
    }



  • Ne, das is falsch so!
    Denn GetWindowRect liefert die ALLERÄUSSERSTEN Koordinaten Deines Fensters. Alles was dann kommt, ist innerhalb. Also niemals das WindowRect vergrössern, weil das HWND ja auch net grösser is!

    Grafik:

    -----------------------------------------------
    |          NonClient-Bereich (Titelleiste)    | <- GetWindowRect
    |  |---------------------------------------|  |
    | F|                        GetClientRect->|F |
    | R|                                       |R |
    | A|           Client-Bereich              |A |
    | M|                                       |M |
    | E|-------------------------------------- |E |
    |---------------------------------------------|
    

    Um den Frame in der Grösse zu ändern, musst Du WM_NCCALCSIZE abfangen

    [ Dieser Beitrag wurde am 01.11.2002 um 14:58 Uhr von RenéG editiert. ]



  • Nachtrag:
    SetWindowRgn ruft man NICHT in OnNcPaint auf



  • hi,

    SetWindowRgn ruft man NICHT in OnNcPaint;
    is ging nicht anders, sonst wird die scrollleiste nich dargestellt.

    das GetWindowRect wird nicht vergrössert, es wird verkleinert,
    aber WM_NCCALCSIZE muß ich mir mal anschauen.

    der zweck ist ein CEdit abzubilden ohne den 3D rahmen aber trozdem mit
    Margins CRect(1,1,1,1) also nicht flat.

    vieleicht muß ich mein konzept noch mal überlegen obwohl mein script funktioniert(aber vieleicht nicht optimal geschrieben), auch mit den vorher angsprochenen problem.

    wenn du willst kannst du mal reinschauen, vieleicht fällt dir was besseres ein.

    volker



  • is ging nicht anders, sonst wird die scrollleiste nich dargestellt.

    Es muss anders gehen, weil OnNcPaint ständig aufgerufen wird, aber SetWindowRgn nur 1x aufgerufen werden muss.

    aber davon abgesehen, das brauchst Du gar net aufzurufen


Anmelden zum Antworten