Eigene SetDayState-Funktion für Monatskalender bitte Ausprobieren
-
Hi,
Da ich einen Montaskalender brauche wo ich Tage unterschiedlich Colorieren kann, habe ich mir ne eigene Funktion dafür gebaut, die soweit auch (zumindest bei mir WinXP SP2) funzt. Wollte Sie euch mal zeigen und Fragen ob das auf anderen System (Bitte System mitposten!) auch funktioniert oder ob ihr noch etwas verbessern würdet an der Funktion? Also bitte Probiert die Funktion mal aus! Danke.// hwnd - Handle des Monatskalender void MyCalendar::SetDayState(HWND hwnd, int day, COLORREF colour) { MCHITTESTINFO hittest; RECT rc; POINT p; int diff = 0; // Hier kommt noch ne genauere Abfrage :) if(day < 1 || day > 31) return; ZeroMemory(&hittest, sizeof(MCHITTESTINFO)); hittest.cbSize = sizeof(MCHITTESTINFO); // 13 und 52 sind die Koords für die erste Zeile erste Spalte // DayHeight sind die Pixel für eine Zeile. // DayWitdh sind die Pixel für eine Spalte. // Den Tag der 2. Zeile und ersten Spalte herausbekommen. // Erst ab der 2. Zeile kann man sich sicher sein das es der Richtige Monat ist! // In der ersten Zeile sind noch die Tage vom Vormonat. p.x = 13; p.y = 52 + DayHeight; hittest.pt = p; MonthCal_HitTest(hwnd, &hittest); // In hittest.st.wDay ist nun der Tag der 2. Zeile und ersten Spalte // Wieder den "Cursor" auf die 2. Zeile und ersten Spalte setzten rc.left = 17; rc.top = 52 + DayHeight; // kleine Berechnung wo man nun hin muss in der "Matrix" // Also eine Zeile hat immer 7 Spalten deshalb immer im "siebener Rhythmus" überprüfen diff = day - hittest.st.wDay; if( diff < 0 ) { diff += 7; rc.left += DayWitdh * diff; rc.top -= DayHeight; } else if( diff < 7 ) rc.left += DayWitdh * diff; else if( diff < 14 ) { diff -= 7; rc.left += DayWitdh * diff; rc.top += DayHeight; } else if( diff < 21 ) { diff -= 14; rc.left += DayWitdh * diff; rc.top += DayHeight * 2; }else if( diff < 28 ) { diff -= 21; rc.left += DayWitdh * diff; rc.top += DayHeight * 3; }else { diff -= 28; rc.left += DayWitdh * diff; rc.top += DayHeight * 4; } HDC hdc = GetDC(hwnd); SetBkColor(hdc, colour); char buff[5]; sprintf(buff, "%2.0d", day); TextOut(hdc, rc.left, rc.top, buff, strlen(buff)); ReleaseDC(hwnd, hdc); }Hoffe habe sie einigermaßen erklärt.
MfG schirrmie
-
Solltest Du nicht die ürsprüngliche Farbe des DC's, den Du ermittelst (GetDC), wieder herstellen (wegen sauberen Clean-Up) ?! Gibt zwar keine Leaks aber besser ist besser
.PS:
schirrmie schrieb:
void MyCalendar::SetDayState(HWND hwnd, int day, COLORREF colour)Glaube das 'MyCalendar::' ist (jetzt) überflüssig, oder
?
-
Das mit der Farbe werd ich noch machen
Und ja die Klasse hab ich vergessen rauszulöschen hier beim Post. Normalerweise hab ich natürlich auch nicht das man das Handle übergeben muss das hat ja die Klasse aber das ja nebensächlich jetzt. Hast die Funktion denn mal ausprobiert ob das mit den Pixel alles hinkommt und so also ob die auch funktioniert soweit?MfG schirrmie