Autocheckbox von anfang an aktiviert?
-
leider kenn ich mich noch net so gut aus und bin noch recht unerfahren... schreib grad mein erstes richtiges Programm in C++ für Windows.
Könnte mir jemand sagen, was ich genau hinschreiben müsste, damit der Button gesetzt ist?
Die Microsoft Seite hilft mir grad nicht so wirklich weiter...Wär echt nett, vielen Dank Sirstefen
-
[cpp] hwndButton = CreateWindow (...);
SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
[/cpp]
-
Super, vielen Dank...
-
So leider hab ich nun ein neues Problem...
ich habe einen reset button in mein programm eingefügt und wenn man auf diesen klickt sollen alle autocheckboxen die ich habe wieder gesetzt werden (egal ob sie schon gesetzt sind oder nicht) und ich mache dies in der switch-message schleife unter dem case WM_COMMAND.
wie kann ich denn von hier aus meine autocheckbex als gesetzt deklarieren?
mit "SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);" gehts ja nur direkt nachdem ich den button erstellt habe...
hat jemand ne ahnung? wär echt nett! Vielen Dank schon mal Sirstefenhier noch der quellcode:
[cpp]
case (HMENU) 11: // Button Reset wird gedrücktButtonPressed_WelleA = true; // alle Wellenzentren werden aktiviert
ButtonPressed_WelleB = true;
ButtonPressed_WelleC = true;
ButtonPressed_WelleD = true;
ButtonPressed_WelleE = true;
ButtonPressed_WelleF = true;
a1 = 66, b1 = 133, c1 = 66; // Wellenzentren in ihren ursprünglichen Zustand
a2 = 50, b2 = 50, c2 = 100;
d1 = 133, e1 = 66, f1 = 133;
d2 = 100, e2 = 150, f2 = 150;// hier müsste nun der Code rein, damit alle Autocheckboxen als gesetzt markiert werden!!!
InvalidateRect(hwnd, NULL, TRUE); // das vorherige Fenster wird gelöscht
break;
[/cpp]
-
SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
funktioniert immer, sofern hwndButton gültig ist und das Handle eines Buttons ist
Also wird bei dir vermutlich hwndButton nicht oder nicht mehr gültig sein...
-
und woher weiß dann mein programm welchen button ich meine? ich hab nämlich mehrere und ich gebe ja keine id an oder so was und diese message schaut ja immer gleich aus...
-
solltest du nicht machen, jedes fenster (button, edit, usw usw) sollte ne id und ein eigenes fensterhandle besitzen.
fensterhandle == rückgabewert
id == 9. parameter
-
ja klar jeder button hat ja bei mir ne eindeutige id
ich mein ja blos dass
SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
keinerlei id oder sowas hat und somit meiner meinung nach nicht einem button zugewiesen werden kann wenn man es nicht direkt nach der erstellung (also bei WM_CREATE) hinschreibt...
und ich will ja woanders einen button als gesetzt markieren....also zumindest seh ich keine id zuweisung bei
SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);weiß jemand was ich machen muss?
-
Dann hol Dir einen HWND aufgrund der ID mit GetDlgItem(hWndParent, ID_CHILD).
SendMessage(GetDlgItem(hWndParent, ID_CHILD), BM_SETCHECK, BST_CHECKED, 0);oder
SendDlgItemMessage(hWndParent, ID_CHILD, BM_SETCHECK, BST_CHECKED, 0);
-
kann ich auch was anderes als "hWndParent" schreiben? wenn ich des schreibe kommt nämlich die fehlermeldung dass ich das noch nicht deklariert habe! und wenn ich was anderes reinschreibe (z.b. "hWnd" oder "hWndButton") dann kommt die fehlermeldung dass das ein falscher Parameter sei... (es bringt auch nix wenn ich vorher "HWND hWndParent;" schreibe...)
kann ich nicht sowas ähnliches wie hWndButton oder so schreiben?
Danke für Antworten
-
hwndParent ist wie der name schon sagt das fensterhandle des fensters auf dem sich der button befindet.
du hast doch bei InvalidateRect(..) auch das fenster angegeben
-
ja scho klar blos bei InvalidateRect geb ich nur "hWnd" an und nicht "hWndParent"
ich benutze "hWndParent" bisher gar nicht in meinem programm...
und "hWnd" (so heißt auch mein hauptfenster und der button befindet sich auf dem hauptfenster) funktioniert bei "GetDlgItem" eben nicht...
würde es funktionieren, wenn ich hWndParent irgendwo deklariere oder so? und wie müsste ich des machen? (ich hab leider hWndParent noch nie benutzt)
between: vielen dank schonmal für eure geduld... ihr seht ja ich bin noch anfänger...
-
hWndParent und ID_CHILD sind nur Platzhalter diese musst du natürlich durch
deine eignen variablennamen ersetzen.
-
und mit was müsste ich dann beispielsweise hWndParent ersetzen? Mein hauptfenster hab ich folgendermaßen geschrieben:
hwnd = CreateWindow ( szAppName, // Hauptfenster szAppName, // Titel WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU // Stil | WS_THICKFRAME | WS_MINIMIZEBOX, 100, // X-Position 100, // Y-Position 700, // Breite 510, // Höhe NULL, // übergeordnetes Fenster NULL, // Menü hInstance, // Programm-Kopiezähler (Programm ID) NULL); // zusätzliche Parameterund in dem befindet sich der button...
-
Tu uns und dir einen Gefallen: Ackere ein C/C++ Tutorial durch!
-
du hast doch eine wndproc in etwa so
// erster parameter ist das fensterhandle von hauptfenster LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndBtn; // fensterhandle des buttons switch(msg) { case WM_CREATE: { hwndBtn = CreateWindow( "BUTTON", "OK", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 100, 100, 100, 100, hwnd, (HMENU)105, // ID des Buttons ((LPCREATESTRUCT)lParam)->hInstance, NULL); } break; case WM_COMMAND: // usw usw usw usw uswnimm es mir nicht böse aber vorsatz für das neue jahr sollte sein ein paar winapi tutorials durchzuackern.
[edit]
ich war zu langsam.
@hepi
zwei menschen ein gedanke
-
ich hab hier ein winapi tutorial (windows programmierung von petzold) und mit dem arbeite ich auch, blos leider steht da auch net alles drin...
ich hab ich mit der id des buttons kein problem... das wüsstet ihr auch wenn ihr meine vorherigen beiträge durchgelesen hättet! (Wer lesen kann, ist klar im Vorteil)
vielleicht steh ich grad a weng aufm schlauch (weiß auch net) aber wenn ich den fensterhandle meines buttons ( = hwndButton das wüsstet ihr auch wenn ihr meine vorherigen beiträge gelesen hättet) einsetze, also so:
SendMessage(GetDlgItem(hwndButton, (HMENU) 5), BM_SETCHECK, BST_CHECKED, 0);dann funktioniert das nicht wegen folgender fehlermeldung:
error C2664: 'GetDlgItem' : Konvertierung des Parameters 2 von 'struct HMENU__ *' in 'int' nicht moeglich
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformatso: ich weiß dass ich mich noch net so gut auskenne und ich bin euch ja auch sehr dankbar dass ihr mir helft, aber bevor ihr mir irgendwelche guten vorsätze vorschreibt, solltet ihr vielleicht mal lesen was überhaupt mein problem ist!!! (is nicht böse gemeint blos find ichs a weng unfair dass ihr mich gleich so anmacht)
mein Button sieht folgendermaßen aus:
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static RECT rect; static int cxChar, cyChar; HDC hdc; PAINTSTRUCT ps; switch (msg) { case WM_CREATE: cxChar = LOWORD (GetDialogBaseUnits ()); cyChar = HIWORD (GetDialogBaseUnits ()); HWND hChild, hwndButton; hwndButton = CreateWindow ( "button", "Welle A", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, cxChar, cyChar * 2, 10 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) 5, ((LPCREATESTRUCT) lParam)->hInstance, NULL); SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0); // etc.so und ich will erreichen, dass der button, falls er mal vom Benutzer als ungesetzt markiert wird, wieder als gesetzt markiert wird, sobald auf einen weiteren button geklickt wird: dass hab ich folgendermaßen gemacht:
[cpp]case WM_COMMAND:
switch (LOWORD(wParam))
{
case (HMENU) 11: // Button Reset wird gedrücktButtonPressed_WelleA = true; // alle Wellenzentren werden aktiviert
ButtonPressed_WelleB = true;
ButtonPressed_WelleC = true;
ButtonPressed_WelleD = true;
ButtonPressed_WelleE = true;
ButtonPressed_WelleF = true;
a1 = 66, b1 = 133, c1 = 66; // Wellenzentren in ihren ursprünglichen Zustand
a2 = 50, b2 = 50, c2 = 100;
d1 = 133, e1 = 66, f1 = 133;
d2 = 100, e2 = 150, f2 = 150;
SendMessage(GetDlgItem(hwndButton, (HMENU) 5), BM_SETCHECK, BST_CHECKED, 0); // das funktioniert leider nicht, siehe oben in meinem beitrag die Fehlermeldung
InvalidateRect(hwnd, NULL, TRUE); // das vorherige Fenster wird gelöscht
break;}
break;
[/cpp]edit: falls jetzt jemand denkt, dass es daran liegt dass ich hwnd anstatt dem üblichen hWnd geschrieben hab... ich hab einheitlich hwnd geschrieben, also dürfte das nicht das problem sein.... (sorry wegen dem häufigen edit)
Sirstefen
-
Sirstefen schrieb:
ich hab ich mit der id des buttons kein problem... das wüsstet ihr auch wenn ihr meine vorherigen beiträge durchgelesen hättet! (Wer lesen kann, ist klar im Vorteil)
hab alles gelesen, wollt nur nochmal hinschreiben
Sirstefen schrieb:
so: ich weiß dass ich mich noch net so gut auskenne und ich bin euch ja auch sehr dankbar dass ihr mir helft, aber bevor ihr mir irgendwelche guten vorsätze vorschreibt, solltet ihr vielleicht mal lesen was überhaupt mein problem ist!!! (is nicht böse gemeint blos find ichs a weng unfair dass ihr mich gleich so anmacht)
war keine vorschrift sondern ein rat. blöd angemacht hat dich meiner meinung auch keiner. wir versuchen nur zu helfen.
Sirstefen schrieb:
vielleicht steh ich grad a weng aufm schlauch (weiß auch net) aber wenn ich den fensterhandle meines buttons ( = hwndButton das wüsstet ihr auch wenn ihr meine vorherigen beiträge gelesen hättet) einsetze, also so:
SendMessage(GetDlgItem(hwndButton, (HMENU) 5), BM_SETCHECK, BST_CHECKED, 0);es ist schon richtig das hwndButton ist bzw. war den wenn du den scope verlässt wird diese wieder zerstört.
bei GetDlgItem musst das handle der hauptfensters angeben.
so
[cpp]
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static RECT rect;
static int cxChar, cyChar;
static HWND hChild, hwndButton; // somit hast du gültige handles
HDC hdc;
PAINTSTRUCT ps;switch (msg)
{
case WM_CREATE:
cxChar = LOWORD (GetDialogBaseUnits ());
cyChar = HIWORD (GetDialogBaseUnits ());hwndButton = CreateWindow ( "button", "Welle A",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
cxChar,
cyChar * 2,
10 * cxChar,
7 * cyChar / 4,
hwnd,
(HMENU) 5,
((LPCREATESTRUCT) lParam)->hInstance,
NULL);SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
// etc.
[/cpp]case WM_COMMAND: switch (LOWORD(wParam)) { case (HMENU) 11: ButtonPressed_WelleA = true; ButtonPressed_WelleB = true; ButtonPressed_WelleC = true; ButtonPressed_WelleD = true; ButtonPressed_WelleE = true; ButtonPressed_WelleF = true; a1 = 66, b1 = 133, c1 = 66; // Wellenzentren in ihren ursprünglichen Zustand a2 = 50, b2 = 50, c2 = 100; d1 = 133, e1 = 66, f1 = 133; d2 = 100, e2 = 150, f2 = 150; SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0); InvalidateRect(hwnd, NULL, TRUE); // das vorherige Fenster wird gelöscht break; } break;
-
hmm selbst wenn ich "static" eingeben ändert sich leider nix... die fehlermeldung kommt immer noch...
-
miller_m schrieb:
SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);siehe vorheriger post