Asked by:
CDateTimeCtrl background

Question
-
Hi ,
I want to set the background color of date picker created using CDateTimeCtrl .How can i do that?
Thank you
- Moved by Sara LiuMicrosoft contingent staff Wednesday, August 5, 2020 9:52 AM
Thursday, July 9, 2020 10:47 AM
All replies
-
If you're taking about the Edit part, a way is to subclass it and handle WM_PAINT (WM_PRINT + TransparentBlt for example to change the background color)
A test :
Thursday, July 9, 2020 11:45 AM -
Yes thank you,But i am using DTS_UPDOWN spin buttons for CDateTimeCtrl and i wouldlike to set background color for it also.Can you help me in it
Thursday, July 9, 2020 5:19 PM -
It is the same thing with DTS_UPDOWN :
Thursday, July 9, 2020 5:36 PM -
Hi,
But WM_PAINT only seems to work for window of picker and it skips the spin button while painting.
Thursday, July 9, 2020 5:59 PM -
The spin button is a child Up-down Control that you can paint too
Test :
- Proposed as answer by Naomi N Thursday, July 9, 2020 7:29 PM
Thursday, July 9, 2020 7:19 PM -
Can you share me the strip of code showing how you did that .That would be a great help
Friday, July 10, 2020 2:35 AM -
I tested quickly in a C++/ Win32 app
I subclassed the controls, handled WM_PAINT only, where I replaced colors with this function (I modified it a bit for the Up-down Control as colors are not uniform)=>
(can also be done with TransparentBlt to avoid the DIB section)
void ReplaceColor(HWND hWnd, COLORREF nOldColor, COLORREF nNewColor) { RECT rect; GetWindowRect(hWnd, &rect); MapWindowPoints(NULL, hWnd, (LPPOINT)&rect, 2); long nWidth = rect.right - rect.left, nHeight = rect.bottom - rect.top; HDC hDC = GetDC(hWnd); HDC hDCMem = CreateCompatibleDC(hDC); int nX = nWidth, nY = nHeight; BITMAPINFO bi = { 0 }; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = nX; bi.bmiHeader.biHeight = nY; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; BYTE *pbBitmap; HBITMAP hBitmap = CreateDIBSection(hDCMem, &bi, DIB_RGB_COLORS, (void**)&pbBitmap, NULL, 0); if (hBitmap) { HBITMAP hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap); SendMessage(hWnd, WM_PRINT, (WPARAM)hDCMem, PRF_CLIENT | PRF_CHILDREN | PRF_NONCLIENT); RGBQUAD *pRGB; LONG nPixels; int nPixelX = 0, nPixelY = 0; for (pRGB = (RGBQUAD *)pbBitmap, nPixels = nX * nY; nPixels > 0; ++pRGB, --nPixels) { ULONG* pSrc = (ULONG*)pRGB; ULONG nRed = GetRValue(*pSrc); ULONG nGreen = GetGValue(*pSrc); ULONG nBlue = GetBValue(*pSrc); if (nRed == GetRValue(nOldColor) && nGreen == GetGValue(nOldColor) && nBlue == GetBValue(nOldColor)) { pRGB->rgbRed = GetRValue(nNewColor); pRGB->rgbGreen = GetGValue(nNewColor); pRGB->rgbBlue = GetBValue(nNewColor); } } BitBlt(hDC, rect.left, rect.top, nWidth, nHeight, hDCMem, 0, 0, SRCCOPY); SelectObject(hDCMem, hBitmapOld); DeleteObject(hBitmap); } DeleteDC(hDCMem); ReleaseDC(hWnd, hDC); }
- Edited by Castorix31 Friday, July 10, 2020 6:04 AM
Friday, July 10, 2020 5:59 AM -
Thank you for previous solution.
Is it possible to change width of spin button.If we can can you show how.
Friday, July 10, 2020 9:11 AM -
Thank you for previous solution.
Is it possible to change width of spin button.If we can can you show how.
Like for any control, with APIs like SetWindowPos
, after having got its handle (I used GetWindow(hDTP, GW_CHILD)) :
Friday, July 10, 2020 9:24 AM -
I tried it but it doesn't seems to work as i want .The icon disappears too .Do you know any other approach.Saturday, July 11, 2020 1:19 PM
-
I tried it but it doesn't seems to work as i want .The icon disappears too .Do you know any other approach.
Which icon ?
You can see in the picture that I could increase the width of the Up-down control with SetWindowPos
(I moved it to left too, as the size is bigger)- Edited by Castorix31 Saturday, July 11, 2020 1:40 PM
Saturday, July 11, 2020 1:25 PM -
Yes ,sizing worked well.
The setting of background color to spin buttons seems to make the icon disappear .
Can you tell me some other approach to it .
Saturday, July 11, 2020 2:32 PM -
I don't see which icon you're talking about
The DateTimePicker control has the Up-Down control as child, which draws arrows with DrawThemeBackground or DrawFrameControl,
(that I colored in red above for the tests, either the background or the arrows, by replacing colors with the ReplaceColor function)Saturday, July 11, 2020 5:01 PM -
Hi ,
I mighthave gone through it wrongly.I am not sure about the subclassing and directly set background in WM_PAINT.Can you show the subclassing concept too.
Thank you
Sunday, July 12, 2020 9:25 AM -
There is nothing different from what I posted, I just handle WM_PAINT
For example, for the DTP control (same thing for the Up-Down control, with another ReplaceColor function to change colors differently) =>BOOL bRet = SetWindowSubclass(hDTP, DTPSubclassProc, 0, 0);
LRESULT CALLBACK DTPSubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { switch (uMsg) { case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(hWnd, &ps); // White => Green //ReplaceColor(hWnd, RGB(255, 255, 255), RGB(0, 255, 0)); ReplaceColor(hWnd, GetSysColor(COLOR_WINDOW), RGB(0, 255, 0)); EndPaint(hWnd, &ps); return 0; } break; } return DefSubclassProc(hWnd, uMsg, wParam, lParam); }
- Edited by Castorix31 Sunday, July 12, 2020 11:20 AM
- Proposed as answer by Tianyu Sun-MSFTMicrosoft contingent staff Tuesday, July 21, 2020 8:11 AM
Sunday, July 12, 2020 11:20 AM