【发布时间】:2015-02-14 02:32:33
【问题描述】:
我已为我的应用程序启用视觉样式:
#pragma comment( linker, "/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
language='*'\"")
我可以通过以下方法在编辑控件中设置日期字体:
HFONT hf = (HFONT)SendMessage(hwndDateTimePicker, WM_GETFONT, (WPARAM)0, (LPARAM)0);
if (hf != NULL)
{
LOGFONT lf = { 0 };
GetObject(hf, sizeof(LOGFONT), &lf);
lf.lfWeight = FW_BOLD;
lf.lfUnderline = TRUE;
hf = CreateFontIndirect(&lf);
SendMessage(GetDlgItem(hDlg, IDC_DATETIMEPICKER1), WM_SETFONT
(WPARAM)hf, (LPARAM)TRUE);
}
但是,尝试使用GetDC 和SetTextColor(例如)不起作用。
下图说明了我的目标(颜色变为黄色)。
我已经尝试对控件进行子类化,但 tjat 失败了。这是代码,以防您发现错误:
LRESULT CALLBACK Decimalni(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (message)
{
case WM_CTLCOLOREDIT:
return (LRESULT)((HBRUSH)GetStockObject(GRAY_BRUSH));
case WM_NCDESTROY:
::RemoveWindowSubclass(hwnd, Decimalni, 0);
return DefSubclassProc(hwnd, message, wParam, lParam);
break;
}
return ::DefSubclassProc(hwnd, message, wParam, lParam);
}
// in WM_INITDIALOG
SetWindowSubclass(hwndDTP, Decimalni, 0, 0 );
问题:
我的问题有解决方法吗?
也许有一种方法可以获取编辑控件的句柄并将其子类化,例如?只是一个想法......
编辑:
这是我能做到的最好的:
// subclass procedure for date time picker
LRESULT CALLBACK DTP(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (message)
{
case WM_PAINT:
{
PAINTSTRUCT ps = { 0 };
HDC hdc = BeginPaint(hwnd, &ps);
RECT rcClient = { 0 };
GetClientRect(hwnd, &rcClient);
// Fill client area with desired brush, I used light gray as an example
FillRect(hdc, &rcClient, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
BITMAPINFO bmi;
// Create a memory DC
HDC memDC = CreateCompatibleDC(hdc);
// Create a DIB header for parent
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = rcClient.right - rcClient.left;
bmi.bmiHeader.biHeight = rcClient.bottom - rcClient.top;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
// Create a DIB bitmap
HBITMAP tempBmp = CreateDIBSection(0, &bmi, DIB_RGB_COLORS, 0, 0, 0);
// Select tempBmp onto DC to force size and DIB change on the DC
HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, tempBmp);
// Okay get datetime picker to draw on our memory DC
DefSubclassProc(hwnd, WM_PRINTCLIENT, (WPARAM)memDC, (LPARAM)(PRF_CLIENT));
// Transfer the memory DC onto datetime picker DC excluding default white color
TransparentBlt(hdc, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
memDC, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, GetSysColor(COLOR_WINDOW));
// cleanup
SelectObject(memDC, oldBmp);
DeleteObject(tempBmp);
DeleteDC(memDC);
EndPaint(hwnd, &ps);
}
return 0L;
case WM_NCDESTROY:
::RemoveWindowSubclass(hwnd, DTP, 0);
return DefSubclassProc(hwnd, message, wParam, lParam);
}
return ::DefSubclassProc(hwnd, message, wParam, lParam);
}
在主窗口/对话框中,只需子类化 DateTime 选择器:
SetWindowSubclass(hwndOfYourDateTimePicker, DTP, 0, 0);
新问题:
- 您会注意到下拉按钮在视觉上并不吸引人。有没有办法纠正这个问题?
- ClearType 字体可能会产生一些伪像,有没有办法解决这个问题?
【问题讨论】:
-
当你说要设置控件的背景时,你是什么意思?是否要将折叠的编辑控件设为红色?或者你想让实际的日历变成红色吗?或者是其他东西?没有视觉样式也能工作吗?
-
你可以尝试继承日历控件并处理
WM_CTLCOLOREDIT。 -
@andlabs:你说要设置控件的背景,是什么意思?是否要将折叠的编辑控件设为红色?或者你想让实际的日历变成红色吗?还是别的什么? 请参阅我编辑过的帖子中的图片。 没有视觉样式也能工作吗? 我误读了我在帖子中提到的宏的文档。不存在可以满足我需要的消息/通知/宏。我已编辑问题以消除混淆。
-
@JonathanPotter 会继承 日历控件 吗?我以为
WM_CTLCOLOREDIT已发送到 DTP 本身的父级 -
@JonathanPotter:我尝试过但失败了。你能看到我在编辑中发布的短代码吗?也许我做错了什么...谢谢。
标签: c++ c winapi datepicker