I'm writing a simple MFC application with a Dialog window and some buttons. I added also a edit control in order to let user insert a text string.
I'd like to read the value which is present in the edit control and to store it in a string but i do not know how to do this.
I have no compilation error, but I always read only a "." mark.
I added a variable name to the text edit control which is filepath1
and this is the code:
// CMFC_1Dlg dialog
class CMFC_1Dlg : public CDialogEx
{
// Construction
public:
CMFC_1Dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_MFC_1_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 OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
afx_msg void OnEnChangeEdit1();
CString filePath1;
}
//...
void CMFC_1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
CMFC_1Dlg::CMFC_1Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMFC_1Dlg::IDD, pParent)
,filePath1(("..\\Experiments\\Dirs\\"))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFC_1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, filePath1);
}
// then i try to get the string value with
CString txtname=filePath1;
_cprintf("Value %s\n", txtname); // but i always read just a "."
I think your original code was OK for DDX use and CString. The advice to use a control variable and avoid the DDX/DDV functions is really one of preference and not the issue.
I suspect you are compiling with the UNICODE libraries but explicitly calling an ASCII function
_cprintf
. UNICODE is held as two bytes, for ASCII characters one of these will be 0. If you pass this to an ASCII string function it will stop after the first character.If you are using UNICODE then call
_cwprintf
or use thetchar.h
macro_tcprintf
which will call the correct version for the compiler switch.Tip: If you are targeting UNICODE only and will never require MBCS support then avoid using the
tchar.h
macros as they will obscure any issues withchar
andTCHAR
data type mixing.Note the capital 'S'
or you can cast:
You would be better off using an edit control. To create a CEdit variable, right click on the edit box in VS and select "Add Member Variable", give the variable a name and click OK.
You can then retrieve the text in the edit box like this:
Step 1: Create a CEdit control variable using "Add Variable List". Step 2: Use GetDlgItemText() to hold the text of that edict control.
Example: such as CEdit control list variable is mc_strChatPane, then GetDlgItemText(mc_strChatPane, message) where message is a user defined CString variable.