WinApi Fenster Hintergrundfarben
-
Hallo an alle !
Ich habe gerade anhand der Winapi Totorials auf Winapi.de mein erstes Fenster mit inem Button programmiert.
Es ist noch nicht alles 100% verständlich für mich da ich grade neu einsteige in die Gui Programmierung , das meiste jedoch ist für mich verständlich.Nun zu meiner Frage.
Wie kann ich mir eine bestimmte Hintergrundfarbe für mein "Hauptwindow" einstellen?
Ich habe mir die Msdn doku zur GetStockObject Funktion welche im Beispiel verwendet wurde angesehen http://msdn.microsoft.com/en-us/library/windows/desktop/dd144925(v=vs.85).aspx ,dort kann ich aber nur zwischen bestimmten Hintergrundarten wählen welche nur grau ,weiß,oder schwarz sind.Wie kann ich mir jetzt z.B. aber einen grünen oder gelben Hintergrund erstellen ?Mein Quellcode sieht bis jetzt wie folgt aus :
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; const char szAppName[] = "Windows Buttons"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* X-Position auf dem Monitor */ CW_USEDEFAULT, /* Y-Position auf dem Monitor */ 350, /* Fensterbreite */ 300, /* Fensterhoehe */ NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hButton; switch (message) { case WM_CREATE: { hButton = CreateWindow( "button", "Button1", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_SIZE: { MoveWindow(hButton,30,220,100,20, TRUE); return 0; } case WM_COMMAND: { if (lParam == (LPARAM)hButton) { if (HIWORD(wParam) == BN_CLICKED) MessageBox(hWnd,"Button wurde geklickt","Juhu",NULL); } return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
-
...
-
Swordfish schrieb:
rtfm?
WNDCLASS structure (Windows)MSDN schrieb:
hbrBackground
Type: HBRUSH
A handle to the class background brush. This member can be a handle to the physical brush to be used for painting the background [...]Ja da war ich auch schon ich kann leider nicht soo besonders gut Englisch und verstehe manche Worte dort nicht.
Ich verstehe einfach nicht woher ich die Farbenvalues bekomme...
-
Mit CreateSolidBrush und als parameter ein wert (HCOLORREF) den du mit dem Makro RGB(r,g,b) erstellen kannst, bekommst du jede Farbe hin.
r,g und b liegen zwischen 0 und 255.
-
floorball schrieb:
Mit CreateSolidBrush und als parameter ein wert (HCOLORREF) den du mit dem Makro RGB(r,g,b) erstellen kannst, bekommst du jede Farbe hin.
r,g und b liegen zwischen 0 und 255.Ich danke dir vielmals hat einwandfrei funktioniert
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; const char szAppName[] = "Windows Buttons"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) CreateSolidBrush( COLORREF RGB(100,20,50)) ; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* X-Position auf dem Monitor */ CW_USEDEFAULT, /* Y-Position auf dem Monitor */ 350, /* Fensterbreite */ 300, /* Fensterhoehe */ NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hButton; switch (message) { case WM_CREATE: { hButton = CreateWindow( "button", "Button1", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_SIZE: { MoveWindow(hButton,30,220,100,20, TRUE); return 0; } case WM_COMMAND: { if (lParam == (LPARAM)hButton) { if (HIWORD(wParam) == BN_CLICKED) MessageBox(hWnd,"Button wurde geklickt","Juhu",NULL); } return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
Noch eine kleine Frage zu einem anderen Thema für das ich nun aber keinen extra Thread eröffnen möchte.
Wie kann ich es einstellen ,dass mein Fenster nicht vergrößert / verkleinert werden kann? Sprich es soll zwar verschoben werden können aber man soll es nicht größer / kleiner "ziehen" können. Ich hoffe ihr versteht was ich damit meine.
-
...
-
Swordfish schrieb:
DerNoob1993 schrieb:
wc.hbrBackground = (HBRUSH) CreateSolidBrush( COLORREF RGB(100,20,50));
Wofür der Cast?
Was tutCOLORREF
da!?Hast recht war beides unnötig.
Der cast war noch von der GetStockObject Funtkion aus dem Tutorial und das COLOREF war auch sinnlos,da die Funktion es mir ja zurückgibt danke auch für diesen Hinweis. Weiß zufällig noch einer wie ich das mit der "Festen größe" des Fensters hinbekomme ( sodass es nicht vergrößert / verkleinert werden kann ?).
-
...
-
Swordfish schrieb:
Wieder rtfm: Window Styles (Windows).
Statt
WS_OVERLAPPEDWINDOW
entwederWS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
oder, kürzer:WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME
Danke dafür ja ich habe bereits mir einigen Styles herumexperimentiert habe aber bis dato keine richtige Combination der Window Styles gefunden um das Fenster "Nicht vergrößerbar" zu machen.
Ich bin dir Dankbar auch wenn ich deine Art und weise ( rtfm) nicht sehr schätze ich kann lesen ,aber wie gesagt haperts hier und da noch mit meinem Englisch.
Ich weiß ,dass man sehr viel Englisch benötigt deshalb versuche ich es auch immer weiter zu verbessern ( manchmal gibt der google translator aber einfach nur schwachsinn bei bestimmten Worten aus).Ich meine du warst sicher auch mal ein Anfänger auch wenns schon lange her sein mag zu deiner Zeit gab es evtl. nichtmal Foren und du musstest es durch Tagelanges ausprobieren aller Möglichkeiten herausfinden,da es heutzutage aber Websites gibt welche Anfängern wie mir Hilfe bereitstellen bei solchen Problemen wieso sollte ich diese dann nicht nutzen?
Dennoch danke ich dir vielmals für deine Hilfe es war kein Angriff gegen dich sondern nur eine bitte einfach zu helfen ,und dir das rtfm beim nächsten mal einfach im Geiste zu denken es aber nicht auszuschreiben.
Ich habe kein Problem mit derartigen Kommentaren solange sie Hilfreich sind ,andere fühlen sich dadurch evtl. aber angegriffen und sowas muss an sich ja nicht sein oder?
Danke an alle meine Fragen sind soweit geklärt
-
Hallo
Einiges gibts auch auf deutsch
http://msdn.microsoft.com/de-de/library/ty9hx077(v=vs.80).aspx
..auch wenn da der Übersetzungsapparat nicht immer geglänzt hat.Viel Spass
-
DerNoob1993 schrieb:
Ich weiß ,dass man sehr viel Englisch benötigt deshalb versuche ich es auch immer weiter zu verbessern ( manchmal gibt der google translator aber einfach nur schwachsinn bei bestimmten Worten aus).
Hallo
Einiges gibts auch auf deutsch
http://msdn.microsoft.com/de-de/library/ty9hx077(v=vs.80).aspx
..auch wenn da der Übersetzungsapparat nicht immer geglänzt hat.Viel Spass