CDateTimeCtrlについて

[戻る]
ヤマちゃん 2002/06/05(水) 16:06:53
みなさん、こんにちは。

初めて質問させていただきます。

CDateTimeCtrlについてお聞きしたい事があります。
CDateTimeCtrlの開いたカレンダーをソース上で閉じる
事はできるのでしょうか?(例えば、カレンダー表示後、
10秒後に勝手に消すような処理を行う場合)

何方かご存知の方、ご教授お願い致します。

けみ 2002/06/05(水) 23:30:40
間違っていたらごめんなさい。ESCキーを押すと消えるようなので

試してみたら、PostMessage(WM_LBUTTONDOWN ,ESCAPE ,0);で
メッセージを送ってあげたらうまく消えました。

WM_KEYDOWNの時のlParamの意味が良くわかりませんでしたので0に
しちゃいました。

けみ 2002/06/05(水) 23:32:00
ごめんなさい。
ESCAPE -> VF_ESCAPEです。

けみ 2002/06/05(水) 23:49:12
かさねがさね。すいません。
VF_ESCAPEです。

けみ 2002/06/05(水) 23:56:16
だめです。ひやかしと思われてしまう。

PostMessage(WM_LBUTTONDOWN ,VK_ESCAPE ,0);
です。                      ~~
これを、SetTimer(1,5000,0);として
OnTimer内に配置したらうまく動いていました。



どなたかフォローお願いします。(泣)

ヤマちゃん 2002/06/10(月) 13:42:32
[[解決]]
けみさん、こんにちは。

ご返事遅くなってしまい申し訳ありません。

教えて頂いた方法で動作致しました。

今回は本当にありがとうございました。

また、ご質問する機会があると思いますが
その際は、宜しくお願い致します。

けみ 2002/06/10(月) 14:26:06
なんだか、間違えてばかりですいません。
やっぱりまちがってました。

いろいろと試したりしていたので、ちょっと混ざって
いました。WM_LBUTTONDOWNだとカレンダー上に
マウスカーソルがある時に消えません。そもそも、
BUTTONDOWNとVK_ESCAPEの組み合わせが変ですね。


::PostMessage(m_dtc.m_hWnd , WM_KEYDOWN,VK_ESCAPE,0);
とかにしてPreTranslateMessage内でESCを処理してしまうと
良いかもです。(本当に?)

また、間違っていたらご指摘お願いします。
失礼しました。

EIJI 2002/06/11(火) 19:06:14
解決したのなら同じ質問をした他の掲示板に
「どのように解決したか」を投稿してください。

以下、使用上の注意より引用
>誤ってマルチポストしてしまった場合には、必ず全ての掲示板にどのように
>解決したかを記述し、かつお礼を書き込んで下さい。

n [E-Mail] 2002/06/11(火) 21:22:26
お邪魔します。

やってみました。
DTN_DROPDOWNとDTN_CLOSEUPをオーバーライドして
DTN_DROPDOWNハンドラにSetTimer(id,時間,NULL)、
DTN_CLOSEUPハンドラにKillTimer(id)を置き、
そしてOnTimer()は以下のようにすると、うまくいきました。

void CxxxDlg::OnTimer(UINT)
{
 ::KillTimer();
 CMonthCalCtrl* pmc = m_datetime.GetMonthCalCtrl();
 if ( NULL != pmc )
  pmc->PostMessage( WM_COMMAND, DTN_CLOSEUP );
}

最初WM_CLOSEで試したのですが、時刻が来て表示は消えるんですが
DTN_CLOSEUPが送られず、ダイアログ上をクリックするとやっと送られてきました。
私にはまだ理由がわかりません...。

けみ 2002/06/11(火) 22:09:54
フォローありがとうございます。

私は、ダイアログベースで、KillTimerを入れていなかったので
次のOnTimerでESCを送信して?、プログラムが終わってしまうため
ESCの処理を入れていました。
そうですね。Timer止めちゃえばいいんですね。
ありがとございます。


解決しててアレなのですが、私のようなやり方って
まずいのでしょうか?(WM_KEYDOWN,VK_ESCAPE送る方法)

n [E-Mail] 2002/06/11(火) 23:29:45
う〜んどうなんでしょう?
私はとりあえず全部のDTN_XXXをオーバーライドしてみたんですが、
(全部のハンドラにTRACE文を付けて)

WM_COMMAND,DTN_CLOSEUPだと:
 DTN_DROPDOWN
 // WM_COMMAND,DTN_CLOSEUP
 DTN_CLOSEUP

WM_KEYDOWN,VK_ESCAPEだと:
 DTN_DROPDOWN
 // WM_KEYDOWN,VK_ESCAPE
 DTN_DATETIMECHANGE <-ココ
 DTN_CLOSEUP

このように間に一つ挟まってきました。

思うにKEYDOWNでこうなるのは、「ユーザが何か入力した」という意味であり、
CDateTimeCtrlを実装した人の考え方が「ユーザが何か入力したんだから、
DTN_DATETIMECHANGEで処理させよう」ということなんだと思います。
そうするとCOMMANDの方がよさそうですが、「キャンセルの時はCLOSEUPだ」
という記述をMSDNで見つけたわけではないので断言できません...。

けみ 2002/06/12(水) 00:11:10
>WM_KEYDOWN,VK_ESCAPEだと:
> DTN_DROPDOWN
> // WM_KEYDOWN,VK_ESCAPE
> DTN_DATETIMECHANGE <-ココ
> DTN_CLOSEUP

コントロールを貼り付けただけの状態でESCキーを
押したらうまく動いたので、単純にESCを送るという
発想になったのですが、

>(全部のハンドラにTRACE文を付けて)

これってかなり有効そうですね。気がつきませんでした。
他のコントロールも色々と調べられそうです。
明日試してみます。
メッセージが多いと書くのが大変そうですけど。(笑)

大変勉強になりました。ありがとうございます。



#誤字・脱字が多くスレッドを見苦しくてしてしまい
#申し訳ありませんでした。今後気をつけます。

#今回は、誤字ないですよね.....。

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