Tabelle in einem GUI

Tom_Green

Mitglied
Hallo

Ich habe ein Problem. Ich möchte in einem Gui eine zweispaltige Tabelle generieren, die bei jedem Aufruf, eine vorher eingelesene Anzahl Zeilen hat. In der ersten Spalte möchte ich etwas fixes eintragen und in die zweite Spalte sollten sich Werte eintragen lassen.

Ich arbeite mit Microsoft Visual Studio.
Hat mir jemand einen Lösung für mein Problem. Was für ein Steuerelement muss ich dafür benutzen?

mfg
 

Endurion

Erfahrenes Mitglied
Dafür gibt es direkt keine Control. Da musst du manuell kombinieren.

Für die Ansicht an sich genügt eine ListControl (nicht ListBox). Du musst dann auf ein Doppelklickereignis (oder ein beliebiges anderes) reagieren und eine Edit-Control als Child an der Stelle anzeigen. Dann per Subclassen auf ein paar Ereignisse wie Escape/Enter oder Applikationswechsel prüfen, damit die Edit auch schön brav wieder weggeht.
 

Tom_Green

Mitglied
hättest du für das ein beispiel code? kann mir nämlich noch nicht ganz vorstellen wie das mit child usw. funktioniert.

habe ich das richtig verstanden. ich nehme eine List control und wenn die list dann betätigt wird generiere ich diese edit fields?

mfg
 

Endurion

Erfahrenes Mitglied
Hier ein Stück Code, wo ich das so mache:

Code:
void CDlgZuordnung::OnNMDblclkListZuordnung( NMHDR *pNMHDR, LRESULT *pResult )
{

  if ( m_EditPopup.GetSafeHwnd() )
  {
    // wenn wir schon drin sind, nicht nochmal
    return;
  }
  POINT   ptMouse;

  GetCursorPos( &ptMouse );
  m_ListZuordnung.ScreenToClient( &ptMouse );

  LVHITTESTINFO     lvHTInfo;

  lvHTInfo.pt   = ptMouse;

  int   iItem, iSubItem;
  HitTest( ptMouse, iItem, iSubItem );

  RECT    rcItem;

  m_iEditItem = iItem;
  m_iEditSubItem = iSubItem;

  GetSubItemRect( iItem, iSubItem, rcItem );

  m_ListZuordnung.ClientToScreen( &rcItem );
  ScreenToClient( &rcItem );

  if ( iSubItem == 0 )
  {
    m_EditPopup.Create( WS_BORDER | WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_NUMBER, rcItem, this, 17 );
    m_EditPopup.SetFont( GetFont() );

    m_EditPopup.SetWindowText( m_ListZuordnung.GetItemText( iItem, iSubItem ) );
    m_EditPopup.SetSel( 0, -1 );
    m_EditPopup.SetFocus();
    m_EditPopup.SetLimitText( 8 );
  }
  else if ( iSubItem == 1 )
  {
    // IP
    m_EditPopup.Create( WS_BORDER | WS_CHILD | WS_VISIBLE | ES_WANTRETURN, rcItem, this, 17 );
    m_EditPopup.SetFont( GetFont() );

    m_EditPopup.SetWindowText( m_ListZuordnung.GetItemText( iItem, iSubItem ) );
    m_EditPopup.SetSel( 0, -1 );
    m_EditPopup.SetFocus();
  }
  else if ( iSubItem == 2 )
  {
    // MAC
    m_EditPopup.Create( WS_BORDER | WS_CHILD | WS_VISIBLE | ES_WANTRETURN, rcItem, this, 17 );
    m_EditPopup.SetFont( GetFont() );

    m_EditPopup.SetLimitText( 12 );
    m_EditPopup.SetWindowText( m_ListZuordnung.GetItemText( iItem, iSubItem ) );
    m_EditPopup.SetSel( 0, -1 );
    m_EditPopup.SetFocus();
  }

  *pResult = 0;

}



BOOL CDlgZuordnung::OnCommand( WPARAM wParam, LPARAM lParam )
{

  if ( (HWND)lParam == m_EditPopup.GetSafeHwnd() )
  {
    if ( HIWORD( wParam ) == EN_KILLFOCUS )
    {
      m_EditPopup.DestroyWindow();
      return TRUE;
    }
  }

  return CPropertyPage::OnCommand(wParam, lParam);
}



BOOL CDlgZuordnung::PreTranslateMessage( MSG* pMsg )
{

  if ( ( pMsg->hwnd == m_EditPopup.GetSafeHwnd() )
  &&   ( pMsg->message == WM_KEYDOWN ) )
  {
    if ( pMsg->wParam == VK_RETURN )
    {
      EditEnd();
      return TRUE;
    }
    else if ( pMsg->wParam == VK_ESCAPE )
    {
      EditEnd();
      return TRUE;
    }
  }
  return CPropertyPage::PreTranslateMessage(pMsg);

}



void CDlgZuordnung::EditEnd()
{

  CString     cstrGnu;

  m_EditPopup.GetWindowText( cstrGnu );

  m_ListZuordnung.SetItemText( m_iEditItem, m_iEditSubItem, cstrGnu );
  m_EditPopup.DestroyWindow();

  SetModified();

}
 

Tom_Green

Mitglied
OK einige Fragen zu deinem Code.

1. was ist m_EditPopup für ein Datentype?
2. erzeugst du mit diesem code fortlaufend die edit fields in der Liste?
3. Von wo sind die Methoden HitTest und GetSubItemRect muss ich irgendwie noch ein spezielles include machen oder von was erbt dein ZuordnungsDlg?

mfg
 

Endurion

Erfahrenes Mitglied
1) m_EditPopup ist ein CEdit
2) Jein, es gibt nur eine Edit, die wird durch einen Doppelklick erzeugt; und bei einem Fokus-Wechsel (EN_KILLFOCUS) oder Escape/Return wieder geschlossen
3) HitTest und GetSubItemRect müssten in aktuellen MFC-Versionen Member von CListControl sein. Früher gab es die da drin nicht, da hatte ich mir die selbst gebaut.
 

Endurion

Erfahrenes Mitglied
Schwierig, da sind einige firmeneigene Dinge drin. Die eigentlichen Funktionsteile hast du in dem Ausschnitt oben aber schon drin. Der Header ist ja eh nur eine Kopie des .cpp-Files.