CMonthCalCtrlのGetCurSelの怪について

[戻る]
べーちゃん 2002/05/18(土) 15:07:10
べーちゃんです。

現在、月間予定表より選択された日付を取り出すプログラムを作成しておりますが、
作成途中不思議な現象に見舞われたので質問させてください。

プログラムは単にダイアログボックスに月間予定表を貼り付けただけのシンプルな
プログラムです。

問題はPAGE_UP,PAGE_DOWNキーを使って前月、翌月に移動した時に起きます。
最初にPAGE_UP,PAGE_DOWNキーを入力する前の時点ではGetCurSel()メソッドは
当日を返してくるのですが、入力後なぜか西暦2009年などのとんでもない日付を
返してきます。なお、このとき月間予定表が指している年月日は正常な年月日を
選択表示されています。
(例えば2002/5/18が選択されているとしてPAGE_UPキーを押すと画面は2002/4/18
が選択表示されているのですがGetCurSel()メソッドは2009/8/22を返します)

次にPreTranslateMessage()関数で以下のコードを書き、確認したのですが

    if( pMsg->message == WM_KEYDOWN ) {
        switch (pMsg->wParam) {
        case VK_PRIOR:
        case VK_NEXT:
            if (FromHandle(pMsg->hwnd)->GetDlgCtrlID() == IDC_DLG_CLNDR) {
                CMonthCalCtrl* pMonthSel;
                CTime dtmCur;
                pMonthSel = (CMonthCalCtrl *)GetDlgItem(IDC_DLG_CLNDR);
                pMonthSel->GetCurSel((CTime &)dtmCur);
                AfxMessageBox(dtmCur.Format("%Y-%m-%d %H:%M"));

//               _SYSTEMTIME xDateTime;
//               pMonthSel->GetCurSel(&xDateTime);
//               dtmCur = xDateTime;
            }
            break;
        }
    } 

PAGE_UP,PAGE_DOWNキーが入力された後からはGetCurSel()メソッドは変な値を
返しています。
なお、コメント化していますがCTime型を使わず_SYSTEMTIME型を使えば日付は
正しいものが返ってくることを確認しました。但しこのときも時分秒は
全くでたらめな数字が入っており(7000何時とかの数字が返ってきます)、
CTime型に代入するとやはり代入したCTime型変数は2009年を指すように
なります。

そこで、質問は以下の点です
1.私のプログラムが間違っているためこのような現象が起こるのか。
2.MSDNの記述をみるとGetCurSelメソッドでCTime型を引数にすると
  「現在の日付が返ってくる」、_SYSTEMTIME型を引数にすると
  「現在選択されている日付が返ってくる」。とあるのですが、
  やはりCTime型を使うのはまずいのでしょうか。
  (できれば、取得した日付からCTimeSpan型を利用して計算するため
   CTime型で直接受けたいのですが)
3._SYSTEMTIME型の時分秒を一発で切り捨てる便利なメソッドなどはないので
  しょうか。

もし、ご存知の方がいらっしゃいましたら、どうか知恵を貸してください。
よろしくお願いします。

開発環境:
英:Windows2000ProE(SP2) + VS6.0E(SP5)
日:Windows2000ProJ(SP2) + VS6.0J
#前回、英語版と日本語版で動作が異なったことを踏まえて両方で
試したのですが両方とも同じ結果となりました。

dairygoods 2002/05/20(月) 11:12:10
試してみたところ同じ現象になりました。
とりあえず、次のように回避するしかないですね。

SYSTEMTIME st;
pMonthSel->GetCurSel(&st);
CTime time(st.wYear, st.wMonth, st.wDay, 0, 0, 0);

べーちゃん 2002/05/21(火) 01:14:04
[[解決]]
dairygoodsさん、回答ありがとうございました。べーちゃんです。

>試してみたところ同じ現象になりました。

やっぱり私のプログラムミスで発生した現象ではなかったんですね。
よかった。

>とりあえず、次のように回避するしかないですね。
>
>SYSTEMTIME st;
>pMonthSel->GetCurSel(&st);
>CTime time(st.wYear, st.wMonth, st.wDay, 0, 0, 0);

やはりそうですか。ありがとうございました。

ところでこれってやっぱりバグなんでしょうね。MFCの。

古いスレッドには追加発言できません。