Hausfinden ob Druckvorschau oder normale View



  • Hallo zusammen,

    habe wieder mal ein kleines Problem:

    In meinem MDI-Projekt blende ich links neben den offenen Views einen Baum ein. Auf Benutzereingaben (rechte & linke Maustaste auf Baum) reagiere ich in der PreTranslateMessage-Routine des MainFrames.

    Das ganze sieht grob skizziert so aus:

    if ((pMsg->message == WM_LBUTTONDOWN) || (pMsg->message == WM_RBUTTONDOWN))
      {
      HTREEITEM hProjectItem, hItem;
      CPoint pt = pMsg->pt;
      CString actViewText;
      CMyProjectView *actView;
    
      m_treeCtrl.ScreenToClient(&pt);
    
      hItem = m_treeCtrl.HitTest(pt);
      hProjectItem = theApp.GetProjectTreeItem(hItem);
    
      if (hItem)
        {
        // Aktuelle View herausfinden
        actView = (CMyProjectView*)MDIGetActive()->GetActiveView();
    
        // Item selektieren
        m_treeCtrl.Select(hItem, TVGN_DROPHILITE);
    
        projectText = m_treeCtrl.GetItemText(hProjectItem);
        actViewText = actView->m_cStrWindowText;
    
        // ... weitere abarbeitung der Eingabe
        }
      }
    
    return CMDIFrameWnd::PreTranslateMessage(pMsg);
    

    Wenn nun das Druckvorschau-Fenster offen ist und der Benutzer auf irgend einen Bereich außerhalb des gezeichneten Bereichs druckt (zB. der graue Bereich, der im Pic1 durch den roten Pfeil gekennzeichnet ist) kommt das Programm auch in die PreTranslateMessage-Routine des MainFrames.

    Hier bekomme ich dann bei folgendem Statement eine Exception:

    actViewText = actView->m_cStrWindowText;
    

    Ist ja soweit auch klar, weil die actView ja nicht vom Typ CMyProjectView, sondern CPreviewView ist und diese natürlich keine Member-Variable m_cStrWindowText besitzt...

    Wie kann ich nun im PreTranslateMessage herausfinden, ob die ActView eine CMyProjectView oder eine CPreviewView ist, damit ich die Abarbeitung stoppen und somit die Exception verhindern kann?

    danke, mfg

    mike

    ps.: Pic2 zeigt ein paar (möglicherweise) Hilfreiche Details aus der Debug-Ansicht (links nach Mausklick in Druck-Vorschau-Bereich vor Programmabsturz und rechts nach Mausklick auf Tree-Item).
    Die schwarz Hinterlegten C...Views sind jeweils vom Typ CMyProjectView.


  • Mod

    suamikim schrieb:

    In meinem MDI-Projekt blende ich links neben den offenen Views einen Baum ein. Auf Benutzereingaben (rechte & linke Maustaste auf Baum) reagiere ich in der PreTranslateMessage-Routine des MainFrames.

    Das ganze sieht grob skizziert so aus:

    if ((pMsg->message == WM_LBUTTONDOWN) || (pMsg->message == WM_RBUTTONDOWN))
      {
      HTREEITEM hProjectItem, hItem;
      CPoint pt = pMsg->pt;
      CString actViewText;
      CMyProjectView *actView;
    
      m_treeCtrl.ScreenToClient(&pt);
    
      hItem = m_treeCtrl.HitTest(pt);
      hProjectItem = theApp.GetProjectTreeItem(hItem);
    

    Du solltest das ganze nur machen wenn:

    if (m_treeCtrl.IsWindowVisible())
    {
    ...
    


  • OMG, warum einfach, wenns kompliziert auch geht...

    Danke, hab vor lauter Wald die Bäume nicht mehr gesehen 😉


Log in to reply