closeable tabs für search funktio

matriNET

Mitglied
closeable tabs für search funktion

hi

ich will die suche umstellen auf closeable tabs!
damit man nicht jedes mal alle sucheergnisse löschen musss damit neu suchen kann!
die tabs darf man erst sehen bei einem such ergebniss usw die nächsten tabs!

so soll es aussehen und funktionieren :
http://img225.imageshack.us/img225/5278/searchtabs8aq.jpg


habe momentan einpaar fehler!

e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(241): error C3861: 'GetResString': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(227): error C2065: 'theApp': nichtdeklarierter Bezeichner
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(227): error C2228: Der linke Teil von '.m_iDfltImageListColorFlags' muss eine Klasse/Struktur/Union sein
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(229): error C3861: 'CTempIconLoader': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

ich habe in mein searchdlg.cpp diese sachen intregriert:

bei void CMuteSearchDlg::DoDataExchange(CDataExchange* pDX)

DDX_Control(pDX, IDC_TAB1, searchselect);

Bei:
BEGIN_MESSAGE_MAP(CMuteSearchDlg, CResizableDialog)
//{{AFX_MSG_MAP(CMuteSearchDlg)

ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTcnSelchangeTab1)

und zum schlusse beim source das:

void CMuteSearchDLg::SetSearchResultsIcon(UINT uSearchID, int iImage)
{
int iTabItems = searchselect.GetItemCount();
for (int i = 0; i < iTabItems; i++)
{
TCITEM tci;
tci.mask = TCIF_PARAM;
if (searchselect.GetItem(i, &tci) && tci.lParam != NULL && ((const SSearchParams*)tci.lParam)->dwSearchID == uSearchID)
{
tci.mask = TCIF_IMAGE;
tci.iImage = iImage;
searchselect.SetItem(i, &tci);
break;
}
}
}
SSearchParams* CMuteSearchDlg::GetSearchResultsParams(UINT uSearchID) const
{
int iTabItems = searchselect.GetItemCount();
for (int i = 0; i < iTabItems; i++)
{
TCITEM tci;
tci.mask = TCIF_PARAM;
if (searchselect.GetItem(i, &tci) && tci.lParam != NULL && ((const SSearchParams*)tci.lParam)->dwSearchID == uSearchID)
return (SSearchParams*)tci.lParam;
}
return NULL;
}

searchdlg.h das hier hinzugefügt:!

#include "ClosableTabCtrl.h"


in // CMuteSearchDlg dialog

class CMuteSearchDlg : public CResizableDialog
{
// Construction
public:

das hier :

CClosableTabCtrl searchselect;

und dann die 3 dateien von emule source übernommen:

ClosableTabCtrl.cpp
ClosableTabCtrl.h
MenuCmds.h
UserMsgs.h

und in ClosableTabCtrl.cpp die includes abgeänert

#include "stdafx.h"
#include "MFC_MUTE_GUI.h"
#include "ClosableTabCtrl.h"
//#include "OtherFunctions.h"
#include "MenuCmds.h"
#include "UserMsgs.h"


kann mir jemand weiterhelfen?

versuche die fehler loszuwerden!
wenn ich die MenuCmds.h und UserMsgs.h entferne habe merh als 10 fehler
weis nicht ob die zwingend notwendig sind!
 
Zuletzt bearbeitet:
hier der source zu closeabletabctrl.cpp:

Code:
  //
  //You should have received a copy of the GNU General Public License
  //along with this program; if not, write to the Free Software
  //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  #include "stdafx.h"
  #include "MFC_MUTE_GUI.h"
  #include "ClosableTabCtrl.h"
  //#include "OtherFunctions.h"
  #include "MenuCmds.h"
  #include "UserMsgs.h"
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #undef THIS_FILE
  static char THIS_FILE[] = __FILE__;
  #endif
  
  
  // _WIN32_WINNT >= 0x0501 (XP only)
  #define _WM_THEMECHANGED                0x031A    
  #define _ON_WM_THEMECHANGED()                                                        \
      {    _WM_THEMECHANGED, 0, 0, 0, AfxSig_l,                                        \
          (AFX_PMSG)(AFX_PMSGW)                                                        \
          (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(void) > (_OnThemeChanged))        \
      },
  
  // CClosableTabCtrl
  // by enkeyDEV(Ottavio84)
  
  IMPLEMENT_DYNAMIC(CClosableTabCtrl, CTabCtrl)
  
  BEGIN_MESSAGE_MAP(CClosableTabCtrl, CTabCtrl)
      ON_WM_LBUTTONUP()
      ON_WM_LBUTTONDBLCLK()
      ON_WM_MBUTTONUP()
      ON_WM_CREATE()
      ON_WM_SYSCOLORCHANGE()
      ON_WM_CONTEXTMENU()
      _ON_WM_THEMECHANGED()
  END_MESSAGE_MAP()
  
  CClosableTabCtrl::CClosableTabCtrl()
  {
      m_bCloseable = true;
      memset(&m_iiCloseButton, 0, sizeof m_iiCloseButton);
      m_ptCtxMenu.SetPoint(-1, -1);
  }
  
  CClosableTabCtrl::~CClosableTabCtrl()
  {
  }
  
  void CClosableTabCtrl::GetCloseButtonRect(const CRect& rcItem, CRect& rcCloseButton)
  {
      rcCloseButton.top = rcItem.top + 2;
      rcCloseButton.bottom = rcCloseButton.top + (m_iiCloseButton.rcImage.bottom - m_iiCloseButton.rcImage.top);
      rcCloseButton.right = rcItem.right - 2;
      rcCloseButton.left = rcCloseButton.right - (m_iiCloseButton.rcImage.right - m_iiCloseButton.rcImage.left);
  }
  
  void CClosableTabCtrl::OnMButtonUp(UINT nFlags, CPoint point)
  {
      if (m_bCloseable)
      {
          int iTabs = GetItemCount();
          for (int i = 0; i < iTabs; i++)
          {
              CRect rcItem;
              GetItemRect(i, rcItem);
              if (rcItem.PtInRect(point))
              {
                  GetParent()->SendMessage(UM_CLOSETAB, (WPARAM)i);
                  return;
              }
          }
      }
  
      CTabCtrl::OnMButtonUp(nFlags, point);
  }
  
  void CClosableTabCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  {
      if (m_bCloseable)
      {
          int iTabs = GetItemCount();
          for (int i = 0; i < iTabs; i++)
          {
              CRect rcItem;
              GetItemRect(i, rcItem);
              CRect rcCloseButton;
              GetCloseButtonRect(rcItem, rcCloseButton);
              rcCloseButton.top -= 2;
              rcCloseButton.left -= 4;
              rcCloseButton.right += 2;
              rcCloseButton.bottom += 4;
              if (rcCloseButton.PtInRect(point))
              {
                  GetParent()->SendMessage(UM_CLOSETAB, (WPARAM)i);
                  return;
              }
          }
      }
      
      CTabCtrl::OnLButtonUp(nFlags, point);
  }
  
  void CClosableTabCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
  {
      int iTabs = GetItemCount();
      for (int i = 0; i < iTabs; i++)
      {
          CRect rcItem;
          GetItemRect(i, rcItem);
          if (rcItem.PtInRect(point))
          {
              GetParent()->SendMessage(UM_DBLCLICKTAB, (WPARAM)i);
              return;
          }
      }
      CTabCtrl::OnLButtonDblClk(nFlags, point);
  }
  
  void CClosableTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  {
      CRect rect = lpDrawItemStruct->rcItem;
      int nTabIndex = lpDrawItemStruct->itemID;
      if (nTabIndex < 0)
          return;
      BOOL bSelected = (nTabIndex == GetCurSel());
  
      TCHAR szLabel[256];
      TC_ITEM tci;
      tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_STATE;
      tci.pszText = szLabel;
      tci.cchTextMax = ARRSIZE(szLabel);
      tci.dwStateMask = TCIS_HIGHLIGHTED;
      if (!GetItem(nTabIndex, &tci))
          return;
  
      CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
      if (!pDC)
          return;
  
      int iOldBkMode = pDC->SetBkMode(TRANSPARENT);
  
      // Draw image on left side
      CImageList* piml = GetImageList();
      if (tci.iImage >= 0 && piml && piml->m_hImageList)
      {
          IMAGEINFO ii;
          piml->GetImageInfo(0, &ii);
          rect.left += bSelected ? 8 : 4;
          piml->Draw(pDC, tci.iImage, CPoint(rect.left, rect.top + 2), ILD_TRANSPARENT);
          rect.left += (ii.rcImage.right - ii.rcImage.left);
          if (!bSelected)
              rect.left += 4;
      }
  
      bool bCloseable = m_bCloseable;
      if (bCloseable && GetParent()->SendMessage(UM_QUERYTAB, nTabIndex))
          bCloseable = false;
  
      // Draw 'Close button' at right side
      if (bCloseable && m_ImgLstCloseButton.m_hImageList)
      {
          CRect rcCloseButton;
          GetCloseButtonRect(rect, rcCloseButton);
          m_ImgLstCloseButton.Draw(pDC, 0, rcCloseButton.TopLeft(), ILD_TRANSPARENT);
          rect.right = rcCloseButton.left - 2;
      }
  
      COLORREF crOldColor = RGB(0, 0, 0);
      if (tci.dwState & TCIS_HIGHLIGHTED)
          crOldColor = pDC->SetTextColor(RGB(192, 0, 0));
  
      rect.top += 4;
      pDC->DrawText(szLabel, rect, DT_SINGLELINE | DT_TOP | DT_CENTER | DT_NOPREFIX);
  
      if (tci.dwState & TCIS_HIGHLIGHTED)
          pDC->SetTextColor(crOldColor);
      pDC->SetBkMode(iOldBkMode);
  }
  
  void CClosableTabCtrl::PreSubclassWindow()
  {
      CTabCtrl::PreSubclassWindow();
      InternalInit();
  }
  
  int CClosableTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
      if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
          return -1;
      InternalInit();
      return 0;
  }
  
  void CClosableTabCtrl::InternalInit()
  {
      ModifyStyle(0, TCS_OWNERDRAWFIXED);
      SetAllIcons();
  }
  
  void CClosableTabCtrl::OnSysColorChange()
  {
      CTabCtrl::OnSysColorChange();
      SetAllIcons();
  }
  
  void CClosableTabCtrl::SetAllIcons()
  {
      if (m_bCloseable)
      {
          m_ImgLstCloseButton.DeleteImageList();
          m_ImgLstCloseButton.Create(8, 8, theApp.m_iDfltImageListColorFlags | ILC_MASK, 0, 1);
          m_ImgLstCloseButton.SetBkColor(CLR_NONE);
          m_ImgLstCloseButton.Add(CTempIconLoader(_T("CloseTab"), 8, 8));
          m_ImgLstCloseButton.GetImageInfo(0, &m_iiCloseButton);
          Invalidate();
      }
  }
  
  void CClosableTabCtrl::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
  {
      if (m_bCloseable)
      {
          CMenu menu;
          menu.CreatePopupMenu();
          menu.AppendMenu(MF_STRING, MP_REMOVE, GetResString(IDS_FD_CLOSE));
          m_ptCtxMenu = point;
          ScreenToClient(&m_ptCtxMenu);
          menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
      }
  }
  
  BOOL CClosableTabCtrl::OnCommand(WPARAM wParam, LPARAM lParam)
  {
      if (wParam == MP_REMOVE)
      {
          if (m_ptCtxMenu.x != -1 && m_ptCtxMenu.y != -1)
          {
              int iTabs = GetItemCount();
              for (int i = 0; i < iTabs; i++)
              {
                  CRect rcItem;
                  GetItemRect(i, rcItem);
                  if (rcItem.PtInRect(m_ptCtxMenu))
                  {
                      GetParent()->SendMessage(UM_CLOSETAB, (WPARAM)i);
                      break;
                  }
              }
              return TRUE;
          }
      }
      return CTabCtrl::OnCommand(wParam, lParam);
  }
  
  LRESULT CClosableTabCtrl::_OnThemeChanged()
  {
      // Owner drawn tab control seems to have troubles with updating itself due to an XP theme change..
      ModifyStyle(TCS_OWNERDRAWFIXED, 0);    // Reset control style to not-owner drawn
      Default();                            // Process original WM_THEMECHANGED message
      ModifyStyle(0, TCS_OWNERDRAWFIXED);    // Apply owner drawn style again
      return 0;
  }
 
die 3 probleme
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(227): error C2065: 'theApp': nichtdeklarierter Bezeichner
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(229): error C3861: 'CTempIconLoader': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(227): error C2228: Der linke Teil von '.m_iDfltImageListColorFlags' muss eine Klasse/Struktur/Union sein


tauchen hier auf:

Code:
void CClosableTabCtrl::SetAllIcons()
{
	if (m_bCloseable)
	{
		m_ImgLstCloseButton.DeleteImageList();
		m_ImgLstCloseButton.Create(8, 8, theApp.m_iDfltImageListColorFlags | ILC_MASK, 0, 1);
		m_ImgLstCloseButton.SetBkColor(CLR_NONE);
		m_ImgLstCloseButton.Add(CTempIconLoader(_T(IDI_CLOSE_ICON), 8, 8));
		m_ImgLstCloseButton.GetImageInfo(0, &m_iiCloseButton);
		Invalidate();
	}
}
 
Du solltest in deine .cpp die Zeile
Code:
#include "MyApp.h"
aufnehmen, dann in der Funktion theApp definieren
Code:
CMyApp theApp;

Dadurch sollte das Problem mit dem nichtdefinierten theApp behoben sein. Und dann kannst du weitersehen, was noch an Fehlern überbleibt.

Mfg

langer
 
Das Include ist richtig, aber doch nicht theApp lokal definieren!! Das wäre dann eine zweite CMyApp, die überhaupt nicht vernünftig initialisiert ist.

Das Include sollte reichen, eventuell musst du in deiner .h ein "extern CMyApp theApp" einbinden. theApp ist in MFC-Programmen generell die Instanz deines Programmes.
 
hi

habe trotzdem noch probleme!

e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(242): error C3861: 'GetResString': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\MyApp.h(3): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'theApp'
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(228): error C2228: Der linke Teil von '.m_iDfltImageListColorFlags' muss eine Klasse/Struktur/Union sein
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\MyApp.h(3): error C2501: 'CMyApp': Fehlende Speicherklasse oder Typspezifizierer
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\MyApp.h(3): error C2501: 'theApp': Fehlende Speicherklasse oder Typspezifizierer
e:\MUTE\MFC-MUTE-0.0.6-SOURCE-CODE-10.09.05\MFC_MUTE_GUI\ClosableTabCtrl.cpp(230): error C3861: 'CTempIconLoader': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

ich habe eine MyApp.h angelegt
 
Was für eine MyApp hast du denn angelegt? Du mußt die vom Assistenten generierte Datei einbinden. Wenn dein Projekt "MeinProjekt" heißt, dann hat der Assistent eine Klasse CMeinProjekt und eine Datei namens "MeinProjekt.h" (und .cpp) angelegt. Dann muß es
#include "MeinProjekt.h"
heißen.
Und mit der lokalen Definition von CMyApp hat Endurion natürlich recht. :-(

Mfg

langer
 
Ich habe in dem Code zwei Funktionen ausgeklammert, weil die ein SSearchParams benutzen, das nirgends definiert ist. Liegt es daran?
 
ja kann sein ich weis selber nicht wo die definiert werden ?

habe von einem anderen source übernommen muss suchen ob ich ich diesen SSearchParams irgendwo finde!
 

Neue Beiträge

Zurück