プロが教えるわが家の防犯対策術!

VC++で電卓を作ってみたのですが、数字をエディットボックスに直接入れるのではなく、ボタンを押すと数字を入力できる方式にする方法が思いつきません、ヒントを教えてください。

A 回答 (4件)

例えば。

。。CDialog派生のウインドウで数字のボタンを作り、メンバ変数でint _nInput;をコンストラクタで_nInput = 0;とします。

ここで「1」を押したら_nInput *=10;_nInput+=1;をします。「2」を押したら_nInput *=10;_nInput+=2;という感じです。どうでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます、出来ました。
こんなに簡単なんて、、、自分の発想力の無さにがっかりです。

お礼日時:2005/02/27 22:17

>えーと、sNumber.GetBuffer(10)の部分は、


>GetWindowTextで得られた文字を10文字分取ってくる
>とか言う解釈であってるでしょうか?

惜しいです。
str.GetBuffer(n)は、CString 型のオブジェクトからNULLで終端された文字列を「最低nバイトで、全体が入る大きさのバッファサイズで」取り出してきます。ですから、20バイト入った文字列で10と指定しても、20バイト分出てきます。(正確には終端の0も入るので21バイトですが…)

自動で長さが変わるなら最初から指定しなくてもいいのでは?という気もしますが、プログラム上伸び縮みしてもこの長さは超えないだろうという値を指定しておけば、メモリが最も効率的に使えるため敢えて指定させているのだろうと思います。(CString の中身を見ていないので間違っているかも知れませんが)

指定する値が小さすぎると、メモリの再割り当てが起きてメモリの断片が出来て効率が悪いし、大きすぎると使われない領域が出来て効率が悪いという事です。
まぁ、電卓プログラムに表示する桁数を何桁にするのか?によりますが、10はちょっと少ないかな。もう少し長めでもいいかも知れません。
まぁ、多少長くても短くても電卓プログラム程度では効率なんて殆ど関係しませんから、ご安心を。
    • good
    • 0
この回答へのお礼

へぇー、勉強になりました。自動で取り出してくれるなんて便利ですね、いろいろ応用できそうです。ありがとうございました。

お礼日時:2005/03/01 18:19

整数部分を入力してるときは元の数を10倍して押されたボタンを足せばいい。


小数部分だったら何桁目まで入力してるかを変数に入れておいてそれで割ったのを足せばいい。

こんな感じで昔作ったことがあります。
多々改良しなければならない点(.を2回押されたときの対策とか)がありますが参考にはなるでしょう。

if(input=='.') {
dec=10;
return;
}elsif((input>='0')&&(input<='9'))
{
if(!dec){
n=n*10+input-'0';
}else{
n+=input-'0'/dec;
dec*=10;
}
return;
}
    • good
    • 0
この回答へのお礼

うーん、なるほど、小数部分の計算のコードも早速書いてみます。ありがとうございました。

お礼日時:2005/03/01 18:24

ダイアログベースのアプリケーションだと仮定して…、



先ず、ダイアログエディタでエディットボックスを右クリックしてメンバ変数の追加で、CEdit 型の変数を例えば m_cDisplay という形で追加します。

続いて、ダイアログエディタでボタンを配置し、Captionを「1」とかにして、右クリックのイベントハンドラの追加で、ハンドラを追加して、ハンドラとして
{
  CString sNumber;
  m_cDisplay.GetWindowText(sNumber);
  sNumber.Format("%d", atoi(sNumber.GetBuffer(10))*10 + 1);
  m_cDisplay.SetWindowText(sNumber);
}
とかいう形で書いていけば、所望の機能は実現できると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます、出来ました。
えーと、sNumber.GetBuffer(10)の部分は、GetWindowTextで得られた文字を10文字分取ってくるとか言う解釈であってるでしょうか?

お礼日時:2005/02/27 22:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!