2012-09-21 6 views
2

다음 코드는 자체적으로 설명해야한다고 생각합니다.TextBox에 텍스트를 추가하는 방법?

#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); 
} 

요약하면 :이 프로그램은 두 개의 textBoxes와 첫 번째부터 두 번째까지 내용을 복사하는 프로세스를 시작하는 버튼을 만듭니다. SetWindowText 함수를 사용하면 출력 상자를 정리할 수 있습니다. 제리 Cofinn의 대답 후

업데이트

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

놀랍게도, 앞에 추가 텍스트. 나는 EM_SETSEL에 대해 the documentation을 읽었으며, 왜 아직도 원시 입력을 끝내지 않는지 궁금합니다.

+0

선택 항목 설정 및 조정에 대한 자세한 내용은 'TextBoxBase.AppendText'에 대한 [.NET 참조 소스] (https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/)를 참조하십시오. WinForms/TextBoxBase.cs, 5194bb23bd26ed3e) 도움이 될 수도 있습니다 – Slai

답변

8

텍스트 상자 (편집 컨트롤)의 경우 캐럿은 기본적으로 같은 위치에서 시작하고 끝나는 "선택 사항"입니다.

SetSel을 사용하여 현재 컨트롤에있는 마지막 문자 다음에 시작하고 끝나는 선택 영역을 만든 다음 ReplaceSel을 사용하여 빈 선택 영역을 새 텍스트로 바꿉니다.

당신은 원시의 Win32 API를 사용하고 있기 때문에, SetSel

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

될 것입니다 ... 그리고 ReplaceSel은 다음과 같습니다

SendMessage(your_control, EM_REPLACESEL, TRUE, string_to_add); 

아차 - 질문에 대한 후기에서 언급 한 바와 같이 , 이것은있는 그대로 작동하지 않습니다. 텍스트 길이를 얻으려면 WM_GETTEXTLENGTH (또는 GetWindowTextLength)으로 시작한 다음 선택 항목을 끝으로 설정해야합니다. 즉, 시작과 끝 모두 방금 얻은 길이와 같아야합니다. 그런 다음 선택 항목을 바꿉니다. 사과드립니다. 내가 한동안하지 않았던 이와 같은 것을 처리 할 때 기억에서 벗어나는 것보다 더 잘 알아야합니다.

+1

좋은 것. 나는 결코 그것을 알지 못했다. – chris

+0

'EM_SETSEL'에'wParam = -1'과'lParam = -1'을 사용하면 현재 선택을 제거하지만 현재 텍스트의 끝으로 캐럿을 이동시키지 않습니다. 텍스트의 가운데에 캐럿이 있으면 끝 대신 중간에 새 텍스트를 삽입합니다. 'EM_REPLACESEL'을 보내기 전에 캐럿을 올바르게 위치시켜야합니다. –

+1

'EM_REPLACESEL'은 EDIT 컨트롤에 추가하는 올바른 방법입니다. 'EM_SETSEL'의 세부 사항을 정돈해야 할 수도 있지만 이것이 받아 들여 져야 할 대답입니다. 컨트롤을 가져와 추가 작업을 수행합니다. 앱에 텍스트를 추가하는 것은 낭비적이고 ** 모든 것을 ** 다시 컨트롤로 보냈습니다. –

3
  1. 텍스트의 길이를 찾으려면 GetWindowTextLength을 사용하십시오.
  2. 해당 길이와 추가 된 텍스트의 길이에 null을 더한 동적 문자 배열 (std::vector<TCHAR>)을 만듭니다.
  3. GetWindowText을 사용하면 현재 텍스트를 저장할 수 있습니다.
  4. 첨부 된 텍스트를 추가하십시오 (예 : _tcscat).
  5. SetWindowText을 사용하면 모든 것을 텍스트 상자에 넣을 수 있습니다. 요약

:

int len = GetWindowTextLength(textbox); 
std::vector<TCHAR> temp(len + lengthOfAppendedText + 1); 

GetWindowText(textbox, temp.data(), temp.size()); 
_tcscat(temp.data(), appendedText); 
SetWindowText(textbox, temp.data()); 

당신이 C++ (11)를 사용하지 않는 경우, &temp[0]temp.data()를 교체합니다. C와 호환되어야한다면 std::vector 대신 mallocfree으로 돌아갑니다.하지만 크기 조정이 없다고 생각하면 별 도움이되지 않습니다.

+1

두 가지 길이를 모두 알고 있기 때문에 크기를 조정할 필요가 없습니다. – Marlon

+0

@ Marlon, 좋은 지적, 나는 그것을 바꿀 것이다. – chris

+0

'char'을 사용하지 말고,'TCHAR' (또는 8 비트 OS를 다시 대상으로하지 않을 것임을 알게되면'wchar_t')을 사용하십시오. –

관련 문제