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..
-
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.
-
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).
-
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.