如何将文本追加到一个TextBox?

问题描述:

我觉得以下code应该是不言自明的。

I think the following code should be self-explanatory.

#include <Windows.h>

static HWND textBoxInput;
static HWND button;
static HWND textBoxOutput;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR cmdLine,int nCmdShow)
{
    HWND hMainWindow;
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.lpszClassName = "Main's window class";
    wc.hInstance = hInstance;
    RegisterClass(&wc);


    hMainWindow = CreateWindow(wc.lpszClassName,"Append text main window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,400,NULL,NULL,hInstance,NULL);

    error=GetLastError();

    if(hMainWindow == NULL) return 1;

    textBoxInput = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", NULL,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 10, 10, 300, 21, hMainWindow, NULL, NULL, NULL);

    button = CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Append",WS_CHILD | WS_VISIBLE | ES_CENTER, 10, 41,75,30,hMainWindow,NULL,NULL,NULL); 

    textBoxOutput = CreateWindowEx(WS_EX_CLIENTEDGE,"Edit",TEXT("->This content is untouchable and unreadable!<-"),WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL |  ES_MULTILINE | ES_READONLY ,10,81,500,90,hMainWindow,NULL,NULL,NULL);


    ShowWindow(hMainWindow,SW_SHOW);

    MSG msg = { };

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_COMMAND:
        if((HWND)lParam == button)
        {               
            TCHAR* buffer = new TCHAR[150];

            GetWindowText(textBoxInput,buffer,150);

            SetWindowText(textBoxOutput,buffer);
            //AppendWindowText(textBoxOutput,buffer,150) - I haven't found such function;           
                    delete [] buffer;       
        }
        break;

        case WM_PAINT:          
            {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            HBRUSH pedzel;

            pedzel = CreateSolidBrush(RGB(10,250,10));

            FillRect(hdc, &ps.rcPaint, pedzel);

            EndPaint(hwnd, &ps);
            return 0;
            }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

在简介:此程序创建两个文本框和启动复制从第一到第二内容的处理的按钮。在 SetWindowText函数功能使清洗输出框,什么明显是不希望的。

In brief: this program creates two textBoxes and a button that launches a process of copying a content from the first to the second. The SetWindowText function causes cleaning the output box , what obviously isn't desired.

的杰里Cofinn的答案后更新

SendMessage(textBoxOutput,EM_SETSEL,-1,-1); //no difference between passing 0 or -1
SendMessage(textBoxOutput,EM_REPLACESEL,TRUE,(LPARAM)buffer);

出人意料的是,它的 prepends 的文字。我读过文档有关EM_SETSEL,我仍然不知道为什么没有把原始输入结尾。

Surprisingly, it prepends the text. I've read the documentation about EM_SETSEL and I'm still wondering why doesn't it place the raw input at the end.

有关文本框(编辑控件)插入符号基本上是一个选择的开始和结束在同一个地方。

For a text box (edit control) the caret is basically a "selection" that start and end at the same place.

使用SetSel创建一个选择启动,并在控制目前的最后一个字符后结束,然后使用ReplaceSel来更换新文本空选择。

Use SetSel to create a selection that starts and ends after the last character currently in the control, then use ReplaceSel to replace that empty selection with new text.

由于您使用原始的Win32 API, SetSel

Since you're using the raw Win32 API, SetSel will be

SendMessage(your_control, EM_SETSEL,-1, -1);

...和 ReplaceSel 将是:

SendMessage(your_control, EM_REPLACESEL, TRUE, string_to_add);

糟糕 - 作为后记的问题指出,这并不工作原样。你需要开始与 WM_GETTEXTLENGTH (或 GetWindowTextLength )来获取文本的长度,然后将选择到端(即开头和结尾都等于你刚刚得到的长度),则更换的选择。我道歉 - 我应该大概知道比像这样的东西,我没有在一段时间做交易时从内存中去。

Oops -- as noted in the postscript to the question, this doesn't work as-is. You need to start with WM_GETTEXTLENGTH (or GetWindowTextLength) to get the length of the text, then set the selection to the end (i.e., the beginning and end both equal to the length you just got), then replace the selection. My apologies -- I should probably know better than to go from memory when dealing with something like this that I haven't done in a while.