Ownerdraw von Staic-Frames
-
Hi,
ich möchte einen Static-SS_GRAYFRAME selber "zeichen". Leider funktioniert das nicht so, wie ich es möchte:
case WM_DRAWITEM: if(static_cast<DWORD>(GetWindowLongPtr(reinterpret_cast<DRAWITEMSTRUCT*>(LParam)->hwndItem, GWL_STYLE)) & SS_GRAYFRAME) { for(i=reinterpret_cast<DRAWITEMSTRUCT*>(LParam)->rcItem.left;i<=reinterpret_cast<DRAWITEMSTRUCT*>(LParam)->rcItem.right;i++) { for(j=reinterpret_cast<DRAWITEMSTRUCT*>(LParam)->rcItem.top; j<=reinterpret_cast<DRAWITEMSTRUCT*>(LParam)->rcItem.bottom;j++) { SetPixel(GetDC(hWnd), i, j, RGB(210, 210, 210)); } } } break;Es wird einfach gar nichts gezeichnet. Der Bereich, wo eigentlich der Rahmen (bzw. in meinem Fall das Rechteck) sein müsste, bleibt Transparent.
Hat jemand eine Idee, was falsch ist?
Danke,
Chrissi
-
Wartet mal. Ich glaube, ich habe den Fehler selbst jetzt gefunden!
-
Es wäre von allgemeinem Nutzen wenn du auch noch verraten würdest, was zur Lösung deines Problems geführt hat. Meinst du nicht auch?
-
Ja, meine ich auch.

Leider habe ich gar keine Lösung. Es war gerade eben eher so ein Gedanke.
Erstmal SetPixel ist sch... . SetPixel ist eine unglaublich langsame Funktion, und nach jedem Aufruf von SetPixel wird das Fenster neu gezeichnet (glaube ich). Also bringt SetPixel nicht so viel. (Von der Performance her)
Einfacher wäre es wohl mit PatBlt oder FillRect, aber leider funktioniert das nicht, und ich habe keine Ahnung warum.
Mein Code:
if(!FillRect(GetDC(hWnd), &reinterpret_cast<DRAWITEMSTRUCT*>(LParam)->rcItem, g_hBrush)) WINAPI_ERR("!FillRect", -1);Der Bereich, wo eigentlich das graue Rechteck sein sollte ist Transparent...
Weiß jemand, woran das liegen könnte,
danke,
Chrissi
-
Probier mal mit der folgenden Funktion herauszufinden was Windows selbst über den Fehler, der durch den Aufruf dieser Funktion auftritt, sagt:
void ErrorMsgBox() { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONERROR ); LocalFree( lpMsgBuf ); }Oder wird FillRect eh erfolgreich ausgeführt?
Noch eine Frage: Ist g_hBrush gültig`? Was weist du ihr zu?
-
Nee,
GetLastError() ist 0 (sonst würde ein ASSERT-Makro "aufgerufen"), und der Brush ist damit gülltig.
Den Brush Initallisiere ich so:
g_hBrush = CreateSolidBrush(RGB(230, 230, 230)); if(!g_hBrush) WINAPI_ERR("!g_hBrush", -1);Ich hoffe auf Hilfe,
Danke,
Chrissi
-
Naja, vielleicht kann man mein Problem auch anders Lösen.
Eigentlich möchte ich erreichen, dass der Innenteil eines Frames (also das, was zwischen den 4 Frame-Linien ist) transparent wird. Leider funktioniert das durch das Abfangen der Nachrichten WM_CTL_COLORSTATIC und dem Setzen von SetBkMode(TRANSPARENT) nicht. Warum weiß ich nicht, da es bei ganz normalen Static-Labels funktioniert.
Wenn ich erreichen könnte, das der Innenteil des Frames transparent wird, bräuchte ich mich nicht mehr mit den ganzen Gdi-Funktionen herumzuschlagen und das Problem wäre gelöst.
Danke,
Chrissi