C++ winapi-日期时间选择器,更改上一个/下一个按钮的大小

C++ winapi-日期时间选择器,更改上一个/下一个按钮的大小,c++,winapi,button,datepicker,size,C++,Winapi,Button,Datepicker,Size,我有以下代码: HWND hwndDP = CreateWindowEx(0, DATETIMEPICK_CLASS, TEXT("DateTime"), WS_BORDER | WS_CHILD | WS_VISIBLE, 20, 50, 400, 60, hDlg, NULL, NULL, NULL); HFONT hFont = CreateFont(40, 0, 0,

我有以下代码:

HWND hwndDP = CreateWindowEx(0,
     DATETIMEPICK_CLASS,
     TEXT("DateTime"),
     WS_BORDER | WS_CHILD | WS_VISIBLE,
     20, 50, 400, 60,
     hDlg,
     NULL,
     NULL,
     NULL);                     
HFONT hFont = CreateFont(40, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Arial");
SendMessage(hwndDP, WM_SETFONT, WPARAM(hFont), TRUE);
这将创建日期时间选择器,如下图所示。如您所见,我更改了字体的大小,因此日期时间选择器的字体更大。我有一个问题,那就是被圈起来的按钮(下一个月/上一个月)不会改变大小,而且很小。是否可以更改此按钮的大小。我需要它,因为我在触摸屏上使用这个日期时间选择器,很难点击这两个按钮


不幸的是,我看不出有什么简单的方法可以改变这一点。这些控件实际上不是真正的按钮-它们只是在窗口上绘制的,日历控件的大小基于
NONCLIENTMETRICS.iScrollHeight
的值-它不允许您更改它们

唯一能改变这一点的方法是全局性的,这将影响系统中的所有滚动条,可能不是您想要做的事情

我给你的一个想法是对控件进行子类化,将你自己的(真实的)按钮控件置于现有控件之上


然后,当您的子类过程收到
WM\u命令
消息表示它们已被单击时,向日历控件发送
WM\u KEYDOWN
消息,用于
VK\u NEXT
VK\u PRIOR
——这些键将使它在两个方向上滚动一个月。

这真是一个有趣的想法。但是,有没有可能有按钮,它是不可见的,但当有人点击它(但不可见),然后发送WM_命令?我有一个想法,就是在某个位置上创建类似区域的东西,如果有人点击这个区域,然后移动下一个或返回。但这是一种比区域更简单的方法吗?@JaroKollár您可以使用一个子类来捕捉区域中的鼠标点击,而无需按钮,但没有可见的迹象表明您可以点击该区域。我猜理论上你可以在一个子类中绘制你自己的按钮,这个子类处理
WM\u PAINT
WM\u PRINTCLIENT
。你需要进行实验,看看各种想法的效果如何。所以我尝试过,但我不知道为什么,当我点击显示日期选择器的箭头时,我捕捉到了WM_LBUTTONDOWN,但当我点击显示的日期时间选择器时,没有WM_LBUTTONDOWN出现。那么,我怎样才能抓住点击?我认为问题在于,我只对显示日期的控件和显示日期选择器的按钮进行了子类化,而不是对日期选择器进行子类化。如何获取该控件的句柄以对其进行子类化?@JaroKollár要检索月历控件的句柄,请向DTP控件发送DTM_GETMONTHCAL消息。这很有效,谢谢。对于其他人,需要在DTN_下拉通知后调用DTM_GETMONTHCALL。