Reputation: 43
I followed a tutorial on some win32, creation and interaction, but I'm not sure how the code connects a "Write here" edit box to a message box.
#define IDC_MAIN_BUTTON 101 // Button identifier
#define IDC_MAIN_EDIT 102 // Edit box identifier
HWND hEdit;
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName="Window Class";
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,
"Window class creation failed\r\n",
"Window Class Failed",
MB_ICONERROR);
}
HWND hWnd=CreateWindowEx(NULL,
"Window Class",
"Windows application",
WS_OVERLAPPEDWINDOW,
200,
200,
640,
480,
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
{
int nResult=GetLastError();
MessageBox(NULL,
"Window creation failed\r\n",
"Window Creation Failed",
MB_ICONERROR);
}
ShowWindow(hWnd,nShowCmd);
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
// How does this edit box, connect to the button?
// Create an edit box
hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
"EDIT",
"",
WS_CHILD|WS_VISIBLE|
ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
50,
100,
200,
100,8
hWnd,
(HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE,0));
SendMessage(hEdit, WM_SETTEXT, NULL, (LPARAM)"Insert text here...");
// Create a push button
HWND hWndButton=CreateWindowEx(NULL,
"BUTTON",
"OK",
WS_TABSTOP|WS_VISIBLE|
WS_CHILD|BS_DEFPUSHBUTTON,
50,
220,
100,
24,
hWnd,
(HMENU)IDC_MAIN_BUTTON, GetModuleHandle(NULL), NULL);
SendMessage(hWndButton, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE,0));
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_MAIN_BUTTON:
{
char buffer[256];
SendMessage(hEdit, WM_GETTEXT, sizeof(buffer)/sizeof(buffer[0]), reinterpret_cast<LPARAM>(buffer));
MessageBox(NULL, buffer, "Information", MB_ICONINFORMATION);
}
break;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
I am really not sure how the text box sends its info to the message box.
Upvotes: 1
Views: 547
Reputation: 1882
When you do CreateWindowEx
, it creates a message queue. Then anyone can send message to this window using its handle.
While CreateWindowEx()
you are giving id IDC_MAIN_EDIT
. So when you press button this will be send as a command to your window-message-Queue. This is handled in your proc()
case IDC_MAIN_EDIT
:.
Upvotes: 1
Reputation: 63250
The key is these three lines:
char buffer[256];
SendMessage(hEdit, WM_GETTEXT, sizeof(buffer)/sizeof(buffer[0]), reinterpret_cast<LPARAM>(buffer));
MessageBox(NULL, buffer, "Information", MB_ICONINFORMATION);
The WM_GETTEXT
message does the following:
Copies the text that corresponds to a window into a buffer provided by the caller.
So the first call SendMessage
will copy what's in the hEdit
window to the buffer
you created the line before.
Then the next line writes the contents of buffer
to the MessageBox
Upvotes: 4
Reputation: 283733
The textbox doesn't "send its info". When the button is clicked, the case WM_COMMAND
runs and it gets the content from the textbox. That's the SendMessage(..., WM_GETTEXT, ...)
call.
Upvotes: 0