2013-10-27 3 views
1

Я хочу добавить текст в элементе управления списком в дочерний элемент моего главного окна. Ребенок по существу является элементом управления редактированием, но не является диалогом. Я пробовал несколько разных функций уже без успеха, я считаю, что моя проблема в том, что мне нужно каким-то образом переключить фокус из диалогового окна на дочернее окно перед добавлением текста. Я бы предпочел не получать ответ с определенным кодом, но если бы я мог указать на полезную функцию или концепцию, это было бы здорово!Получить текст в элементе управления списком, добавленном в дочернее окно

EDIT: Список является частью большего диалогового окна, которое позволяет пользователю вводить текст, а затем добавлять его в список. Эти функции работают очень хорошо. То, что я хотел бы сделать, - это получить текст, который добавлен в список, перемещенный в дочернее окно, когда пользователь нажимает кнопку в диалоговом окне, предпочтительно без необходимости выбирать элементы перед нажатием кнопки.

Там много кода, но я думаю, что эти части являются релевантными:

Детского окно:

case WM_CREATE: 
     { 
     hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
      WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 
      0, 0, 100, 100, w, (HMENU) IDC_EDIT, NULL, NULL); 

     if (hEdit == NULL){ 
      MessageBox(NULL, "Could not create child window :(", "ERROR", MB_ICONEXCLAMATION | MB_OK); 
      return 0; 
     } 
    } 
     break; 

    case WM_SIZE: 
     { 
      RECT wSize; 

      GetClientRect(w, &wSize); 
      SetWindowPos(hEdit, NULL, 0, 0, wSize.right, wSize.bottom, NULL); 
     } 

Функция добавления текста в дочернем окно, нажав кнопку в диалоговом окне (HWND HEdit, дочернее окно, определяется глобально):

case ID_ADDMAIN: 
      { 
      HWND hList = GetDlgItem(w, IDC_LIST1); 
      int count = SendMessage(hList, LB_GETCOUNT, NULL, NULL); 

      if (count > 0){ 

       DWORD textLength = GetWindowTextLength(hList); 

       LPSTR alloc; 

       alloc = (LPSTR) GlobalAlloc(GPTR, textLength + 1); 
       if(GetWindowText(hList, alloc, textLength + 1)){ 

        SendMessage(hEdit, WM_SETTEXT, NULL, (LPARAM) alloc); 
       } 

       GlobalFree(alloc); 
      } 
      else{ 
       MessageBox(NULL, "There's nothing to add!", "???", MB_ICONINFORMATION | MB_OK); 
      } 
     } 
      break; 

Кроме функции SendMessage, я также попытался SetWindowText и я пытался получать каждую строку в ListBox отдельно, используя цикл for, а не GetWindowText. Спасибо заранее за вашу помощь.

+0

Где объявляется 'hEdit'? –

+0

Это глобальная переменная, поэтому она вне всех моих функций. – user2924162

ответ

1

Вы неправильно поняли список. Сообщение LB_GETCOUNT используется для получения количества элементов (строк) в списке. (Не количество символов.)

GetWindowText не подходит для списка: он получает текст заголовка, но в окне списка нет заголовка. Что вы можете сделать со списком, это выяснить, какая строка выбрана (LB_GETCURSEL), а затем получить текст из этой строки (LB_GETTEXT).

+0

Я использую LB_GETCOUNT, чтобы убедиться, что в окне списка есть что-то (отсюда if (count> 0)), прежде чем продолжить. Согласно файлам справки в GetWindowText: «Если указанное окно является элементом управления, текст элемента управления копируется». Список будет считаться контрольным, согласно MSDN ... Я также попробую ваше предложение, спасибо за ввод! – user2924162

+0

Возможно, я тоже неправильно читаю файлы справки, я возьму ваше слово, я думаю, что это просто странно. – user2924162

+0

@ user2924162 Каждое окно имеет текст, поэтому есть API GetWindowText. Элемент управления - это окно, но свойство Text пусто. – manuell

1

Ниже приведен список функций, которые я написал для моего класса WINAPI библиотеки ..

int ListBox::GetItemCount() const 
    { 
     return SendMessage(Control::GetHandle(), LB_GETCOUNT, 0, 0); 
    } 

    int ListBox::GetSelectedIndex() const 
    { 
     return SendMessage(Control::GetHandle(), LB_GETCURSEL, 0, 0); 
    } 

    void ListBox::SetSelectedIndex(int Index) 
    { 
     SendMessage(Control::GetHandle(), LB_SETCURSEL, Index, 0); 
    } 

    void ListBox::AddItem(const tstring &Item, int Index) 
    { 
     SendMessage(Control::GetHandle(), Index == 0 ? LB_ADDSTRING : LB_INSERTSTRING, Index, reinterpret_cast<LPARAM>(Item.c_str())); 
    } 

    void ListBox::RemoveItem(int Index) 
    { 
     SendMessage(Control::GetHandle(), LB_DELETESTRING, Index, 0); 
    } 

    void ListBox::Clear() 
    { 
     SendMessage(Control::GetHandle(), LB_RESETCONTENT, 0, 0); 
    } 

    int ListBox::GetIndexOf(const tstring &Item) 
    { 
     return SendMessage(Control::GetHandle(), LB_FINDSTRINGEXACT, -1, reinterpret_cast<LPARAM>(Item.c_str())); 
    } 

    int ListBox::GetIndexPartial(const tstring &Item) 
    { 
     return SendMessage(Control::GetHandle(), LB_FINDSTRING, -1, reinterpret_cast<LPARAM>(Item.c_str())); 
    } 

    void ListBox::SetColumnWidth(int Width) 
    { 
     SendMessage(Control::GetHandle(), LB_SETCOLUMNWIDTH, Width, 0); 
    } 

    tstring ListBox::GetItem(int Index) const 
    { 
     std::vector<char> Buffer(SendMessage(Control::GetHandle(), LB_GETTEXTLEN, Index, 0) + 1); 
     SendMessage(Control::GetHandle(), LB_GETTEXT, Index, reinterpret_cast<LPARAM>(Buffer.data())); 
     return tstring(Buffer.begin(), Buffer.end()); 
    } 

Вам понадобятся:

ListBox::GetItem(ListBox::GetSelectedIndex()); 

получить текст текущего элемента в списке ..

Для управления Edit, у меня есть:

void TextBox::SetReadOnly(bool ReadOnly) 
{ 
    SendMessage(Control::GetHandle(), EM_SETREADONLY, ReadOnly, 0); 
} 

void TextBox::SetPassword(bool Enabled, char PasswordChar) 
{ 
    SendMessage(Control::GetHandle(), EM_SETPASSWORDCHAR, Enabled ? PasswordChar : 0, 0); 
} 

std::uint32_t TextBox::GetTextLength() const 
{ 
    return GetWindowTextLength(Control::GetHandle()); 
} 

void TextBox::ShowScrollBar(bool Show, int wBar) 
{ 
    ::ShowScrollBar(Control::GetHandle(), wBar, true); 
} 

void TextBox::AppendText(const tstring &Text) const 
{ 
    SendMessage(Control::GetHandle(), EM_SETSEL, -1, -1); 
    SendMessage(Control::GetHandle(), EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(Text.c_str())); 
} 

tstring TextBox::GetText() const 
{ 
    std::vector<TCHAR> Buffer(GetWindowTextLength(Control::GetHandle()) + 1); 
    GetWindowText(Control::GetHandle(), Buffer.data(), Buffer.size()); 
    return tstring(Buffer.begin(), Buffer.end()); 
} 

void TextBox::SetText(const tstring &Text) 
{ 
    this->Title = Text; 
    SetWindowText(Handle, Text.c_str()); 
} 

Вы можете легко получить текст из окна редактирования. Надеюсь, вам это очень поможет.

Смежные вопросы