cdatetimectrl编辑短期格式
CDateTimeCtrl editing short year format
如果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;
}
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 编辑单个 YAML 值,而不更新 YAML (YAML CPP) 其余部分的格式
- 如何编辑格式设置以增加换行长度?
- 要求文本编辑,文本格式
- 十进制数字的区域设置感知编辑控件子类化(格式[sign][xxx..][decimal separator][yy.])
- cdatetimectrl编辑短期格式
- 使用 win32 API 向丰富的编辑控件添加格式
- C++ 编辑保持其格式的 php 文件
- 如何从windows编辑控件的格式中删除逗号?(C++)
- 在调试模式下编译时,丰富的编辑控件格式不起作用