CDateTimeCtrlについて – プログラミング – Home

通知
すべてクリア

[解決済] CDateTimeCtrlについて


ヤマちゃん
 ヤマちゃん
(@ヤマちゃん)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

みなさん、こんにちは。

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

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

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


引用未解決
トピックタグ
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

間違っていたらごめんなさい。ESCキーを押すと消えるようなので

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

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


返信引用
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

ごめんなさい。
ESCAPE -> VF_ESCAPEです。


返信引用
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

かさねがさね。すいません。
VF_ESCAPEです。


返信引用
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

だめです。ひやかしと思われてしまう。

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

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


返信引用
ヤマちゃん
 ヤマちゃん
(@ヤマちゃん)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

けみさん、こんにちは。

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

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

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

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


返信引用
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

なんだか、間違えてばかりですいません。
やっぱりまちがってました。

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

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

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


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 25年前
投稿: 76
 

解決したのなら同じ質問をした他の掲示板に
「どのように解決したか」を投稿してください。

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


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

お邪魔します。

やってみました。
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が送られず、ダイアログ上をクリックするとやっと送られてきました。
私にはまだ理由がわかりません...。


返信引用
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

フォローありがとうございます。

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

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


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

う~んどうなんでしょう?
私はとりあえず全部の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で見つけたわけではないので断言できません...。


返信引用
けみ
 けみ
(@けみ)
ゲスト
結合: 23年前
投稿: 22
 

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

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

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

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました