Lukeme9X
Lukeme9X

Reputation: 43

Confusion with Win32 Connections - Why does this code work?

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

Answers (3)

user739711
user739711

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

Tony The Lion
Tony The Lion

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

Ben Voigt
Ben Voigt

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

Related Questions