::MessageBox Error?

So I'm in the early, early stages of this one project i'm working on. At this point, All it needs to do is take a user's input from a text field and show that input in a ::MessageBox

The Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <windows.h>

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	HWND txtfld;
	HWND btn;
	HWND txtbx;
	char txtmem[20];
	switch(Message) {
	
    case WM_CREATE:
    	{
    		txtfld = CreateWindow("STATIC", "    CommonwealthCore Database Application", WS_VISIBLE | WS_CHILD | WS_BORDER, 150, 20, 300, 20, hwnd, NULL, NULL, NULL);
    		txtfld = CreateWindow("STATIC", "                     Find A Nation:", WS_VISIBLE | WS_CHILD | WS_BORDER, 20, 70, 250, 20, hwnd, NULL, NULL, NULL);
    		txtbx = CreateWindow("EDIT", "NationShortName", WS_VISIBLE | WS_CHILD | WS_BORDER, 20, 110, 250, 20, hwnd, NULL, NULL, NULL);
    		btn = CreateWindow("BUTTON", "SEARCH", WS_VISIBLE | WS_CHILD | WS_BORDER, 100, 150, 100, 30, hwnd, (HMENU) 1, NULL, NULL);
    		break;
    	}

	case WM_COMMAND:
		{
		
		switch (LOWORD (wParam) )
		{
			case 1:
				{
					int gwt1=0;
					char * txtmemptr = &txtmem[0];
					gwt1=GetWindowText(txtbx, &txtmem[0], 20);
					::MessageBeep(MB_ICONERROR);
					::MessageBox(hwnd, txtmemptr , txtmemptr, MB_OK);
				
					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+2));

            EndPaint(hwnd, &ps);
            break;
        }


    
		/* Upon destruction, tell the main thread to stop */
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		
		/* All other messages (a lot of them) are processed using default procedures */
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	
	return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG Msg; /* A temporary location for all messages */

	/* zero out the struct and set the stuff we want to modify */
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","CommonwealthCore Database Application",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		350, /* x */
		0, /* y */
		600, /* width */
		600, /* height */
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	/*
		This is the heart of our program where all input is processed and 
		sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
		this loop will not produce unreasonably high CPU usage
	*/
	while(GetMessage(&Msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&Msg); /* Translate key codes to chars if present */
		DispatchMessage(&Msg); /* Send it to WndProc */
	}
	return Msg.wParam;
	
}


When I compile and run the program, the ::MessageBox is empty even though text was passed to it. No Content. No Caption.

Is there a issue somewhere in the code?

My compiler isn't throwing and errors or warnings.

I am using Orwell Dev-C++ 5.6.3 with the TDM-GCC 4.8.1 64-bit release.

Thanks,
Hom
Your txtbx handle (line 7) is local to your WndProc function. This means the variable will be destroyed and recreated each time that function is called. IE: it will be destroyed and recreated for each message.

So...

1) When you get a WM_CREATE message, you initialize txtbx to be the handle to your text box.
2) The WndProc for WM_CREATE exits... which means txtbx is destroyed.
3) The WndProc is called again for WM_COMMAND
4) txtbx is a new handle and no longer is the handle to your text box (that handle was destroyed when the function exited last)
5) You attempt to GetWindowText with a bad handle... which puts a bad/empty string in txtmem



You'll need to give txtbx (and your other handles) a larger scope so they have a lifetime that is longer than the span of one WndProc call.



On a side note... you are using the wrong character type. MessageBox, CreateWindow, etc all take TCHAR strings. Since you are not using TCHAR strings, you should be calling MessageBoxA, CreateWindowA, etc (note the A at the end).

More reading:
http://www.cplusplus.com/forum/windows/106683/
Disch,

Thanks for the answer.

How would I give the handles a larger scope? (Declaring them outside the function WndProc?)

I didn't even realize I was using the wrong char type. Thanks for pointing* that out.

~Hom
How would I give the handles a larger scope? (Declaring them outside the function WndProc?)


That would be the easiest way, yes.
Thanks. :D

It works now that I declared them outside of the function.
Topic archived. No new replies allowed.