C++ Windows API Input/Edit vakje

Status
Niet open voor verdere reacties.

brabox

Gebruiker
Lid geworden
6 jan 2010
Berichten
5
Dag allemaal.
Ik probeer samen met iemand een programma te schrijven in C++. Hier in moet de gebruiker een waarde in een inputbox invoeren. Dit moet ik dan in de code kunnen opvragen, ermee rekenen en vervolgens het resultaat outputten.

We gebruiken Dev-C++.
(dit gaat niet over een console- maar een win32/winAPI applicatie)

We hebben twee vragen:

1.
Ik heb een functie gevonden die een vakje maakt en alles wat in dit vakje getypt opslaat in de variabele 'text'. Het probleem is dat hij dit als een tekenreeks opslaat. Daarmee kun je niet mee rekenen.
Is er een manier om dit te converteren, of kan ik beter een ander commando gebruiken dat zelf al een getal opslaat?



2.
Ik heb geprobeerd om gewoon de 'text' variabele op het scherm te tekenen. Maar als ik dit doe, verdwijnt het inputvakje en de 'OK' knop. Als je er met de cursor overheen gaat, komt het deels weer terug :confused:. Ik denk dat er iets fout is met de IDs omdat het allemaal zogenaamde 'windows' zijn.


Alvast erg bedankt :thumb:


Dit is onze code:

Code:
[FONT="Courier New"][SIZE="2"]
#include <windows.h>

#define ID_EDIT 1
#define ID_BUTTON 2
#define ID_OUTPUTTEXT 3 [COLOR="Green"] /*Ik dacht dat dit erbij moest voor de window die de output text tekent.*/[/COLOR]

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

  static HWND hwndEdit;
  static HWND hwndButton;
  static HWND hwndOutputtext; [COLOR="Green"]/*Ik dacht dat dit erbij moest voor de window die de output text tekent.*/[/COLOR]

  static int len;
  static TCHAR text[30];

  switch(msg)
  {
		
    case WM_CREATE:
	hwndEdit = CreateWindow(TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 20, hwnd, (HMENU) ID_EDIT,NULL, NULL); [COLOR="Green"]//Vakje[/COLOR]

	hwndButton = CreateWindow(
		TEXT("button"), TEXT("OK"), WS_VISIBLE | WS_CHILD, 50, 100, 80, 25, hwnd, (HMENU) ID_BUTTON, NULL, NULL);   [COLOR="Green"] //Knop[/COLOR]
          
    
	break;

	case WM_COMMAND:	
           if (HIWORD(wParam) == BN_CLICKED) { [COLOR="Green"]//Als knop is ingedrukt[/COLOR]
               InvalidateRect(hwnd,NULL,TRUE);
               len = GetWindowTextLength(hwndEdit) + 1;
               GetWindowText(hwndEdit, text, len);             
      	       hwndOutputtext = CreateWindow(TEXT("STATIC"), text, WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 300, 230, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL); [COLOR="Green"]//Output text[/COLOR]

           }
	break;

	case WM_DESTROY:
		PostQuitMessage(0);
	break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			LPSTR lpCmdLine, int nCmdShow )
{
  MSG  msg ;    
  WNDCLASS wc = {0};
  wc.lpszClassName = TEXT( "Edit Control" );
  wc.hInstance     = hInstance ;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc ;
  wc.hCursor       = LoadCursor(0,IDC_ARROW);

  
  RegisterClass(&wc);
  CreateWindow( wc.lpszClassName, TEXT("Edit control"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 220, 220, 280, 200, 0, 0, hInstance, 0);  

  while( GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return (int) msg.wParam;
}[/SIZE][/FONT]
 
1e vraag: getdlgitemint // natuurlijk voor een int type, google maar voor de ()
 
Wat betreft vraag 2:

Het window waar je de tekst neerzet is zo groot dat het over de edit en button heen zit.
Maak dat window iets kleiner met name de hoogte(is nu 230).
Of zet het outputwindow ergens anders neer, zodat hij niet over de andere windows heen komt.

hwndOutputtext = CreateWindow(TEXT("STATIC"), text, WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 300, 230, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL); //Output text
wordt
hwndOutputtext = CreateWindow(TEXT("STATIC"), text, WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 300, 20, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL); //Output text


Het outputwindow maken kan je beter in WM_CREATE doen.
Anders maak je iedere keer een window als je op de button drukt.
De tekst kan je dan wijzigen met SetWindowText() of SetDlgItemText() in de WM_COMMAND.
 
Laatst bewerkt:
Dank jullie wel voor de snelle reacties :)
Vraag 2 is helemaal opgelost, dank je wel. (en bedankt voor je tip)

Alleen GetDlgItemInt werkt nog niet helemaal. Op de microsoft C++ documentatiepagina staan de volgende parameters voor UINT GetDlgItemInt:
Ik heb wat geprobeerd, maar het geeft errors. Waarschijnlijk heb ik ergens wat ingevuld wat er niet moet staan (ik snap ook alle beschrijvingen van de parameters niet)

UINT GetDlgItemInt(
HWND hDlg, //Naam van de window?
int nIDDlgItem, //Integer waar hij m opslaat?
BOOL *lpTranslated, //Geen idee (ik vulde maar 0 in aangezien het een boolean is)
BOOL bSigned //Ook 0 ingevuld omdat hij volgens mij niet signed is.
);

Ik zou het erg op prijs stellen als iemand kan uitleggen wat er op deze plekken moet komen te staan. :D
 
UINT GetDlgItemInt(
HWND hDlg,
int nIDDlgItem,
BOOL *lpTranslated,
BOOL bSigned
);

hDlg is de hendel van de parent van het venster waarvan je de int wil hebben.
In de WndProc() functie is dat dus hwnd.

nIDDlgItem is de id van het venster waarvan de int komt
Dat is dus de id van de edit ID_EDIT.

lpTranslated adres van een variabele van het type BOOL om te kijken of de conversie gelukt is. Deze mag NULL zijn.

bSigned geeft aan of het een negatief getal kan zijn
FALSE alleen positief
TRUE zowel positief als negatief

De functie kan als volgt worden aangeroepen in WndProc().

INT getal;
getal = GetDlgItemInt(hwnd, ID_EDIT, NULL, FALSE);

De waarde wordt dan opgeslagen in de variabele getal.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan