Win-Api TextOut(); tut nichts mehr?

FBIagent

Erfahrenes Mitglied
Moin,

wie man dem Betreff entnehmen kann geht es um die Ausgabe von Text.

Hier erstmal der Codeschnipsel:
Code:
  static PAINTSTRUCT ps;
  static HDC hDC;
  static HWND hButtonDna, hButtonExit;
  static bool dnaStarted=false;

  switch(Msg)
  {
    case WM_CREATE:
      hButtonDna = CreateWindow("Button",
                                "Start",
                                WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
                                160,20,100,25,
                                hWnd,
                                NULL,
                                ((LPCREATESTRUCT) lParam)->hInstance,
                                NULL);
      hButtonExit = CreateWindow("Button",
                                 "Exit",
                                 WS_CHILD | WS_VISIBLE,
                                 160,55,100,25,
                                 hWnd,
                                 NULL,
                                 ((LPCREATESTRUCT) lParam)->hInstance,
                                 NULL);
      return 0;
    case WM_CLOSE:
      DestroyWindow(hButtonDna);
      DestroyWindow(hButtonExit);
      DestroyWindow(hWnd);
      return 0;
    case WM_COMMAND:
      if(lParam==(LPARAM)hButtonExit)
      {
        if(HIWORD(wParam)==BN_CLICKED)
          SendMessage(hWnd,WM_CLOSE,0,0);
      }
      if(lParam==(LPARAM)hButtonDna)
      {
        if(HIWORD(wParam)==BN_CLICKED)
        {
          if(dnaStarted==false)
          {
            dnaStarted=true;
            SetWindowText(hButtonDna,"Stop");
            SendMessage(hWnd,WM_PAINT,0,0);
          }
          else
          {
            dnaStarted=false;
            SetWindowText(hButtonDna,"Start");
            SendMessage(hWnd,WM_PAINT,0,0);
          }
        } 
      }
      return 0;
    case WM_PAINT:
      hDC = BeginPaint(hWnd,&ps);
      TextOut(hDC,20,20,"DNA:",sizeof("DNA:")-1);

      if(dnaStarted==false)
        TextOut(hDC,70,20,"Stopped",sizeof("Stopped")-1);
      else
        TextOut(hDC,70,20,"Running",sizeof("Running")-1);

      EndPaint(hWnd,&ps);
      return 0;
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    default: break;
  }

Nun starte ich und es ist so wie es sein soll.

Wenn ich nun auf meinen Start Button klicke verändert sich zwar die Aufschrift des Buttons jedoch wird bei
WM_PAINT bei TextOut(); nichts getan... Oder kommt es garnicht zu WM_PAINT?

Meine Frage hier wie immer... Wieso? Weshalb? Warum? :)

THX im Vorraus
MFG FBIagent

EDIT: Wo gibts denn diesen schönen cpp Code Tag? Konnte da in der Leiste nichts finden.
 
Zuletzt bearbeitet:
So nun habe ich nch die Funktionalität implementiert :)

Jetzt habe ich aber noch ein Problem. Ich klicke auf den Button. Es wird mit
deleteNotActivated::checkDependence(); geprüft ob die Konfigurationsdatei vorhanden ist
wenn nicht bekommt man "false" zurück. Wenn vorhanden dann werden die Konfigurationen geladen.
Danach wird versucht mit den Daten auf MySQL zu connecten. Wenn dies gelingt gibt
die Methode "true" zurück und andernfals logischerweise false. Wenn "true" zurück
kommt wird ein Thread erstellt(DWORD WINAPI startDna(LPVOID data); ) der dann
deleteNotActivated::start(); aufruft. Wenn ich jetzt zum beenden noch einmal auf den
Button klicke(nach dem ersten schritt die aufschrift "Stop") wird es beendet alles ist
perfekt... nur eines gefällt mir nicht so ganz, und das wäre, dass nach jedem starten und
beenden des Threads speicher übrig bleibt.

Wie kann ich das verhindern?

main.cpp
Code:
#include <windows.h>
#include "./header/dna.h"

//#define THREADS 1

HANDLE hThread;//[THREADS];
DWORD dwThreadID;//[THREADS];
deleteNotActivated dna;

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

DWORD WINAPI startDna(LPVOID data)
{
  dna.start();
  return (DWORD)data;
}

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

  wc.style = CS_HREDRAW | CS_VREDRAW;
  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 = GetSysColorBrush(COLOR_3DFACE);
  wc.lpszClassName = "mainWindow";
  wc.lpszMenuName = NULL;
  
  RegisterClass(&wc);

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

  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)
{
//  static signed int xPos = LOWORD(lParam);
//  static signed int yPos = HIWORD(lParam);
  static PAINTSTRUCT ps;
  static HDC hDC;
  static HWND hButtonDna, hButtonExit;
  static bool dnaStarted=false;

  switch(Msg)
  {
    case WM_CREATE:
      SetTimer(hWnd,250,250,NULL);
      hButtonDna = CreateWindow("Button",
                                "Start",
                                WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
                                160,20,100,25,
                                hWnd,
                                NULL,
                                ((LPCREATESTRUCT) lParam)->hInstance,
                                NULL);
      hButtonExit = CreateWindow("Button",
                                 "Exit",
                                 WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
                                 160,55,100,25,
                                 hWnd,
                                 NULL,
                                 ((LPCREATESTRUCT) lParam)->hInstance,
                                 NULL);
      return 0;
    case WM_TIMER:  
      InvalidateRect(hWnd, NULL, TRUE); 
      UpdateWindow(hWnd); 
      return 0; 
    case WM_CLOSE:
      if(dnaStarted==true)
      {
        dnaStarted=false;
        dna.exit = true;
        WaitForSingleObject(hThread,INFINITE);//WaitForMultipleObjects(THREADS,hThread,TRUE,INFINITE);
        CloseHandle(hThread);
      }
      KillTimer(hWnd,250);
      DestroyWindow(hButtonDna);
      DestroyWindow(hButtonExit);
      DestroyWindow(hWnd);
      return 0;
    case WM_COMMAND:
      if(lParam==(LPARAM)hButtonExit)
      {
        if(HIWORD(wParam)==BN_CLICKED)
          SendMessage(hWnd,WM_CLOSE,0,0);
      }
      if(lParam==(LPARAM)hButtonDna)
      {
        if(HIWORD(wParam)==BN_CLICKED)
        {
          if(dnaStarted==false)
          {
            if(dna.checkDependence()==true)
            {
              hThread = CreateThread(NULL,0,startDna,(LPVOID)0,0,&dwThreadID);
              SetWindowText(hButtonDna,"Stop");
              dnaStarted=true;
            }
          }
          else
          {
            dnaStarted = false;
            dna.exit = true;
            WaitForSingleObject(hThread,INFINITE);//WaitForMultipleObjects(THREADS,hThread,TRUE,INFINITE);
            CloseHandle(hThread);
            SetWindowText(hButtonDna,"Start");
          }
        } 
      }
      return 0;
    case WM_PAINT:
      hDC = BeginPaint(hWnd,&ps);
      SetBkMode(hDC,TRANSPARENT);
      TextOut(hDC,20,20,"DNA:",sizeof("DNA:")-1);

      if(dnaStarted==false)
        TextOut(hDC,70,20,"Stopped",sizeof("Stopped")-1);
      else
        TextOut(hDC,70,20,"Running",sizeof("Running")-1);

      EndPaint(hWnd,&ps);
      return 0;
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    default: break;
  }

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

An der Methode start(); der Klasse deleteNotActivated sollte es nicht liegen... aber naja man soll ja immer auf
nummer sicher gehen:
Code:
void deleteNotActivated::start()
{
  exit=false;
  std::string accLogin;
  int accRegTime, maxUncheckTime, waitPeriod, startWaitPeriod;

  maxUncheckTime = (((atoi(con.getValue("maxUncheckTime").c_str()) * 24) * 60) * 60);
  waitPeriod = (atoi(con.getValue("waitPeriod").c_str()) * 60);

  log.open(".\\log\\dna\\"+extraStr.intToStr(time(0))+".log");
  for(;;)
  {
    mysqlConn.query("SELECT * FROM `accounts_unchecked`");
    MYSQL_RES *accRes = mysqlConn.lastRes();

    while(MYSQL_ROW accRow = mysql_fetch_row(accRes))
    {
      accLogin = accRow[0];
      accRegTime = atoi(accRow[7]);
      
      if((accRegTime+maxUncheckTime)<time(0))
      {
        log.write("Deleted account: " + accLogin);
        mysqlConn.query("DELETE FROM `accounts_unchecked` WHERE `login`='"+accLogin+"';");
      }
    }

    mysqlConn.resFree(accRes);
    startWaitPeriod = time(0);

    for(;;)
    {
      Sleep(1); // lass dies weg und sag prost mahlzeit zu deiner CPU leistung :D
      if(startWaitPeriod+waitPeriod<time(0))
        break;

      if(exit==true)
      {
        MessageBox(0,"DNA Service wurde beendet!","Info",MB_OK);
        break;
      }

    }

    if(exit==true)
      break;
  }

  log.close();
  mysqlConn.close();
}

THX im Vorraus
MFG FBIagent
 
Zuletzt bearbeitet:
Sorry für den dreifach Post. Ich wollte nicht extra ein neues Thread dafür aufmachen.

Ich habe jetzt versucht eine reload Methode für die geladenen
Konfigurationen in meiner "deleteNotActivatedAccouhns" zu schreiben. In meiner Klasse
für Konfigurationen wird eine angegebene Datei geladen. Dannach werden die zeilen aus
der Datei an std::vector<std::string> configRows; übergeben.

Bei der reload Methode wird dies nochmal durchgeführt. Da configRows; zu diesem
Zeitpunkt aber schon etwas enthält wird das neue aus der Datzei geholte ja nur weiter
dran gehängt.

Die Frage also:
Wie bekomme ich configRows; wieder völlig leer? Geht bestimmt schöner als mit einer Hilfsvariable.
Code:
bool config::load(std::string data)
{
  std::string configRow;
  std::ifstream file(data.c_str());
  
  if(!file.is_open())
    return false;
  
  while(getline(file,configRow))
    configRows.push_back(configRow);

  file.close();

  return true;
}

THX im vorraus
MFG FBIagent
 
Zuletzt bearbeitet:
Übersehen nicht wirklich. Aber es stand bei clear(); es tut genau dasselbe wie erase(); und dies wie dort stand macht die vorhandenen Inhalt der Elemente nur leer. Desweiteren bin ich noch auf resize(); gestoßen. Vieleicht hab ich da was auch total falsch interpretiert. Naja dann werd ich das mal ausprobieren mit dem clear();
 
Zuletzt bearbeitet:
Zurück