//Ein paar neue Konstanten
const COLORREF BTNBGDISABLED = RGB(0, 0, 0);
const COLORREF BTNFRAMEDISABLED = RGB(0, 60, 160);
const COLORREF TEXTCOLORDISABLED = RGB(0,60, 175);
const int FRAMESIZE = 1;
//Neuer Code, das registrieren der Fensterklasse läuft nach wie vor unverändert ab:
LRESULT CALLBACK ButtonWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC = GetDC(hWnd);
PAINTSTRUCT ps ;
RECT rect ;
char cAButtonText[255];
switch (message)
{
case WM_ENABLE:
{
if(wParam == TRUE) { //Window Enable
GetWindowText(hWnd, cAButtonText, sizeof(cAButtonText)-1); //Text des Fensters ermitteln
GetClientRect (hWnd, &rect); //Button Rechteck ermitteln
DeleteObject(SelectObject(hDC, CreateSolidBrush(BTNBG))); //Normalen ButtonHintergrund einsetzen
DeleteObject(SelectObject(hDC, CreatePen(PS_SOLID, FRAMESIZE, BTNFRAME))); //Normalen Rahmen einsetzen
RoundRect(hDC, 0, 0, rect.right, rect.bottom, 5, 5) ; //Wieder den Button mahlen
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, TEXTCOLOR); //Text Farbe bei Klick
DrawText(hDC, cAButtonText, (int)strlen(cAButtonText), &rect,DT_SINGLELINE | DT_VCENTER | DT_CENTER); //Wieder Text malen
}
else if(wParam == FALSE) { //Window Disable
GetWindowText(hWnd, cAButtonText, sizeof(cAButtonText)-1); //Text des Fensters ermitteln
GetClientRect (hWnd, &rect); //Button Rechteck ermitteln
DeleteObject(SelectObject(hDC, CreateSolidBrush(BTNBGDISABLED))); //Normalen ButtonHintergrund einsetzen
DeleteObject(SelectObject(hDC, CreatePen(PS_SOLID, FRAMESIZE, BTNFRAMEDISABLED))); //Normalen Rahmen einsetzen
RoundRect(hDC, 0, 0, rect.right, rect.bottom, 5, 5) ; //Wieder den Button mahlen
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, TEXTCOLORDISABLED); //Text Farbe bei Klick
DrawText(hDC, cAButtonText, (int)strlen(cAButtonText), &rect,DT_SINGLELINE | DT_VCENTER | DT_CENTER); //Wieder Text malen
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
case WM_SETTEXT:
{
sprintf_s(cAButtonText, sizeof(cAButtonText)-1, "%s", lParam);
GetWindowText(hWnd, cAButtonText, sizeof(cAButtonText)-1); //Text des Fensters ermitteln
ReleaseCapture(); //Maus Capture aus
GetClientRect (hWnd, &rect); //Button Rechteck ermitteln
DeleteObject(SelectObject(hDC, CreateSolidBrush(BTNBG))); //Normalen ButtonHintergrund einsetzen
DeleteObject(SelectObject(hDC, CreatePen(PS_SOLID, FRAMESIZE, BTNFRAME))); //Normalen Rahmen einsetzen
RoundRect(hDC, 0, 0, rect.right, rect.bottom, 5, 5) ; //Wieder den Button mahlen
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, TEXTCOLOR); //Text Farbe bei Klick
DrawText(hDC, cAButtonText, (int)strlen(cAButtonText), &rect,DT_SINGLELINE | DT_VCENTER | DT_CENTER); //Wieder Text malen
InvalidateRect(hWnd, 0, FALSE);
return DefWindowProc (hWnd, message, wParam, lParam);
}
case WM_LBUTTONDOWN :
{
//Im folgenden wird der Button etwas verändert dass er wirklich aussieht als hätte man ihn geklickt ^^
GetWindowText(hWnd, cAButtonText, sizeof(cAButtonText)-1); //Text des Fensters ermitteln
GetClientRect (hWnd, &rect); //Button Rechteck ermitteln
SetCapture(hWnd);
DeleteObject(SelectObject(hDC, CreateSolidBrush(BTNBGONCLICK))); //Background bei Klick einsetzen
DeleteObject(SelectObject(hDC, CreatePen(PS_SOLID, FRAMESIZE, BTNFRAMEONCLICK))); //Pen einsetzen für denButton Rahmen
RoundRect(hDC, 0, 0, rect.right, rect.bottom, 5, 5); //Button mahlen
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, TEXTCOLORONCLICK); //Text Farbe bei Klick
DrawText(hDC, cAButtonText, (int)strlen(cAButtonText), &rect,DT_SINGLELINE | DT_VCENTER | DT_CENTER); //Text platzieren
return 0 ;
}
case WM_LBUTTONUP:
{
RECT rect;
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
GetClientRect(hWnd, &rect);
GetWindowText(hWnd, cAButtonText, sizeof(cAButtonText)-1); //Text des Fensters ermitteln
GetClientRect (hWnd, &rect); //Button Rechteck ermitteln
DeleteObject(SelectObject(hDC, CreateSolidBrush(BTNBG))); //Normalen ButtonHintergrund einsetzen
DeleteObject(SelectObject(hDC, CreatePen(PS_SOLID, FRAMESIZE, BTNFRAME))); //Normalen Rahmen einsetzen
RoundRect(hDC, 0, 0, rect.right, rect.bottom, 5, 5) ; //Wieder den Button mahlen
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, TEXTCOLOR); //Text Farbe bei Klick
DrawText(hDC, cAButtonText, (int)strlen(cAButtonText), &rect,DT_SINGLELINE | DT_VCENTER | DT_CENTER); //Wieder Text malen
ReleaseCapture();
if((yPos < rect.top) || (yPos > rect.bottom) || (xPos > rect.right) || (xPos < rect.left)) {
return 0;
}
SendMessage(GetParent(hWnd), WM_COMMAND, BN_CLICKED, (LPARAM)hWnd); //WM_COMMAND Nachricht an das Parent Window senden
return 0 ;
}
case WM_PAINT :
//Quasi wie bei WM_LBUTTONUP
GetWindowText(hWnd, cAButtonText, sizeof(cAButtonText)-1);
hDC = BeginPaint (hWnd, &ps) ;
GetClientRect (hWnd, &rect);
DeleteObject(SelectObject(hDC, CreateSolidBrush(BTNBG)));
DeleteObject(SelectObject(hDC, CreatePen(PS_SOLID, FRAMESIZE, BTNFRAME)));
RoundRect(hDC, 0, 0, rect.right, rect.bottom, 5, 5) ;
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, TEXTCOLOR);
DrawText(hDC, cAButtonText, (int)strlen(cAButtonText), &rect,DT_SINGLELINE | DT_VCENTER | DT_CENTER);
EndPaint (hWnd, &ps) ;
return 0 ;
}
return DefWindowProc (hWnd, message, wParam, lParam) ;
}