Win-API Schriftzug vom Button nach jedem Klick ändern?

FBIagent

Erfahrenes Mitglied
Moin,

ich hab mal etwas mit der Win-Api rumgewuselt. Wenn ich einen Button anklicke möchte
ich das die Schrift auf ihm verändert wird. Im Moment habe ich folgendes ergebnis:

Compilieren ist ok. (mingw)
Ich starte und klicke auf den Button. Dann crashed es: dna.exe hat ein Problem festgestellt und musste beendet werden.

Manchmal crashed es nicht nach dem Klick auf den Buton. Dann ist der Text auf
ihm am ende:
Code:
(turn off)

Dieser ändert sich nach einem weiteren Klick aber nicht wieder auf
Code:
(turn on)

Hier ist der Code:
Code:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmd,int nShow)
{
  WNDCLASS wc;

  wc.style = 0;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0; 
  wc.hInstance = hInst;
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszClassName = "mainWindow";
  wc.lpszMenuName = NULL;

  RegisterClass(&wc);

  HWND hWnd;

  hWnd = CreateWindow("mainWindow",
                      "L2J Reg Wema Tools",
                      WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                      0,0,388,225,
                      NULL,
                      NULL,
                      hInst,
                      NULL);

  MSG Msg;

  while(GetMessage(&Msg, NULL, 0, 0) > 0)
  {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }

  return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
//  signed int xPos = LOWORD(lParam);
//  signed int yPos = HIWORD(lParam);
  
  static HWND hButtonDna;
  bool dnaStarted=false;

  switch (Msg)
  {
    case WM_CREATE:
      hButtonDna = CreateWindow("Button", "Unactivated accounts delete detection (turn on)",
                                WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
                                20, 20, 350, 25,
                                hWnd,
                                NULL,
                                ((LPCREATESTRUCT) lParam)->hInstance,
                                NULL);
      return 0;
    case WM_CLOSE:
      DestroyWindow(hButtonDna);
      DestroyWindow(hWnd);
      return 0;
    case WM_COMMAND:
      if(lParam==(LPARAM)hButtonDna)
      {
        if(HIWORD(wParam)==BN_CLICKED)
        {
          if(dnaStarted==false)
          {
            DestroyWindow(hButtonDna);
            hButtonDna = CreateWindow("Button", "Unactivated accounts delete detection (turn off)",
                                      WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
                                      20, 20, 350, 25,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam)->hInstance,
                                      NULL);
            MessageBox(0,"Started","Info",MB_OK);
            dnaStarted=true;
          }
          else
          {
            DestroyWindow(hButtonDna);
            hButtonDna = CreateWindow("Button", "Unactivated accounts delete detection (turn on)",
                                      WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
                                      20, 20, 350, 25,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam)->hInstance,
                                      NULL);
            MessageBox(0,"Stoped","Info",MB_OK);
            dnaStarted=false;
          }
        } 
      }
      return 0;
    case WM_DESTROY:
      MessageBox(0,"Application closed","Info",MB_OK);
      PostQuitMessage(0);
      return 0;
    default: break;
  }

  return DefWindowProc(hWnd, Msg, wParam, lParam);
}

Meine Frage wäre somit wie ich den crash verhindere und wie ich das anstellen soll,
das der Button nach jedem Klick wieder den Schriftzug ändert.

Viel gemacht habe ich mit der API noch nicht außer einmal Multithreading angeschlagen
was auch super funktioniert hat.

THX im Vorraus
MFG FBIagent
 
Zuletzt bearbeitet:
Du solltest den Button nur einmal bei WM_CREATE anlegen. CreateWindow gibt dir ja ein Handle zurück, mit diesem kannst du dann in den Nachrichten vom Button mit SetWindowText die Beschriftung ändern.
 
Warum zerstörst du ständig den Button und legst ihn wieder neu an? Nimm doch einfach "SetWindowsText()", um den Titel zu ändern.
Code:
SetWindowText(hButtonDna, "turn on");

Gruß
MCoder
 

Neue Beiträge

Zurück