どーもです。
初心者な質問ですが教えてください。
環境はVC++.NET(MFC) XP です
エディットボックスのマスクをプログラム上で制御したいのですが、
何と記述すれば良いのか分かりません。
参考先でも良いので教えてください。
具体的にどのようなマスクになるのでしょうか?
# それによっては、CEditでは難関になるでしょうけど。
# ユーザインタフェースで入力を制限するのが理想だけど、
# 確定ボタンとかで、入力値チェックをするのもありだと思うのですけど。
お返事ありがとうございます。
マスクはプロパティ設定で言うとVisibleです。
やりたい事は
ダイアログ1つに対し、データの内容により
遷移された際、エディットボックスのテキストを入力可/不可と言う
制御を行うと言うものです。
簡単にダイアログを2つ作成(マスク可と不可のもの)
すればよいのですが、
そこだけ違うだけなので1つで出来ないかなぁと思い
質問させて頂きました。
> エディットボックスのテキストを入力可/不可と言う
MFCでしたら、普通にEnableWindowメソッドではダメでしょうか?
CWnd *pWnd = this->GetDlgItem(IDC_EDIT1);
pWnd->EnableWindow(FALSE); // 無効
pWnd->EnableWindow(TRUE); // 有効
Blueさん ありがとうございます。
『マスクはプロパティ設定はVisible』と言いましたが、
Disabledでした。間違えてました。すいません。
EnableWindowメソッドを使って、
うまくいきました。
別でちょっと質問なのですが、
先ほどのダイアログの遷移の話ですが、
例えば、
ダイアログA にボタンY、ボタンZと2個作成し、
どちらのボタンを押しても
ダイアログB に遷移するという処理を作成するとき、
どちらのボタンを押されたか?と言うのは
ボタンにフラグを持たせる以外で、他に方法があるのでしょうか?
> どちらのボタンを押されたか?と言うのは
ダイアログBが、どちらのボタンで呼ばれたのかということでしょうか?
実際にどのようなコードなのかわからないのですが、
フラグにしてわかりやすいならそれでいいようですけど。
void CXXXDlg::OnButtonX()
{
CDlgB dlg( this );
dlg.SetCallButton( ButtonX ); // みたいなSetterをつくる
dlg.DoModal();
}
# プロパティという用語が出てきますけど、VBやC#のプログラム経験がおありなんでしょうかね?
># プロパティという用語が出てきますけど、VBやC#のプログラム経験がおありなんでしょうかね?
VB入門を少しさわった程度です。 お恥ずかしいですが。。。。。
***************************************
ダイアログA.h
・・
extern int FLG;
***************************************
***************************************
ダイアログA.cpp
#include "ダイアログA.h"
int FLG;
・
・
void ダイアログA::OnBnClickedButton1()
{
FLG = 1;
ダイアログA dlga;
INT_PTR ret = 0;
ret = dlga.DoModal();
}
void ダイアログA::OnBnClickedButton2()
{
FLG = 2;
ダイアログA dlga;
INT_PTR ret = 0;
ret = dlga.DoModal();
}
***************************************
***************************************
ダイアログB.cpp
#include "ダイアログA.h"
BOOL ダイアログB::OnInitDialog()
{
CWnd *pWnd = this->GetDlgItem(IDC_EDIT1);
if (FLG == 1){
pWnd->EnableWindow(TRUE);
}
else{
pWnd->EnableWindow(FALSE);
}
CDialog::OnInitDialog();
return TRUE;
}
***************************************
と言う感じで作っているのですが、
ダイアログが他にも複数ある為、他に方法が無いかなと思い
質問させて頂きました。
すいません。クラスの名前を間違えました。
ダイアログA dlga; → ダイアログB dlgb;でした。
***************************************
ダイアログA.cpp
#include "ダイアログA.h"
int FLG;
・
・
void ダイアログA::OnBnClickedButton1()
{
FLG = 1;
ダイアログB dlgb;
INT_PTR ret = 0;
ret = dlgb.DoModal();
}
void ダイアログA::OnBnClickedButton2()
{
FLG = 2;
ダイアログB dlgb;
INT_PTR ret = 0;
ret = dlgb.DoModal();
}
***************************************
とりあえず、グローバル変数は使わないほうが良いですので、
フラグをダイアログBのメンバ変数にしてみては。
***************************************
ダイアログA.h
・・
//extern int FLG; // 使わない
***************************************
***************************************
ダイアログA.cpp
#include "ダイアログA.h"
//int FLG; // 使わない
・
・
void ダイアログA::OnBnClickedButton1()
{
//FLG = 1;
ダイアログB dlgb;
dlgb.m_FLG = 1;
//INT_PTR ret = 0;
//ret = dlgb.DoModal();
dlgb.DoModal(); // 戻り値を使わないならば、別にこれでも問題ない
}
// OnBnClickedButton2も同様
***************************************
***************************************
ダイアログB.h
・・
class ダイアログB : public CDiaglog
{
・・
public:
int m_FLG; // 追加。本来ならばpublicな変数もあまりよろしくない。
};
***************************************
***************************************
ダイアログB.cpp
#include "ダイアログA.h"
BOOL ダイアログB::OnInitDialog()
{
CWnd *pWnd = this->GetDlgItem(IDC_EDIT1);
if (this->m_FLG == 1){
pWnd->EnableWindow(TRUE);
}
else{
pWnd->EnableWindow(FALSE);
}
CDialog::OnInitDialog();
return TRUE;
}
***************************************
> ダイアログが他にも複数ある為
というのが良くわかりません。
A→B→C→D→・・・
とダイアログを遷移していくのか(すべて以前のダイアログに状態が依存する)
A→B
→C
→D→E→・・・
(B、C、Dの状態はAのボタンに依存、EはDのボタンに依存)
本当に、ご親切な説明ありがとうございます。
ダイアログが複数とは、A→B、C→D、E→F....とあるのですが、
1つのプロジェクト上にある為、
FLG宣言/設定で混乱しそうだったので他に無いかと思い
質問させて頂きました。
教えていただいた方法で遷移させようと思います。
> dlgb.DoModal(); // 戻り値を使わないならば、別にこれでも問題ない
ご指摘ありがとうございます。
本当に長い時間、お付き合い頂きありがとうございました。
ツイート | ![]() |