cdatetimectrl编辑短期格式

CDateTimeCtrl editing short year format

本文关键字:格式 编辑 cdatetimectrl      更新时间:2023-10-16

如果CDATETIMECTRL的格式设置为" dd.mm.yy",则日期控制在运行时正确显示,格式为" 05.05.15"

但是,如果用户将光标置于控件的年度部分,则一年从" 15"转换为" 2015"

通过离开年度(例如将光标放置到日间段)从" 2015"重新更改为" 15"

是否有可能暂停?

年度应始终保持在2位数中。

我认为有必要从 CDateTimeCtrl推出这种行为。

实现显示非常简单。我已经实现了CDateTimeCtrl2Digit代替标准组件,例如您必须要做的事情的样本。编辑更为复杂,我做了一个非常简单的。

CDateTimeCtrl2Digit m_DateTime;
m_DateTime.SetFormat( _T("dd.MM.XX"));

格式 XX由cdatetimectrl2digitas作为调用字段管理:

来自msdn:

除了标准格式字符串和身体之外,回调字段 文本,您还可以将显示的某些部分定义为回调 字段。这些字段可用于查询用户以获取信息。到 声明回调字段,包括一个或多个" x"字符(ascii 代码88)格式字符串的任何地方。您可以创建回调字段 通过重复" X"字符具有独特的身份。就这样 格式字符串" xx dddd mmm dd','yyy xxx"包含两个唯一的回调 字段," xx"answers" xxx"。像其他DTP控制字段一样,回调字段 根据其位置以从左到右的顺序显示 格式字符串。当DTP控件解析格式字符串和 遇到回调字段,它发送dtn_format和dtn_formatquery 通知代码。格式字符串元素对应于 通知中包含回调字段,以允许 接收申请确定正在确定哪个回调字段 查询。控件的所有者必须响应这些通知 为了确保正确显示自定义信息。

因此,您必须处理此回调字段,以显示年度两位数和所有特殊编辑。这是一个部分工作的示例:我的意思是所有编辑都缺少,这是一个非常简单的示例(我不处理箭头键,只有数字)。

我在stackoverflow中发布代码很新,所以请原谅我,如果某些东西100%使用,请简单地复制我写的内容!!!

,但这是我所做的:

class CDateTimeCtrl2Digit : public CDateTimeCtrl
{
    DECLARE_DYNAMIC(CDateTimeCtrl2Digit )
public:
    CDateTimeCtrl2Digit ();
    virtual ~CDateTimeCtrl2Digit ();
protected:
    int nDigit;
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnDtnFormat(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnDtnFormatquery(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnDtnWmkeydown(NMHDR *pNMHDR, LRESULT *pResult);
};

和.cpp

#include "stdafx.h"
#include "MFCApplication1.h"
#include "DateTimeCtrl2Digit.h"
#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd), SNDMSG)
#define FORWARD_WM_GETFONT(hwnd, fn) (HFONT)(UINT_PTR)(fn)((hwnd), WM_GETFONT, 0L, 0L)
IMPLEMENT_DYNAMIC(CDateTimeCtrl2Digit , CDateTimeCtrl)
CDateTimeCtrl2Digit ::CDateTimeCtrl2Digit ()
{
    nDigit = 0;
}
CDateTimeCtrl2Digit ::~CDateTimeCtrl2Digit ()
{
}
BEGIN_MESSAGE_MAP(CDateTimeCtrl2Digit , CDateTimeCtrl)
    ON_NOTIFY_REFLECT(DTN_FORMAT, &CDateTimeCtrl2Digit::OnDtnFormat)
    ON_NOTIFY_REFLECT(DTN_FORMATQUERY, &CDateTimeCtrl2Digit::OnDtnFormatquery)
    ON_NOTIFY_REFLECT(DTN_WMKEYDOWN, &CDateTimeCtrl2Digit::OnDtnWmkeydown)
END_MESSAGE_MAP()
void CDateTimeCtrl2Digit ::OnDtnFormat(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMDATETIMEFORMAT pDTFormat = reinterpret_cast<LPNMDATETIMEFORMAT>(pNMHDR);
    COleDateTime dt;
    CDateTimeCtrl::GetTime(dt);
    CString year = dt.Format(_T("%y"));
    _tcscpy_s( pDTFormat->szDisplay, year);
    *pResult = 0;
}
void CDateTimeCtrl2Digit ::OnDtnFormatquery(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMDATETIMEFORMATQUERY pDTFmtQuery = reinterpret_cast<LPNMDATETIMEFORMATQUERY>(pNMHDR);
    HDC hdc;
    HFONT hFont, hOrigFont;
    hdc = ::GetDC(m_hWnd);
    hFont = FORWARD_WM_GETFONT(m_hWnd, ::SendMessage);
    if(!hFont) hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
    hOrigFont = (HFONT)::SelectObject(hdc, hFont);
    ::GetTextExtentPoint32 (hdc, _T("88"), 2, &pDTFmtQuery->szMax);
    ::SelectObject(hdc,hOrigFont);
    ::ReleaseDC(m_hWnd, hdc);
    *pResult = 0;
}
void CMyDateTimeCtrl::OnDtnWmkeydown(NMHDR *pNMHDR, LRESULT *pResult)
{
    COleDateTime oCurTime;
    GetTime(oCurTime);
    int century = static_cast<int>( oCurTime.GetYear() / 100 ) * 100;
    int decade = oCurTime.GetYear() - century;
    LPNMDATETIMEWMKEYDOWN pDTKeyDown = reinterpret_cast<LPNMDATETIMEWMKEYDOWN>(pNMHDR);
    if( ( pDTKeyDown->nVirtKey >= 48 ) && ( pDTKeyDown->nVirtKey <= 57 ) )
    {
        if( nDigit == 0 )
        {
            nDigit = 1;
            pDTKeyDown->st.wYear = century + pDTKeyDown->nVirtKey - 48;
        }
        else 
        {
            nDigit = 0;
            pDTKeyDown->st.wYear = century + decade * 10 + pDTKeyDown->nVirtKey - 48;
        }
    }
    *pResult = 0;
}