poner para papel fondo espacio como colores color codigo cambiar c++ windows winapi mfc win32gui

c++ - para - ¿Cómo cambiar el color de fondo de SysDateTimePick32 o CDateTimeCtrl?



como cambiar el color de fondo de layout en autocad (1)

Parece que no puedo cambiar el color de fondo de un control SysDateTimePick32 (blanco en este caso):

en mi aplicación Win32 / MFC.

Primero intenté reemplazar el mensaje de notificación de OnCtlColor en la ventana principal, que ni siquiera se llamó.

Luego intenté un enfoque de subclases descrito aquí , que se llamó correcto, pero el control no cambió visualmente. (Hice mis pruebas en la máquina con Windows 8.1.)

Entonces, ¿alguien tiene idea de cómo hacerlo?

PD. Necesito que esto funcione en Windows XP y hasta.


No estoy seguro de cuán pirata es la siguiente solución, pero parece funcionar para una solución rápida hasta que alguien sugiera una mejor. De nuevo, está basado en este código , y también requiere Windows Vista o un sistema operativo más reciente:

//Called from a subclassed WndProc case WM_PAINT: { PAINTSTRUCT ps; ::BeginPaint(hWnd, &ps); //Render control RenderWithBkgndColor(hWnd, ps.hdc, RGB(255, 0, 0)); ::EndPaint(hWnd, &ps); return 0; } void RenderWithBkgndColor(HWND hWnd, HDC hDC, COLORREF clrBkgnd) { //Render control with the background color //''clrBkgnd'' = color for the background (if control is enabled) //SOURCE: // http://comp.os.ms-windows.programmer.win32.narkive.com/0H8cHhw1/setting-color-for-sysdatetimepick32-control RECT rect; ::GetWindowRect(hWnd, &rect); ::MapWindowPoints(NULL, hWnd, (LPPOINT)&rect, 2); long nWidth = rect.right - rect.left, nHeight = rect.bottom - rect.top; HDC hDCMem = ::CreateCompatibleDC(hDC); HBITMAP hBitmap = ::CreateBitmap(nWidth, nHeight, ::GetDeviceCaps(hDC, PLANES), ::GetDeviceCaps(hDC, BITSPIXEL), (const void *) NULL); if (hBitmap) { HBITMAP hBitmapOld = (HBITMAP)::SelectObject(hDCMem, hBitmap); //Render control itself ::SendMessage(hWnd, WM_PRINT, (WPARAM)hDCMem, PRF_CLIENT | PRF_CHILDREN | PRF_NONCLIENT); //Only if we have the color if(clrBkgnd != NULL) { //Only if control is enabled if((::GetWindowLongPtr(hWnd, GWL_STYLE) & (WS_VISIBLE | WS_DISABLED)) == (WS_VISIBLE | 0)) { #define ALLOWED_DIFF 20 DWORD dwBkgClr = ::GetSysColor(COLOR_WINDOW); //0xFFFFFF; DWORD br0 = dwBkgClr & 0xFF; DWORD br1 = (dwBkgClr & 0xFF00) >> 8; DWORD br2 = (dwBkgClr & 0xFF0000) >> (8 * 2); for(int y = 0; y < nHeight; y++) { for(int x = 0; x < nWidth; x++) { COLORREF clrPxl = ::GetPixel(hDCMem, x, y); DWORD r0 = clrPxl & 0xFF; DWORD r1 = (clrPxl & 0xFF00) >> 8; DWORD r2 = (clrPxl & 0xFF0000) >> (8 * 2); int nDiff_r0 = r0 - br0; int nDiff_r1 = r1 - br1; int nDiff_r2 = r2 - br2; if(abs(nDiff_r0) < ALLOWED_DIFF && abs(nDiff_r1) < ALLOWED_DIFF && abs(nDiff_r2) < ALLOWED_DIFF) { ::SetPixel(hDCMem, x, y, clrBkgnd); } } } } } ::BitBlt(hDC, rect.left, rect.top, nWidth, nHeight, hDCMem, 0, 0, SRCCOPY); ::SelectObject(hDCMem, hBitmapOld); ::DeleteObject(hBitmap); } ::DeleteDC(hDCMem); }