トップページ > プログラム > 2014年12月09日 > n+vQrxZr

書き込み順位&時間帯一覧

6 位/191 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000001301100208



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Win32API質問箱 Build118

書き込みレス一覧

Win32API質問箱 Build118
972 :デフォルトの名無しさん[sage]:2014/12/09(火) 15:32:03.40 ID:n+vQrxZr
ダイアログにDateTimePickerコントロール(プルダウンでカレンダー表示)を貼り付けて使ってますが、
プルダウン中に日付を変更したときにDTN_DATETIMECHANGEが来ます。

この際、指定した日付範囲を超えていたら警告メッセージボックスを表示したいのですが、
メッセージボックス表示の直後にDTN_DATETIMECHANGEがまた飛んできてメッセージボックスが表示、
以降ずっとメッセージボックス増殖の憂き目に遭います。

これはWinXPで確認される現象で、Win8では起こりません。Win8ではDateTimePickerのプルダウン表示が
メッセージボックス表示時に消えるためです。XPではプルダウンされたままです。

この問題を回避するため、WinXPでメッセージボックス表示のタイミングでDateTimePickerのプルダウン
を止めさせたいのですが、何か方法は無いですか?
Win32API質問箱 Build118
975 :デフォルトの名無しさん[sage]:2014/12/09(火) 16:45:43.53 ID:n+vQrxZr
DTN_DATETIMECHANGEを処理中、SetFocusをしてもメッセージボックス表示が
優先されて解決できません。WM_NEXTDLGCTLももちろんダメ。

そもそもはDTN_DATETIMECHANGEを一旦処理終了させないとダメみたいです。
サブクラス化している場合だと、DefSubclassProcなりCallWindowProcなり
使えば解決できそうな部類ですが、ダイアログプロシージャの場合は
代替APIはないでしょうか?

これがない場合、一旦WM_APPでも投げて再処理するしか無さそうですね。
Win32API質問箱 Build118
977 :デフォルトの名無しさん[sage]:2014/12/09(火) 16:58:23.57 ID:n+vQrxZr
すみません。寝ぼけてました。DefDlgProcがありましたね。

しかし使い方が悪いのか、これでは解決できませんでした。(沈黙の後落ちる)

WM_APPを投げてとりあえず永久ループは回避できましたが、なぜか
DTN_DATETIMECHANGEがもう一回だけ余計に飛んできてしまって
メッセージボックス表示が2回されてしまいます。

もっとスマートな実装方法は無いものか・・・・・
Win32API質問箱 Build118
978 :デフォルトの名無しさん[sage]:2014/12/09(火) 16:59:14.30 ID:n+vQrxZr
>>976
ああ、そうか。単にフラグで多重表示制御できますね。
ありがとうございました。
Win32API質問箱 Build118
982 :デフォルトの名無しさん[sage]:2014/12/09(火) 18:31:36.52 ID:n+vQrxZr
>>981
まさにその通りです。

>>980
DateTime_SetRangeというのを見つけたので、これでいけそうだと試してみました。

Win8では選択できないところは見えなくなっているので、これはこちらの方がいい感じですが、
WinXPでは選択できないもののカレンダーは見えているので、単にクリックしても無反応
なだけになってしまい、仕様を知らないユーザーからするとなんで無反応なのか
分からずバグ扱いしてきそうなUIになってしまいました。

>>976
フラグ制御してみましたが、>>977と同じような挙動になってしまいました。(メッセージボックス2回表示)
Win32API質問箱 Build118
985 :デフォルトの名無しさん[sage]:2014/12/09(火) 19:14:10.30 ID:n+vQrxZr
>>984
そう思って色々追いかけましたが、DateTimePickerで日付を変更すると、
WinXPではDTN_DATETIMECHANGEが2回来てしまいます。
メッセージボックス云々は本質的に関係ない気がしました。

ちなみにWin8では1回しか来ません。

case IDC_DATE:
if (lpstNmHdr->code == DTN_DATETIMECHANGE && !bShowMsg) {
  // DateTimePickerから日時を取得
SendDlgItemMessage(hwnd, IDC_DATE, DTM_GETSYSTEMTIME, 0, (LPARAM)&date);

  ※ログ出力埋め込み

  if (日付判定でOK) {
何らかの処理;

// NG処理
  } else {
    bShowMsg = TRUE;
    MessageBox(hwnd, "ダメヨダメダメ", "error", MB_OK);
    日付を本日に戻す
    bShowMsg = FALSE;
  }
}

ログを出してチェックしましたが、なんで2回来るんでしょう?
MessageBoxやbShowMsgフラグを削除してももちろん変わりありません。

数ms以内の連続処理は受け付けないという処理でも入れたらいいのかな。
Win32API質問箱 Build118
994 :デフォルトの名無しさん[sage]:2014/12/09(火) 22:03:00.10 ID:n+vQrxZr
>>986
素で組むと後者、これを抑制するために多重表示フラグを入れて前者、
という感じになります。

試行錯誤を繰り返しましたが、>>985のように制御した場合、
カレンダーの特定日付を選んだ場合は2回表示で治まりますが、
月を変更した場合(「<」「>」部分)だと、メッセージボックス
を表示中に後ろでどんどんカレンダーのみ切り替わって永久ループになります。

>>987
設計思想にもかかわってきますが、ツールチップは使わない方向で
作っています。フリーソフトならもっと簡潔にまとめたいと思いますが、
自分のミスで操作してるの疑わない人が相手だったりしますので、
あえて面倒な確認メッセージ表示にしています。

>>988
Win7でも2回ですか。情報ありがとうございます。
XPだけかな〜と漠然と思ってましたが、もうちょっと本腰入れて対応してみます。
Win32API質問箱 Build118
995 :デフォルトの名無しさん[sage]:2014/12/09(火) 22:04:52.85 ID:n+vQrxZr
>>992
まさに今その日付判定を行ってみたところですが、>>994の現象になってしまいました。
裏でころころ変わる日付がどんどん送られてしまいました。

>>993
探してみます。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。