キーイベントでEDITボックスの書き換えを行うには?

解決


まさ  2006-08-01 20:52:49  No: 62620

以下ソース文ですが、EDIT8,13,14の内容を↓キーを押下時に1,2,3がそれぞれ4,5,6と書き換えの処理をしたいのですが、わからないのでお願いします。       
        CDialog::OnInitDialog();
        
        // TODO: この位置に初期化の補足処理を追加してください

         CString str1 = "NO1";
        CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
        pEdit->SetWindowText(str1);
        CString str2 = "1801R";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);
        pEdit->SetWindowText(str2);
        CString str3 = "38310";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT3);
        pEdit->SetWindowText(str3);

        CString str4 = "61+40+7:1 19175\r\n030793";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT4);
        pEdit->SetWindowText(str4);

        CString str5 = "1";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
        pEdit->SetWindowText(str5);
        pEdit->SetFocus();
        mCtrlIndex = IDC_EDIT8;

        CString str6 = "2";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
        pEdit->SetWindowText(str6);
        CString str7 = "3";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
        pEdit->SetWindowText(str7);


まさ  2006-08-01 20:55:38  No: 62621

訂正です。
4,5,6が表示された後、また1,2,3と戻りたいのです。メンバー変数を設定しないのが条件です。


Blue  2006-08-01 20:57:25  No: 62622

> また1,2,3と戻りたいのです
どのタイミングで戻るのでしょうか?


まさ  2006-08-01 21:24:14  No: 62623

すみません、↓キーを押下するとまた1,2,3に戻ります。


Blue  2006-08-01 22:08:08  No: 62624

ぱっと思いつくのは、ダイアログクラスのPreTranslateMessageメソッドで
WM_KEYDOWNかなんかで、wParamがVK_DOWNの時に処理するとか。

// EDIT8 だけ対応してあります。
// EDIT13, EDIT14は応用して、下のコードに組み込んでください。
BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
    if ( pMsg->message == WM_KEYDOWN )
    {
        CEdit* pEdit = static_cast< CEdit* >( this->GetDlgItem( IDC_EDIT8 ) );
        if ( pEdit->GetSafeHwnd() == pMsg->hwnd )
        {
            if ( pMsg->wParam  == VK_DOWN )
            {
                CString text;
                pEdit->GetWindowText( text );
                if ( text == _T( "1" ) )
                {
                    pEdit->SetWindowText( _T( "4" ) );
                }
                else if ( text == _T( "4" ) )
                {
                    pEdit->SetWindowText( _T( "1" ) );
                }
            }
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}


まさ  2006-08-01 22:21:17  No: 62625

ありがとうございます!!
ありましたVK_DOWNコマンドが!!でもこれをswitchに変換してエラーが出ました(汗)。すみません、良い組み方はありますでしょうか?よろしくお願いします。
// Disp28Dlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "MC3000E.h"
#include "Disp28Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDisp28Dlg ダイアログ

CDisp28Dlg::CDisp28Dlg(CWnd* pParent /*=NULL*/)
        : CDialog(CDisp28Dlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CDisp28Dlg)
        //}}AFX_DATA_INIT
}

void CDisp28Dlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CDisp28Dlg)
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDisp28Dlg, CDialog)
        //{{AFX_MSG_MAP(CDisp28Dlg)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDisp28Dlg メッセージ ハンドラ

BOOL CDisp28Dlg::OnInitDialog() 
{
        CDialog::OnInitDialog();
        
        // TODO: この位置に初期化の補足処理を追加してください
        CString str1 = "NO1";
        CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
        pEdit->SetWindowText(str1);
        CString str2 = "1801R";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);
        pEdit->SetWindowText(str2);
        CString str3 = "38310";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT3);
        pEdit->SetWindowText(str3);

        CString str4 = "61+40+7:1 19175\r\n030793";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT4);
        pEdit->SetWindowText(str4);

        CString str5 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
        pEdit->SetWindowText(str5);
        pEdit->SetFocus();
        mCtrlIndex = IDC_EDIT8;

        CString str6 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
        pEdit->SetWindowText(str6);
        CString str7 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
        pEdit->SetWindowText(str7);
#ifdef  MC3000_WINDOW_MAX
        ShowWindow(SW_SHOWMAXIMIZED);//画面の最大化
#endif
        return FALSE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
                      // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

BOOL CDisp28Dlg::PreTranslateMessage(MSG* pMsg) 
{
        // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
        CEdit* pEdit;
        if(pMsg->message==WM_KEYDOWN){
                switch(pMsg->wParam){
                case VK_DOWN:
                        switch(mCtrlIndex){
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        }
                        break;

                }
        }
        return CDialog::PreTranslateMessage(pMsg);
}


Blue  2006-08-01 22:31:24  No: 62626

>mCtrlIndex
ってどこで宣言して、最初は何が入っているん?

それと、ソースはインデントしないで記述しているんですか?
他人に読んでもらうことをきちんと考慮してくださいね。
(ソースの投稿前には「タブ」をスペースに置換してください。)


Blue  2006-08-01 22:34:06  No: 62627

> 最初は何が入っているん?

> mCtrlIndex = IDC_EDIT8;
にありましたね。ということはメンバ変数なのかな。

このままだと、↓を押すエディットボックス関係なしで、↓を押す回数で
あるエディットボックスの値が変わりませんか?

ですので、PreTranslateMessageの中で、ちゃんとどのエディットボックスの
WM_KEYDOWNイベントなのか見極めないとダメです。


まさ  2006-08-01 22:37:44  No: 62628

すみません、mCtrlIndexは、
ヘッダーファイルでint型と宣言してあります。インデントについては申し訳ありませんでした。
// Disp28Dlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "MC3000E.h"
#include "Disp28Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDisp28Dlg ダイアログ

CDisp28Dlg::CDisp28Dlg(CWnd* pParent /*=NULL*/)
        : CDialog(CDisp28Dlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CDisp28Dlg)
        //}}AFX_DATA_INIT
}

void CDisp28Dlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CDisp28Dlg)
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDisp28Dlg, CDialog)
        //{{AFX_MSG_MAP(CDisp28Dlg)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDisp28Dlg メッセージ ハンドラ

BOOL CDisp28Dlg::OnInitDialog() 
{
        CDialog::OnInitDialog();
        
        // TODO: この位置に初期化の補足処理を追加してください
        CString str1 = "NO1";
        CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
        pEdit->SetWindowText(str1);
        CString str2 = "1801R";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);
        pEdit->SetWindowText(str2);
        CString str3 = "38310";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT3);
        pEdit->SetWindowText(str3);

        CString str4 = "61+40+7:1 19175\r\n030793";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT4);
        pEdit->SetWindowText(str4);

        CString str5 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
        pEdit->SetWindowText(str5);
        pEdit->SetFocus();
        mCtrlIndex = IDC_EDIT8;

        CString str6 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
        pEdit->SetWindowText(str6);
        CString str7 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
        pEdit->SetWindowText(str7);
#ifdef  MC3000_WINDOW_MAX
        ShowWindow(SW_SHOWMAXIMIZED);//画面の最大化
#endif
        return FALSE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
                      // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

BOOL CDisp28Dlg::PreTranslateMessage(MSG* pMsg) 
{
        // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
        CEdit* pEdit;
        if(pMsg->message==WM_KEYDOWN){
                switch(pMsg->wParam){
                case VK_DOWN:
                        switch(mCtrlIndex){
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        }
                        break;

                case VK_RIGHT:
                        switch(mCtrlIndex){
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        }
                        break;
                case VK_LEFT:
                        switch(mCtrlIndex){
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        }
                        break;
                }
        }
        return CDialog::PreTranslateMessage(pMsg);
}


まさ  2006-08-01 22:40:13  No: 62629

ああ、またしてもインデントがなっていないorz
これでなってるはずなのですが、なってなかったらすみません。

void CDisp28Dlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CDisp28Dlg)
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDisp28Dlg, CDialog)
        //{{AFX_MSG_MAP(CDisp28Dlg)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDisp28Dlg メッセージ ハンドラ

BOOL CDisp28Dlg::OnInitDialog() 
{
        CDialog::OnInitDialog();
        
        // TODO: この位置に初期化の補足処理を追加してください
        CString str1 = "NO1";
        CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
        pEdit->SetWindowText(str1);
        CString str2 = "1801R";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);
        pEdit->SetWindowText(str2);
        CString str3 = "38310";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT3);
        pEdit->SetWindowText(str3);

        CString str4 = "61+40+7:1 19175\r\n030793";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT4);
        pEdit->SetWindowText(str4);

        CString str5 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
        pEdit->SetWindowText(str5);
        pEdit->SetFocus();
        mCtrlIndex = IDC_EDIT8;

        CString str6 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
        pEdit->SetWindowText(str6);
        CString str7 = "";
        pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
        pEdit->SetWindowText(str7);
#ifdef  MC3000_WINDOW_MAX
        ShowWindow(SW_SHOWMAXIMIZED);//画面の最大化
#endif
        return FALSE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
                      // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

BOOL CDisp28Dlg::PreTranslateMessage(MSG* pMsg) 
{
        // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
        CEdit* pEdit;
        if(pMsg->message==WM_KEYDOWN){
                switch(pMsg->wParam){
                case VK_DOWN:
                        switch(mCtrlIndex){
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        }
                        break;

                case VK_RIGHT:
                        switch(mCtrlIndex){
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        }
                        break;
                case VK_LEFT:
                        switch(mCtrlIndex){
                        case IDC_EDIT14:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT13);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT13;
                                break;
                        case IDC_EDIT13:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT8);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT8;
                                break;
                        case IDC_EDIT8:
                                pEdit = (CEdit*)GetDlgItem(IDC_EDIT14);
                                pEdit->SetFocus();
                                mCtrlIndex = IDC_EDIT14;
                                break;
                        }
                        break;
                }
        }
        return CDialog::PreTranslateMessage(pMsg);
}


Blue  2006-08-01 22:43:30  No: 62630

正直自動生成されるソースまで貼り付けられても、インデントすらされていないので読む気が起きません。

BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
    if ( pMsg->message == WM_KEYDOWN )
    {
        if ( pMsg->wParam  == VK_DOWN )
        {
            CWnd* pWnd = CWnd::FromHandle( pMsg->hwnd );
            CString text;
            pWnd->GetWindowText( text );

            switch ( pWnd->GetDlgCtrlID() )
            {
            case IDC_EDIT8:
                if ( text == _T( "1" ) )
                {
                    pWnd->SetWindowText( _T( "4" ) );
                }
                else if ( text == _T( "4" ) )
                {
                    pWnd->SetWindowText( _T( "1" ) );
                }
                break;
            case IDC_EDIT13:
                if ( text == _T( "2" ) )
                {
                    pWnd->SetWindowText( _T( "5" ) );
                }
                else if ( text == _T( "5" ) )
                {
                    pWnd->SetWindowText( _T( "2" ) );
                }
                break;
            case IDC_EDIT14:
                if ( text == _T( "3" ) )
                {
                    pWnd->SetWindowText( _T( "6" ) );
                }
                else if ( text == _T( "6" ) )
                {
                    pWnd->SetWindowText( _T( "3" ) );
                }
                break;
            }
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}


まさ  2006-08-01 22:44:12  No: 62631

これがmCtrlIndexの入っているヘッダーです。
試してみます。
        // 生成されたメッセージ マップ関数
        //{{AFX_MSG(CDisp28Dlg)
virtual BOOL OnInitDialog();
        //}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int     mCtrlIndex;


まさ  2006-08-01 22:47:36  No: 62632

解決しました、ありがとうございました。
課題でしたので本屋に行ってもみつからなくて・・・以後気をつけます!!


Blue  2006-08-01 22:54:23  No: 62633

> 課題でしたので
課題だったら何してもいいのかなぁ。。。

先のソースは少し冗長すぎたので、修正。
BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
    if ( pMsg->message == WM_KEYDOWN )
    {
        if ( pMsg->wParam  == VK_DOWN )
        {
            CWnd* pWnd = CWnd::FromHandle( pMsg->hwnd );
            CString text;
            pWnd->GetWindowText( text );

            static LPCTSTR edit8Values[]  = { _T( "1" ), _T( "4" ) };
            static LPCTSTR edit13Values[] = { _T( "2" ), _T( "5" ) };
            static LPCTSTR edit14Values[] = { _T( "3" ), _T( "6" ) };

            LPCTSTR *plst = NULL;

            switch ( pWnd->GetDlgCtrlID() )
            {
            case IDC_EDIT8:
                plst = edit8Values;
                break;
            case IDC_EDIT13:
                plst = edit13Values;
                break;
            case IDC_EDIT14:
                plst = edit14Values;
                break;
            }
            if ( plst )
            {
                if ( text == plst[ 0 ] )
                {
                    pWnd->SetWindowText( plst[ 1 ] );
                }
                else if ( text == plst[ 1 ] )
                {
                    pWnd->SetWindowText( plst[ 0 ] );
                }
            }
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

ソースをコピペして提出しても、わかる人には他人が書いたソースということが
ばれます。
わからないのであるならば、素直に先生に相談すべきだと思います。


まさ  2006-08-01 22:59:22  No: 62634

ありがとうございます。
課題は仕事での課題です。自分の宝にします!!まだまだ初心者ですが頑張ります!!


Blue  2006-08-01 23:10:38  No: 62635

個人的意見です。煙たいなら無視してください。

> 課題は仕事での課題です
だったらなおさら、先輩か誰かに相談すべきです。
偽りの実力で、
「これぐらいの課題はクリアする能力はある」
と判断されて、自分の実力以上の仕事を任されるということがあるかもしれませんし。

プログラム初心者(新人)のときは、ためらわずに先輩社員にわからないことは聞いてもいいんじゃないでしょうか?
ただし、同じ質問を聞いてはいけませんが。(どうせ聞くならば別の先輩に)


まさ  2006-08-01 23:45:57  No: 62636

そうですね。反省です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加