Aus statisch gelinkter Bibliothek Zugriff auf CProgressCtrl



  • Hallo,

    ich habe eine dialogorientierte Anwendung, welche auf die Methoden einer statisch gelinkten Klassenbibliothek zugreift.
    Eine dieser Methoden beinhaltet eine etwas länger dauernde Schleifenroutine, weshalb ich im Hauptdialog gern einen Fortschrittsbalken (CProgressCtrl) unterbringen möchte.
    Im Prinzip benötigt die Schleife nur einen Pointer auf das Control, allerdings weiß ich nicht, was ich includen muss, damit die Klasse den CProgressCtrl-Pointer kennt.
    Komischerweise kennt die Klasse ohne spezielle Includes einige andere Controls der MFC, z.B. CEdit oder CButton, nur eben das CProgressCtrl nicht.

    Jemand eine Idee?

    Gruß, Thomas.



  • also ich hab ne SDI dürfte aber ähnlich funktionieren. Includes wirst du wohl keine mehr brauchen.
    Also in dem anzeigenden Dialog der auch dann hoffentlich der aktive ist machst erst mal sowas:

    m_ExportProgress.ShowWindow(true);
    				m_ExportProgress.SetRange(0,100);
    

    die Membervariable musst du im Klassenassi unter member variables anlegen und zwar vom Typ Control und dann eben PRG-BAR.
    Dann kannste in deiner Klasse in der du die Schleife durchläufst (oder ist das die gleiche?) sowas machen:

    pView->m_ExportProgress.SetPos(Percent);
    				pView->UpdateData(false);
    

    Wenn du genauere Erläuterung brauchst einfach nochmal melden. 😉



  • Das funktioniert leider nicht. Aus jeder anderen Dialogklasse kann ich einen Zeiger auf die Progress-Bar legen, nur eben nicht aus einer, die in einer statisch gelinkten Bibliothek liegt.



  • zeig mal bitte was du machst, mit kurzer erklärung in welcher Klasse, denn sonst ist es etwas schwer! 😉



  • Ok, ich werde das Problem noch einmal genauer beschreiben.

    Ich habe eine MFC-Dialogklasse CParentDlg und eine allgemeine Klasse Schleife.

    Schleife ist in Form einer private Membervariable innerhalb von CParentDlg deklariert.
    Desweiteren enthält CParentDlg eine public Membervariable m_cProgressBar vom Typ CProgressCtrl, welche mit einem entsprechenden Control (einem Fortschrittsbalken) verbunden ist.

    Ein Zeiger CParentDlg* ist in Form einer public Membervariable innerhalb von Schleife deklariert. Damit das funktioniert, enthält Schleife.h eine Vorwärtsdeklaration: class CParentDlg;.

    Bis hier hin wird ohne Probleme compiliert.

    In Schleife.cpp ist eine Schleife definiert, die einen Zähler enthält und per m_pParentDlg->m_cProgressBar.SetPos(i); den Fortschrittsbalken im Hauptfenster hochsetzen soll.
    Um den Typ CParentDlg zu kennen, benötigt Schleife.cpp ein include auf ParentDlg.h.

    Beim Compilieren erhalte ich nach dem letzten Schritt folgenden Fehler:

    c:\program files\microsoft visual studio\myprojects\parent\parentdlg.h(24) : error C2065: 'IDD_PARENT_DIALOG' : nichtdeklarierter Bezeichner
    c:\program files\microsoft visual studio\myprojects\parent\parentdlg.h(24) : error C2057: Konstanter Ausdruck erwartet
    

    Meine Quelltexte:
    ParentDlg.h

    // ParentDlg.h : Header-Datei
    //
    
    #if !defined(AFX_PARENTDLG_H__F8E7988F_8883_4A24_B25E_77F050D38D3F__INCLUDED_)
    #define AFX_PARENTDLG_H__F8E7988F_8883_4A24_B25E_77F050D38D3F__INCLUDED_
    
    #include "Schleife.h"	// Hinzugefügt von der Klassenansicht
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    /////////////////////////////////////////////////////////////////////////////
    // CParentDlg Dialogfeld
    
    class CParentDlg : public CDialog
    {
    // Konstruktion
    public:
    	CParentDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(CParentDlg)
    	enum { IDD = IDD_PARENT_DIALOG };
    	CProgressCtrl	m_cProgressBar;
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CParentDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Message-Map-Funktionen
    	//{{AFX_MSG(CParentDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    private:
    	Schleife m_schleife;
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_PARENTDLG_H__F8E7988F_8883_4A24_B25E_77F050D38D3F__INCLUDED_)
    

    ParentDlg.cpp

    // ParentDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "Parent.h"
    #include "ParentDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CParentDlg Dialogfeld
    
    CParentDlg::CParentDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CParentDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CParentDlg)
    		// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    	//}}AFX_DATA_INIT
    	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CParentDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CParentDlg)
    	DDX_Control(pDX, IDC_PROGRESS, m_cProgressBar);
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CParentDlg, CDialog)
    	//{{AFX_MSG_MAP(CParentDlg)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CParentDlg Nachrichten-Handler
    
    BOOL CParentDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    
    	m_schleife.m_pParentDlg = this;
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.
    
    void CParentDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    //  das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CParentDlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
    

    Schleife.h

    // Schleife.h: Schnittstelle für die Klasse Schleife.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_SCHLEIFE_H__87A6C86D_7895_4211_9840_2864E3CE5DB2__INCLUDED_)
    #define AFX_SCHLEIFE_H__87A6C86D_7895_4211_9840_2864E3CE5DB2__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class CParentDlg;
    class Schleife  
    {
    public:
    	CParentDlg* m_pParentDlg;
    	void run();
    	Schleife();
    	virtual ~Schleife();
    
    };
    
    #endif // !defined(AFX_SCHLEIFE_H__87A6C86D_7895_4211_9840_2864E3CE5DB2__INCLUDED_)
    

    Schleife.cpp

    // Schleife.cpp: Implementierung der Klasse Schleife.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "stdafx.h"
    #include "Schleife.h"
    #include "ParentDlg.h"  //Problematisches Include
    
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    
    Schleife::Schleife()
    {
    
    }
    
    Schleife::~Schleife()
    {
    
    }
    
    void Schleife::run()
    {
    	for (int i = 0; i<=100; i++)
    	{
    		m_pParentDlg->m_cProgressBar.SetPos(i);  //Funktioniert nur mit entsprechendem Include
    	}
    }
    

    Danke an alle, die da mal drübergucken! 🙂

    Übrigens funktioniert dieses System, wenn beide Klassen Dialogklassen sind. Kann es also sein, das es sich bei beiden Klassen um MFC-Klassen handeln muss?

    Gruß, Thomas.



  • *push*



  • Include in der CParentDlg.h die dazugehörende resource.h, dann sollte das eigentlich funktionieren.

    Der kennt nämlich die Resource-ID nicht. 🙂



  • class Schleife? LOL



  • estartu_de schrieb:

    Include in der CParentDlg.h die dazugehörende resource.h, dann sollte das eigentlich funktionieren.

    Der kennt nämlich die Resource-ID nicht. 🙂

    Hab ich gemacht, jetzt erzeugt jedes CProgressCtrl in meinen verschiedenen Klassen einen Compilererror:

    error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'm_cProgressbar'
    error C2501: 'CProgressCtrl' : Fehlende Speicherklasse oder Typbezeichner
    

    😞



  • Wie mache ich ihm also das CProgressCtrl bekannt? Ist das keine Standard-MFC-Klasse? 😕



  • Keine Ideen? 😞


Anmelden zum Antworten