みなさん、こんにちは。
初めて質問させていただきます。
CDateTimeCtrlについてお聞きしたい事があります。
CDateTimeCtrlの開いたカレンダーをソース上で閉じる
事はできるのでしょうか?(例えば、カレンダー表示後、
10秒後に勝手に消すような処理を行う場合)
何方かご存知の方、ご教授お願い致します。
間違っていたらごめんなさい。ESCキーを押すと消えるようなので
試してみたら、PostMessage(WM_LBUTTONDOWN ,ESCAPE ,0);で
メッセージを送ってあげたらうまく消えました。
WM_KEYDOWNの時のlParamの意味が良くわかりませんでしたので0に
しちゃいました。
ごめんなさい。
ESCAPE -> VF_ESCAPEです。
かさねがさね。すいません。
VF_ESCAPEです。
だめです。ひやかしと思われてしまう。
PostMessage(WM_LBUTTONDOWN ,VK_ESCAPE ,0);
です。 ~~
これを、SetTimer(1,5000,0);として
OnTimer内に配置したらうまく動いていました。
どなたかフォローお願いします。(泣)
けみさん、こんにちは。
ご返事遅くなってしまい申し訳ありません。
教えて頂いた方法で動作致しました。
今回は本当にありがとうございました。
また、ご質問する機会があると思いますが
その際は、宜しくお願い致します。
なんだか、間違えてばかりですいません。
やっぱりまちがってました。
いろいろと試したりしていたので、ちょっと混ざって
いました。WM_LBUTTONDOWNだとカレンダー上に
マウスカーソルがある時に消えません。そもそも、
BUTTONDOWNとVK_ESCAPEの組み合わせが変ですね。
::PostMessage(m_dtc.m_hWnd , WM_KEYDOWN,VK_ESCAPE,0);
とかにしてPreTranslateMessage内でESCを処理してしまうと
良いかもです。(本当に?)
また、間違っていたらご指摘お願いします。
失礼しました。
解決したのなら同じ質問をした他の掲示板に
「どのように解決したか」を投稿してください。
以下、使用上の注意より引用
>誤ってマルチポストしてしまった場合には、必ず全ての掲示板にどのように
>解決したかを記述し、かつお礼を書き込んで下さい。
お邪魔します。
やってみました。
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が送られず、ダイアログ上をクリックするとやっと送られてきました。
私にはまだ理由がわかりません...。
フォローありがとうございます。
私は、ダイアログベースで、KillTimerを入れていなかったので
次のOnTimerでESCを送信して?、プログラムが終わってしまうため
ESCの処理を入れていました。
そうですね。Timer止めちゃえばいいんですね。
ありがとございます。
解決しててアレなのですが、私のようなやり方って
まずいのでしょうか?(WM_KEYDOWN,VK_ESCAPE送る方法)
う~んどうなんでしょう?
私はとりあえず全部の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で見つけたわけではないので断言できません...。
>WM_KEYDOWN,VK_ESCAPEだと:
> DTN_DROPDOWN
> // WM_KEYDOWN,VK_ESCAPE
> DTN_DATETIMECHANGE <-ココ
> DTN_CLOSEUP
コントロールを貼り付けただけの状態でESCキーを
押したらうまく動いたので、単純にESCを送るという
発想になったのですが、
>(全部のハンドラにTRACE文を付けて)
これってかなり有効そうですね。気がつきませんでした。
他のコントロールも色々と調べられそうです。
明日試してみます。
メッセージが多いと書くのが大変そうですけど。(笑)
大変勉強になりました。ありがとうございます。
#誤字・脱字が多くスレッドを見苦しくてしてしまい
#申し訳ありませんでした。今後気をつけます。
#今回は、誤字ないですよね.....。