Prüfung OnLButtonDown sowie AfxMessageBox("Hallo") funktioniert nicht



  • Hallo,

    bin Neuling bei VisualStudio:Net C++. Ich habe mir von www-user.tu-chemnitz.de/~kmai/work/info/Scripte/Sybex - Visual C%2B%2B.NET.pdf

    das Dokument gezogen und gehe jedes Kapitel durch. Nun habe ich in Kapitel 4 ein MFC Gerüst per Anweisung erstellt, ein Zeichenprogramm. Nachdem ich das Gruppenfeld eingesetzt habe, möchte ich eine Ereigniszuweisung für das Gruppenfeld machen (OnLButtonDown). In diesem Ereignis soll ein Messagefenster ausgegeben werden, um zu prüfen, ob die Überprüfung der linken Maustaste funktioniert.

    Es funktioniert nicht. Zum einen meckert er beim Debuggen wegen der AfxMessageBox("Hallo");

    zum anderen springt das Programm nicht einmal zum Ereignis der OnLButtonDown-Behandlung, wenn ich einen Break-Point setze. Wer hat eine Ahnung was da los ist? Für Euch ist das wohl ein typischer Anfängerfehler denke ich.
    Anbei der Code vom Dialog:

    #include "stdafx.h"
    #include "ZeichenprogammNeu.h"
    #include "ZeichenprogammNeuDlg.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    // CZeichenprogammNeuDlg-Dialogfeld

    CZeichenprogammNeuDlg::CZeichenprogammNeuDlg(CWnd* pParent /=NULL/)
    : CDialog(CZeichenprogammNeuDlg::IDD, pParent)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CZeichenprogammNeuDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }

    BEGIN_MESSAGE_MAP(CZeichenprogammNeuDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_WM_LBUTTONDOWN()
    // ON_WM_LBUTTONDBLCLK()
    END_MESSAGE_MAP()

    // CZeichenprogammNeuDlg-Meldungshandler

    BOOL CZeichenprogammNeuDlg::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

    // TODO: Hier zusätzliche Initialisierung einfügen

    return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }

    // Wenn Sie dem 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 ausgeführt.

    void CZeichenprogammNeuDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // Gerätekontext zum Zeichnen

    SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

    // Symbol in Clientrechteck 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 System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer
    // das minimierte Fenster mit der Maus zieht.
    HCURSOR CZeichenprogammNeuDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }

    void CZeichenprogammNeuDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    AfxMessageBox("Hallo"); // Funktioniert so nicht,

    // folgende Meldung erschein im Debugger:
    /*
    ZeichenprogammNeuDlg.cpp
    c:\dokumente und einstellungen\markus\eigene dateien\visual studio 2008\projects\zeichenprogramm\zeichenprogammneu\zeichenprogammneu\zeichenprogammneudlg.cpp(95) : error C2665: "AfxMessageBox": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden.
    c:\programme\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(5372): kann 'int AfxMessageBox(LPCTSTR,UINT,UINT)' sein
    c:\programme\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(5374): oder "int AfxMessageBox(UINT,UINT,UINT)"
    bei Anpassung der Argumentliste '(const char [6])'
    */
    CDialog::OnLButtonDown(nFlags, point);
    }



  • Versuch es mal mit

    AfxMessageBox(_T("Hallo"));
    

    Nächstes Mal wären Code-Tags ne feine Sache, dann kann man den Quellcode besser lesen. 😉



  • Danke für die schnelle Hilfe.
    Es scheint so, als wären manche Funktionen von C veraltet. Evtl. hängt das auch mit dieser Funktion zusammen.

    Ich wollte mit sprintf Daten in einen string umwandeln, dabei motzt aber der Compiler. Er eint ich soll sprintf_s verwenden. ist das nun neuerdings wirklich so?
    Kann man da den alten Glunker vergessen?



  • moehrle schrieb:

    Ich wollte mit sprintf Daten in einen string umwandeln, dabei motzt aber der Compiler. Er eint ich soll sprintf_s verwenden. ist das nun neuerdings wirklich so?
    Kann man da den alten Glunker vergessen?

    Die alten CRT-Funktionen sind anfällig für Pufferüberläufe, weil nirgendwo die Größe des zur Verfügung stehenden Speicherbereichs übergeben wird. Deshalb hat Microsoft neue Funktionen eingeführt, diese sind durch ein _s am Ende des Namens gekennzeichnet.

    Die alten Funktionen können weiter verwendet werden, man sollte aber möglichst auf die neuen (sicheren) umsteigen.



  • Hallo, die erste Hürde von dem Testprogramm ist genommen. Aber dann kam die sprintf() - Funktion dazu. De Compiler hat gemeckert, ich soll die neue sichere Funktion sprint_s() verwenden. Habe ich dann getan, aber dann hat die Funktion AfxMessageBox(_T(lpszAusgabe)); nicht mehr funktioniert. Wo liegt der Hund begraben?
    Fehlermeldung vom Compiler:

    ------ Erstellen gestartet: Projekt: Zeichenprogramm, Konfiguration: Debug Win32 ------
    Kompilieren...
    ZeichenprogrammDlg.cpp
    d:\visual studio 2008 projekte\zeichenprogramm\zeichenprogramm\zeichenprogrammdlg.cpp(162) : error C2065: 'LlpszAusgabe': nichtdeklarierter Bezeichner
    Das Buildprotokoll wurde unter "file://d:\Visual Studio 2008 Projekte\Zeichenprogramm\Zeichenprogramm\Debug\BuildLog.htm" gespeichert.
    Zeichenprogramm - 1 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    // ZeichenprogrammDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "Zeichenprogramm.h"
    #include "ZeichenprogrammDlg.h"
    #include "stdio.h"
    
    #define _CRT_SECURE_NO_WARNINGS			// Wegen der Sicherheitsfunktion sprintf_s eingefügt
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);   // [cpp]DDX/DDV-Unterstützung
    
    // Implementierung
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    // CZeichenprogrammDlg-Dialogfeld
    
    CZeichenprogrammDlg::CZeichenprogrammDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CZeichenprogrammDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CZeichenprogrammDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CZeichenprogrammDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()
    
    // CZeichenprogrammDlg-Meldungshandler
    
    BOOL CZeichenprogrammDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// 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
    
    	// TODO: Hier zusätzliche Initialisierung einfügen
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CZeichenprogrammDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wenn Sie dem 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 ausgeführt.
    
    void CZeichenprogrammDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Symbol in Clientrechteck 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 System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer
    //  das minimierte Fenster mit der Maus zieht.
    HCURSOR CZeichenprogrammDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    void CZeichenprogrammDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	// Poasition in String umwandeln
    	char lpszAusgabe[256];
    	sprintf_s(lpszAusgabe, "Mouseposition: %i %i", point.x, point.y);   // war zuvor sprintf, Compiler hat gemotzt, ich soll sprintf_s verwenden und die #define oben einbinden
    
    	AfxMessageBox(_T(lpszAusgabe));										// compiler bringt mit AfxMessageBox(_T...) Fehler
    	CDialog::OnLButtonDown(nFlags, point);
    }
    


  • Du musst schon die richtigen Argumente übergeben:

    char lpszAusgabe[256];
    sprintf_s(lpszAusgabe, 256, "Mouseposition: %i %i", point.x, point.y);
    


  • Hallo Sri,

    danke für deine Hilfe.
    Leider funktioniert die die Funktion der AfxMessageBox() noch nicht. Wenn ich

    AfxMessageBox(_T("Hallo");
    

    teste, funktionierts. Aber sobald ich den lpszAusgabe einsetze

    AfxMessageBox(lpZeiger, MB_ICONSTOP);
    

    bekomme ich eine Fehlermeldung vom Compiler die lautet:

    d:\visual studio 2008 projekte\zeichenprogramm\zeichenprogramm\zeichenprogrammdlg.cpp(173) : error C2665: "AfxMessageBox": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden.
    c:\programme\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(5372): kann 'int AfxMessageBox(LPCTSTR,UINT,UINT)' sein
    c:\programme\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(5374): oder "int AfxMessageBox(UINT,UINT,UINT)"
    bei Anpassung der Argumentliste '(char *, long)'

    Das geschieht genauso bei der anderen Funktion:

    AfxMessageBox(_T(lpszAusgabe, MB_ICONSTOP));
    

    Ausgabe der Fehlermeldung:
    d:\visual studio 2008 projekte\zeichenprogramm\zeichenprogramm\zeichenprogrammdlg.cpp(173) : warning C4002: Zu viele übergebene Parameter für das Makro '_T'
    d:\visual studio 2008 projekte\zeichenprogramm\zeichenprogramm\zeichenprogrammdlg.cpp(173) : error C2065: 'LlpszAusgabe': nichtdeklarierter Bezeichner

    Bei dem letzetn Beispiel ist mir die Meldung klar, weil eigentlich nur ein String oder "Text" in die Funktion eingegeben werden darf.

    Bei dem ersten Besispiel oben, muß wohl das Array in einen String konvertiert werden??
    Ich habe da etwas meine Probleme mit den Erklärungen der ganzen Funktionen, wenn da die Parameterbezeichnungen beshrieben werden. gibts dafür einen Tipp?

    ALs Beispiel die Funktion AfxMessageBox(). Diese Funktion kann wohl überladen werden, weshalb
    Funktion

    AfxMessageBox(UINT,UINT,UINT)
    

    oder:
    Funktion

    AfxMessageBox(LPCTSTR lpszText,UINT nType = MB_OK,UINT nIDHelp = 0)
    

    eingegeben werden kann. Was bedeutet nun LPCTSTR lpszText ??
    Ein Pointer LPCTSTR auf eine STringvariable, die von der Klasse CTSTR ist?
    Das sind die Dinge die mir Probleme machen. Wenn ich das geschluckt habe, wirds vielleicht einfacher.



  • In Deinen Projekteigenschaften ist als Standardzeichensatz "Unicode" definiert, deshalb erwartet AfxMessageBox auch einen Unicode-String. Du übergibts aber nur einen Ansi-String, daher der Fehler.

    Abhilfe: Entweder statt char[] immer TCHAR[] verwenden oder den Standardzeichensatz in den Projekteigenschaften auf "Nicht definiert" oder "Multibyte" setzen.



  • Erst mal Danke, Sri, hast mir weitergeholfen. Nun zuz den ganzen Erklärungen mit dem LPCTSTR lpszText und den ganzen Methoden für die Klassen, wo finde ich das am besten erklärt? Wenn man den Einstieg mit der Syntax einwenig gefressen hat, dann wird sich der Rest doch auch noch schlucken lassen. Gibts da noch irgendwo eine tolle Seite für Einsteiger? Natürlich kann man googeln, aber die Programmierkings haben da bestimmt einen Tipp dazu.


Anmelden zum Antworten