5

ダイアログウィンドウといくつかのボタンを備えた単純なMFCアプリケーションを作成しています。ユーザーがテキスト文字列を挿入できるようにするために、編集コントロールも追加しました。

エディットコントロールにある値を読み取って文字列に保存したいのですが、その方法がわかりません。

コンパイルエラーはありませんが、常に「。」のみを読み取ります。マーク。

テキスト編集コントロールに変数名を追加しましたfilepath1。これは次のコードです。

    // 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 "."
4

3 に答える 3

6
_cprintf("Value %S\n", txtname.GetString());

大文字の「S」に注意してください

またはキャストできます:

_cprintf("Value %S\n", (LPCTSTR)txtname);

編集コントロールを使用する方がよいでしょう。CEdit変数を作成するには、VSの編集ボックスを右クリックして[メンバー変数の追加]を選択し、変数に名前を付けて[OK]をクリックします。

次に、次のように編集ボックスのテキストを取得できます。

CEdit m_EditCtrl;
// ....
CString filePath1 = m_EditCtrl.GetWindowText()
于 2012-06-16T18:31:33.963 に答える
2

元のコードはDDXとCStringで問題ないと思います。制御変数を使用し、DDX / DDV関数を回避するためのアドバイスは、実際には優先事項の1つであり、問​​題ではありません。

UNICODEライブラリを使用してコンパイルしているが、ASCII関数を明示的に呼び出していると思われます_cprintf。UNICODEは2バイトとして保持され、ASCII文字の場合、これらの1つは0になります。これをASCII文字列関数に渡すと、最初の文字の後で停止します。

UNICODEを使用している場合は、コンパイラスイッチの正しいバージョンを呼び出すマクロを呼び出す_cwprintfか使用します。tchar.h_tcprintf

ヒント:UNICODEのみを対象としていて、MBCSサポートを必要としない場合は、マクロの使用を避けてください。マクロを使用すると、データ型の混合tchar.hに関する問題がわかりにくくなります。charTCHAR

于 2012-07-18T13:17:04.217 に答える
0

ステップ1:「変数リストの追加」を使用してCEdit制御変数を作成します。ステップ2:GetDlgItemText()を使用して、そのエディクトコントロールのテキストを保持します。

例:CEditコントロールリスト変数はmc_strChatPaneであり、GetDlgItemText(mc_strChatPane、message)です。ここで、messageはユーザー定義のCString変数です。

于 2013-09-05T01:03:38.927 に答える