Reputation: 15
this problem is making me pull my hair out already
I have read every single Q A about this topic, and everyone has the same solution to it, but it never ends up working for me. I have concluded that because I am newbie, I must be missing something totally obvious which is not being mentioned in the other answers, so please answer with as useless detail as possible.
I have a program in C++ using WinAPI. I have one window called hwnd, this window has 2 buttons, and 2 Edit Control text boxes. All I am trying to do at this point is to take the text entered in the text box and save it into a .txt file.
various answers (and the microsoft website) have said to use
SendMessage (editcontroltag, WM_GETTEXT, 0, LPARAM buffer)
or GetWindowText( editcontroltag, buffer, size)
and more. I have tried them all, and the code compiles without issues, however I can never actually retrieve the text in the text box. It is either empty, or some gibberish (i have tried unicode AND ansi, same thing happens either way)
gibberish usually looks like ')6 or some variation of that (its of no significance to me, so I cant really pinpoint where its coming from.
I have tried casting the buffer to almost every permissible data type, i have tried to retrieve the buffer AND its address (the address shows up fine). Still no luck.
I will paste the code here for you, I am sorry its incredibly messy, you will notice I have commented out many different attempts at retrieving the text. Nothing comes of it either way. The same error manifests each time
Thanks
#include <windows.h>
#include <iostream>
#include <fstream>
#include <TCHAR.H>
#include <stdio.h>
//#include "C:\Users\Eric\Desktop\Documentation\resource.h"
//the following defines are for adding menus without headers or rc files
#define ID_FILE_EXIT 9001
#define ID_STUFF_GO 9002
#define IDC_MAIN_EDIT 101
#define ID_BUTTON 9003
#define ID_EDITCHILD1 100
#define ID_EDITCHILD2 102
#define BUFFER_SIZE 256
using namespace std;
const char g_szClassName[] = "myWindowClass";
BOOL authenticate(char, string);
string bufferToString(char* , int );
BOOL doit = TRUE;
//Step 4: the Window Procedure
/*
Procedure to add items to the main window
you create the item inside the WM_CREATE function thingy
look it up online, there are many examples
This will draw the item in the window, but will not do anything
next you will need to go to the WM_COMMAND switch statement
and add a case for the appropriate LWORD of your item
kapish?
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hwndEDUSER;
static HWND hwndEDPASS;
//TCHAR lpszLatin[] = "Lorem ipsum dolor sit amet, consectetur ";
UpdateWindow(hwnd);
switch(msg)
{
case WM_SIZE:
{
HWND hEdit;
RECT rcClient;
GetClientRect(hwnd, &rcClient);
hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
}
break;
case WM_CREATE:
{
HMENU hMenu, hSubMenu;
HICON hIcon, hIconSm;
HINSTANCE hInstance;
if(doit)
{
HWND hwndEDUSER = CreateWindowEx(
0,"EDIT", // predefined class
NULL, // no window title
WS_CHILD | WS_VISIBLE |
ES_LEFT | ES_MULTILINE ,
60, 60, 100, 25, // set size in WM_SIZE message
hwnd, // parent window
(HMENU) ID_EDITCHILD1, // edit control ID
(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // pointer not needed
// Add text to the window.
SendMessage(hwndEDUSER, WM_SETTEXT, 0, (LPARAM)("username"));
//SendMessage(hwndEdit, EM_SETLIMITTEXT, 3, NULL);
HWND hwndEDPASS = CreateWindow(
"EDIT", // predefined class
NULL, // no window title
WS_CHILD | WS_VISIBLE |
ES_LEFT,
60, 90, 100, 25, // set size in WM_SIZE message
hwnd, // parent window
(HMENU) ID_EDITCHILD2, // edit control ID
(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // pointer not needed
// Add text to the window.
SendMessage(hwndEDPASS, WM_SETTEXT, 0, (LPARAM)("password"));
//SendMessage(hwndEdit, EM_SETLIMITTEXT, 3, NULL);
HWND hwndButton = CreateWindow(
"BUTTON", // Predefined class; Unicode assumed
"Commit", // Button text
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles
200, // x position
10, // y position
200, // Button width
25, // Button height
hwnd, // Parent window
NULL, // No menu.
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
HWND boobs = CreateWindow(
"BUTTON", // Predefined class; Unicode assumed
"LOG IN", // Button text
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles
200, // x position
35, // y position
200, // Button width
25, // Button height
hwnd, // Parent window
(HMENU)ID_BUTTON, // PREVIOUS COMMENT SAID NO MENU, HOWEVER THIS IS WHERE I ADD THE ID FOR THE BUTTON BEING PRESED
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
}
// HWND hWndExample = CreateWindow("EDIT", "Text Goes Here", WS_VISIBLE | WS_CHILD | ES_CENTER, 10,10,100,100, hwnd, NULL, hInstance, NULL);
hMenu = CreateMenu();
hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File");
hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "&Go");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Stuff");
SetMenu(hwnd, hMenu);
hIcon = static_cast<HICON>(LoadImage(NULL, "C:\menu_one.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE));
if(hIcon)
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
else
MessageBox(hwnd, "Could not load large icon!", "Error", MB_OK | MB_ICONERROR);
hIconSm = static_cast <HICON>(LoadImage(NULL, "C:\menu_two.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE));
if(hIconSm)
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
elsehttp://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v=VS.85).aspx
MessageBox(hwnd, "Could not load small icon!", "Error", MB_OK | MB_ICONERROR);
}
break;
/*case WM_LBUTTONDOWN: //mouse click
case BN_CLICKED:
{
char szFileName[MAX_PATH];
HINSTANCE hInstance = GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, "The document has been requested, and will be available shortly", "Document Requested", MB_OK | MB_ICONINFORMATION);
}*/
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case ID_STUFF_GO:
MessageBox(hwnd, "Unavailable", "title", MB_OKCANCEL | MB_ICONINFORMATION );
break;
case ID_BUTTON:
{
//TCHAR user[BUFFER_SIZE];
//string user ="";
//static char user[256];
//char id[256];
//((WORD*)user)[0] = BUFFER_SIZE; //cast variable user of type TCHAR into WORD. Set position 0 of said WORD variable to BUFFER_SIZE (needed by EM_GETLINE)
// SendMessage(hwndEDUSER, EM_GETLINE, 0, (LPARAM)user);
// Edit_GetText(hwndEDUSER,(LPTSTR) user,BUFFER_SIZE);
//GetWindowText(hwndEDUSER, (LPSTR)user, 256);
//GetDlgItemText(hwndEDUSER, ID_EDITCHILD1, (LPTSTR)user,BUFFER_SIZE);
//const char id= *user;
int len = SendMessage(hwndEDUSER, WM_GETTEXTLENGTH, 0, 0);
char* buffer = new char[len];
UpdateWindow(hwnd);
SendMessage(hwndEDUSER, WM_GETTEXT, 0, (LPARAM)buffer);
//return buffer;
string user(buffer);
fstream users;
users.open("C:\\users\\Eric\\Desktop\\Documentation\\user1.txt");
users << user;
users.close();
doit = FALSE;
//PostMessage(hwnd, WM_PAINT, 0, 0);
UpdateWindow(hwnd);
//char id = (char)user;
/* Edit_GetText(hwndEDUSER, (LPTSTR)eyeD,50);
string id(eyeD);
if(id=="2"){MessageBox(hwnd, "BITTCH", "Document Requested", MB_OK | MB_ICONINFORMATION);} */
//string id = (string)user;
// authenticate(id, "");
//char szFileName[MAX_PATH];
//HINSTANCE hInstance = GetModuleHandle(NULL);
//GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd,buffer, "Title", MB_OK | MB_ICONINFORMATION);
}
break;
/* case BN_CLICKED:
{
char szFileName[MAX_PATH];
HINSTANCE hInstance = GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, "Commit", "Document Requested", MB_OK | MB_ICONINFORMATION);
}
break;*/
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
/*case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}*/
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //comment this out for header and rc
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_INACTIVEBORDER);//(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //comment this out for header and rc
//wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU); //comment this out for header and rc
//wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
//wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"nameofwin",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 480,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0) //this piece of code is responsible for collecting events (clicks.. etc) and reporting them to the window
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
BOOL authenticate(char uid, string pwd)
{
//string boobs=uid;
fstream users;
users.open("C:\\users\\Eric\\Desktop\\Documentation\\user1.txt");
users << uid;
users.close();
return TRUE;
}
Upvotes: 0
Views: 2941
Reputation: 11237
Just use SetWindowText
and GetWindowText
, like this:
/* Set the window text */
SetWindowText(hwndEDUSER, _T("username"));
/* Get the window text */
TCHAR *buf;
int len;
if((buf=malloc(len=((GetWindowTextLength(hwndEdit)+1)*sizeof (TCHAR)))!=NULL)
GetWindowText(hwndEdit, buf, len);
/* Use buf */
free(buf);
Upvotes: 0
Reputation: 1717
You are declaring a static variable for the handle, HWND hwndEDUSER
. But when creating the window, you are not using that variable. You are declaring a new one, which goes out of scope and is lost. Later, you use the static variable... which has nothing in it.
Upvotes: 4
Reputation: 37122
Instead of reading "every single Q&A", just read the docs fpr the WM_GETTEXT
message.
wParam
The maximum number of characters to be copied, including the terminating null character.
You are passing 0
for wParam
, therefore the control is not copying any text into your buffer, and you're left with the original contents which - since you never initialised the memory - is garbage.
Upvotes: 1