【问题标题】:Get TextBox Value and show it as MessageBox WinApi获取 TextBox 值并将其显示为 MessageBox WinApi
【发布时间】:2015-01-31 08:58:27
【问题描述】:

当我在 TextBox 中输入值然后单击按钮时,MessageBox 必须显示输入的值,而不是空的 MessageBox。 那么点击按钮后如何让输入的值显示在MessageBox上呢?

#include <windows.h>

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

HWND TextBox;
char textSaved[20];
    switch(Message) {
        case WM_CREATE:

        TextBox = CreateWindow("EDIT",
                                "",
                                WS_BORDER | WS_CHILD | WS_VISIBLE,
                                10,10,300,20,
                                hwnd, NULL, NULL, NULL);
        CreateWindow("BUTTON",
                    "Go",
                    WS_VISIBLE | WS_CHILD | WS_BORDER,
                    420, 10, 70, 20,
                    hwnd, (HMENU) 1, NULL, NULL);

        break;

        case WM_COMMAND:

            switch(LOWORD(wParam))
            {
                case 1:

                int gwtstat =0;
                gwtstat = GetWindowText(TextBox, &textSaved[0], 20);
                ::MessageBox(hwnd, textSaved, textSaved, MB_OK);
                break;
            }

        break;

        case WM_DESTROY: { PostQuitMessage(0);break;}
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG Msg;
    memset(&wc,0,sizeof(wc));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    //HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
    wc.hbrBackground = CreateSolidBrush(RGB(20, 60, 12));//(brush)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        640,
        480,
        NULL,NULL,hInstance,NULL);

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

    while(GetMessage(&Msg, NULL, 0, 0) > 0) {
        TranslateMessage(&Msg); 
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

【问题讨论】:

    标签: c++ winapi dev-c++


    【解决方案1】:

    首先您需要获取文本框文本,在您的情况下它没有 id,然后使用此代码创建带有 id 的文本框,因为在您的情况下,每次调用窗口过程时都会重置 HWND 文本框:

     CreateWindowW(L"EDIT", L"", WS_BORDER | WS_CHILD | WS_VISIBLE, 10,10,300,20, hwnd, (HMENU)2, NULL, NULL);
    

    现在您的文本框有一个 id,我们不需要 HWND 文本框,使用 GetDlgItem 获取文本框,使用 GetWindowTextW 获取文本框的文本并存储在 wchar_t 数组中:

    case 1:
        int len = GetWindowTextLengthW(GetDlgItem(hwnd, 2)) + 1;
        wchar_t text[len];
        GetWindowTextW(GetDlgItem(hwnd, 2), text, len);
        MessageBoxW(NULL, text, L"MsgFromTextBox", MB_OK);
    

    【讨论】:

      【解决方案2】:

      WndProc 中声明HWND TextBox; 意味着每次调用窗口过程时都会重置其值(为未初始化的值)。如果要保存值,则需要使变量static 或全局变量。

      【讨论】:

        猜你喜欢
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多