DateTimePickerのカレンダーコントロールの置換

[戻る]
ほえほえむー 2010/03/04(木) 13:30:27
お世話になります。
WinXP Pro SP3 / VC6 MFC(APP・ダイアログベース)です。

DateTimePickerのドロップダウンで表示されるカレンダーを
CStaticから派生させた自作のカレンダーコントロールに
置き換えたいと思っています。

全部オーナードローをすればある程度のものはできるのですが、
DateTimePickerコントロールのMaskedTextBoxのような動作を
実装するのがとても大変です。
そのため、日付の表示部分はDateTimePickerのものをそのまま使い、
ドロップダウンのカレンダーだけを自作コントロールに
置換できればいいなと思っているのですが、可能なのでしょうか。

もし可能だとすればどのようにすればいいのか
教えていたますでしょうか。

よろしくお願い致します。

にーに 2010/03/04(木) 18:43:51
PreTranslateMessage内でクリックした位置が取得できるので
自作コントロールがうまいこと起動できるようにしてみては
どうでしょう。
テキスト部に表示されている日付の受け渡しとか
自作カレンダー部のフォーカスが外れた時の処理とか
色々ありそうですけど。

BOOL ChogehogeDlg::PreTranslateMessage(MSG* pMsg) 
{
    POINTS pnt;
    CRect rect;
    int limit;

    if(pMsg->hwnd == m_date.m_hWnd ){
        if(pMsg->message == WM_LBUTTONDOWN ) {
            m_date.GetWindowRect(rect);
            m_date.ScreenToClient(rect);
            pnt = MAKEPOINTS(pMsg->lParam);
            limit = rect.right - 
                        (::GetSystemMetrics(SM_CYVSCROLL) 
                        +::GetSystemMetrics(SM_CXEDGE));

            if( limit <= pnt.x) {
                TRACE("カレンダー部分\n");
                return TRUE;
            }
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

#SM_CXEDGE使いましたけど、コントロールが3Dじゃない時の処理なんかも
#必要かもしれません。

にーに 2010/03/04(木) 19:01:47
追記です。キーボード操作 「alt + ↓」なんかも
対応しないと駄目ですね。

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