Tut für Zeiger zwischen Dialogfenstern ?



  • Hallo Zusammen,

    kann mir jemand ein gutes Tutorial nennen wo genau gezeigt wird wie ich in einem MFC Projekt von einem Dialogfeld eingaben (zb in eine Edit Box) sofort ohne Bestätigung des ok Buttons in einem anderen Dialogfeld ausgeben kann.

    Ich weiß von der Theorie her, dass das mit Zeigern geht jedoch finde ich einfach kein Tutorial wo das mal schritt für schritt erklärt wird.

    Danke im Voraus



  • Wenn Du das Handle des anderen Dialoges hast, dann kannst Du es zb. mit
    SetDlgItemText() setzen.



  • Sorry das alleine Reicht mir leider nicht, ich verstehe es einfach noch nicht.

    Was muss man in welche Datei reinschreiben damit ich die eine Nachricht versenden kann
    bitte auch wie genau ich die Zeiger Definieren und übergeben muss.

    In einem anderen Forum hört die Erklärung leider zu früh auf.

    https://www.tutorials.de/threads/eigene-nachrichten-mit-sendmessage-vc-6.227887/

    Vielleicht kann mir die jemand vervollständigen anscheinend ist das so trivial das das nie jemand erklärt aber ich als Anfänger kapiere es sonst leider einfach nicht.



  • Sorry, aber ich glaube, Dir fehlen viele Grundlagen.
    Also, ganz von Vorne beginnen - ich kann Dir nur von der guten alten Zeit berichten, in der man noch etliche Bücher las...wie das heute geht weiß ich leider nicht.



  • Ranulf_24 schrieb:

    https://www.tutorials.de/threads/eigene-nachrichten-mit-sendmessage-vc-6.227887/

    Vielleicht kann mir die jemand vervollständigen anscheinend ist das so trivial das das nie jemand erklärt aber ich als Anfänger kapiere es sonst leider einfach nicht.

    Was soll man da noch vervollständigen, SendMessage findest du in der MSDN. Damit hast du alles was du brauchst. Wenn du damit nichts anfangen kannst dann muss ich ralros recht geben, dann fehlen dir gaaaanz viele Grundlangen. Diese kannst du dir aber wie gesagt ganz altmodisch über bücher aneignen oder eben total modern n dem du dich durchs INet arbeitest und dir dort die ganzen zusammenhänge erarbeitest. Aber vielleicht hilft es auch bei google mal nach "user Message MFC" oder so was in der art zu suchen, da kommt man dann meist auch weiter. vorkauen wird dir das hier niemand.



  • Hier ein Minimalbeispiel, das dich mit deinem Kenntnisstand garantiert überfordern wird:

    msg.h

    #ifndef MESSAGES_H
    #define MESSAGES_H
    	#define UWM_MSG (WM_APP+200)
    #endif
    

    CSendMsgDlg,h

    // SendMsgDlg.h : header file
    //
    
    #pragma once
    #include "afxwin.h"
    
    // CSendMsgDlg dialog
    class CSendMsgDlg : public CDialog
    {
    // Construction
    public:
    	CSendMsgDlg(CWnd* pParent = NULL);	// standard constructor
    
    // Dialog Data
    	enum { IDD = IDD_SENDMSG_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
    
    // Implementation
    protected:
    	HICON m_hIcon;
    
    	// Generated message map functions
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    
    	afx_msg void OnBnClickedButton1();
    
    	LRESULT OnMsg(WPARAM, LPARAM);
    public:
    	CEdit C_edit1;
    };
    

    SendMsgDlg.cpp

    // SendMsgDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "SendMsg.h"
    #include "SendMsgDlg.h"
    #include "msg.h"
    #include "SenderDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CSendMsgDlg dialog
    
    CSendMsgDlg::CSendMsgDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CSendMsgDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CSendMsgDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_EDIT1, C_edit1);
    }
    
    BEGIN_MESSAGE_MAP(CSendMsgDlg, CDialog)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BUTTON1, &CSendMsgDlg::OnBnClickedButton1)
    	ON_MESSAGE(UWM_MSG, OnMsg)
    END_MESSAGE_MAP()
    
    // CSendMsgDlg message handlers
    
    BOOL CSendMsgDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CSendMsgDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Center icon in client rectangle
    		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;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // The system calls this function to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CSendMsgDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    void CSendMsgDlg::OnBnClickedButton1()
    {
    	CSenderDlg senderdlg;
    	senderdlg.SetRecipientDlg( this );
    	senderdlg.DoModal();
    }
    
    LRESULT CSendMsgDlg::OnMsg(WPARAM msg, LPARAM )
    {
    	CString *message = (CString *) msg;
    	C_edit1.SetWindowText(*message);
    	delete message;
    
    	return 0;
    }
    

    SenderDlg.h

    #pragma once
    #include "msg.h"
    #include "afxwin.h"
    
    // CSenderDlg dialog
    
    class CSenderDlg : public CDialog
    {
    	DECLARE_DYNAMIC(CSenderDlg)
    
    public:
    	CSenderDlg(CWnd* pParent = NULL);   // standard constructor
    	virtual ~CSenderDlg();
    	void SetRecipientDlg(CWnd *w) { recipient_dlg = w; }
    
    // Dialog Data
    	enum { IDD = IDD_DIALOG1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    	DECLARE_MESSAGE_MAP()
    
    	afx_msg void OnBnClickedButton1();
    	CEdit editctrl;
    	CString editctrl_str;
    	CWnd *recipient_dlg;
    };
    

    SenderDlg.cpp

    // SenderDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "SendMsg.h"
    #include "SenderDlg.h"
    
    // CSenderDlg dialog
    
    IMPLEMENT_DYNAMIC(CSenderDlg, CDialog)
    
    CSenderDlg::CSenderDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CSenderDlg::IDD, pParent)
    {
    
    }
    
    CSenderDlg::~CSenderDlg()
    {
    }
    
    void CSenderDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_EDIT1, editctrl);
    }
    
    BEGIN_MESSAGE_MAP(CSenderDlg, CDialog)
    	ON_BN_CLICKED(IDC_BUTTON1, &CSenderDlg::OnBnClickedButton1)
    END_MESSAGE_MAP()
    
    // CSenderDlg message handlers
    
    void CSenderDlg::OnBnClickedButton1()
    {
    	editctrl.GetWindowText(editctrl_str);
    	CString *msg = new CString( editctrl_str );
    	if( !recipient_dlg->PostMessage( UWM_MSG, (WPARAM)msg, 0 ) )
    		delete msg;
    }
    

    EDIT:
    Bevor wieder irgendwelche dämlichen Kommentare kommen:
    Ich weiß, daß nicht alle Variablennamen optimal gewählt sind. War auch nur so schnell zusammengeschustert nachdem dem TE niemand wirklich geholfen hat..


  • Mod

    Für das Beispiel hätte es SendMessage auch getan únd damit kann man sich das Speicherhandling sparen.



  • Martin Richter schrieb:

    Für das Beispiel hätte es SendMessage auch getan únd damit kann man sich das Speicherhandling sparen.

    Inwiefern? Hab es mit SendMessage versucht und bekam eine unhandled exception (bei delete msg glaube ich). Exakt der gleiche code nur SendMessage statt PostMessage.
    Die Methode an sich habe ich mir von Mr. Newcomer abgekuckt.


  • Mod

    Kann nicht sein. SendMessage mach t einfach nur einen Call, d.h. Du bleibst im Callstack.
    Mit PostMessage wird die Queue verwendet. Ist also entkoppelt und wird erst bei der nächsten Nachrichten Behandlung abgearbeitet.

    SendMessage wirkt sofort, PostMessage nur wenn eine Messagepunp läuft.



  • Muss mir erst noch einmal ansehen, ob SendMessage eine andere Konvention hat. Mein Fehler.

    Aber wie könnte ich mit SendMessage das Speicherhandling vermeiden?



  • Indem du direkt 'editctrl_str' an SendMessage übergibst (und das 'delete message' in OnMsg löschst).


  • Mod

    Ganz einfach Du erzeugst eine Variable auf dem Stack und übergibst den Zeiger. Kein new kein delete!



  • Danke an euch Beide. Wieder mal was dazugelernt., muss mir das aber noch genauer ansehen.


Log in to reply