以下ソース文ですが、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);
訂正です。
4,5,6が表示された後、また1,2,3と戻りたいのです。メンバー変数を設定しないのが条件です。
> また1,2,3と戻りたいのです
どのタイミングで戻るのでしょうか?
すみません、↓キーを押下するとまた1,2,3に戻ります。
ぱっと思いつくのは、ダイアログクラスの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);
}
ありがとうございます!!
ありました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);
}
>mCtrlIndex
ってどこで宣言して、最初は何が入っているん?
それと、ソースはインデントしないで記述しているんですか?
他人に読んでもらうことをきちんと考慮してくださいね。
(ソースの投稿前には「タブ」をスペースに置換してください。)
> 最初は何が入っているん?
は
> mCtrlIndex = IDC_EDIT8;
にありましたね。ということはメンバ変数なのかな。
このままだと、↓を押すエディットボックス関係なしで、↓を押す回数で
あるエディットボックスの値が変わりませんか?
ですので、PreTranslateMessageの中で、ちゃんとどのエディットボックスの
WM_KEYDOWNイベントなのか見極めないとダメです。
すみません、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);
}
ああ、またしてもインデントがなっていない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);
}
正直自動生成されるソースまで貼り付けられても、インデントすらされていないので読む気が起きません。
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);
}
これがmCtrlIndexの入っているヘッダーです。
試してみます。
// 生成されたメッセージ マップ関数
//{{AFX_MSG(CDisp28Dlg)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int mCtrlIndex;
解決しました、ありがとうございました。
課題でしたので本屋に行ってもみつからなくて・・・以後気をつけます!!
> 課題でしたので
課題だったら何してもいいのかなぁ。。。
先のソースは少し冗長すぎたので、修正。
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);
}
ソースをコピペして提出しても、わかる人には他人が書いたソースということが
ばれます。
わからないのであるならば、素直に先生に相談すべきだと思います。
ありがとうございます。
課題は仕事での課題です。自分の宝にします!!まだまだ初心者ですが頑張ります!!
個人的意見です。煙たいなら無視してください。
> 課題は仕事での課題です
だったらなおさら、先輩か誰かに相談すべきです。
偽りの実力で、
「これぐらいの課題はクリアする能力はある」
と判断されて、自分の実力以上の仕事を任されるということがあるかもしれませんし。
プログラム初心者(新人)のときは、ためらわずに先輩社員にわからないことは聞いてもいいんじゃないでしょうか?
ただし、同じ質問を聞いてはいけませんが。(どうせ聞くならば別の先輩に)
そうですね。反省です。
ツイート | ![]() |