Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выделение текста в ComboBox после пперемешения 
V
    Опции темы
Cheloveck
Дата 29.4.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Код

class CTestMFCDlg : public CDialog
{
// Construction
public:
    virtual ~CTestMFCDlg();
    CTestMFCDlg(CWnd* pParent = NULL);    // standard constructor

// ...........................

    DECLARE_MESSAGE_MAP()
private:
    CComboBox *combobox;
    CComboBox *combobox2;
};

Код

CTestMFCDlg::CTestMFCDlg(CWnd* pParent)
    : CDialog(CTestMFCDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    combobox = new CComboBox;
    combobox2 = new CComboBox;
}


CTestMFCDlg::~CTestMFCDlg()
{
    delete combobox;
    delete combobox2;
}

BOOL CTestMFCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);    
    SetIcon(m_hIcon, FALSE);

    combobox->Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
         WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS, CRect(10, 10, 150, 30), this, 0);

    combobox2->Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
         WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS, CRect(10, 150, 150, 180), this, 0);

    combobox->AddString(_T("one"));
    combobox->SetCurSel(0);

    combobox2->AddString(_T("two"));
    combobox2->SetCurSel(0);

    combobox->MoveWindow(CRect(20, 20, 160, 40));
    combobox2->MoveWindow(CRect(120, 120, 250, 140));

    return TRUE;
}


user posted image

Я сам вполне понимаю глупость ситуации. Но не может быть два фокуса!!!

Это сообщение отредактировал(а) Cheloveck - 29.4.2009, 16:26


--------------------
user posted image
PM Jabber   Вверх
Cheloveck
Дата 30.4.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Не, ну это уже перебор....

Код

#include "windows.h"

LRESULT CALLBACK WndProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam)
{
    switch(Message)
    {
    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}


int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE  hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX wcp = { sizeof(WNDCLASSEX) };
    wcp.lpfnWndProc = WndProc;
    wcp.hInstance = hInstance;
    wcp.hCursor = LoadCursor(NULL,IDC_ARROW);
    wcp.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    wcp.lpszClassName = L"Window";
    RegisterClassEx(&wcp);

    HWND hWndMainForm = CreateWindowEx(0, L"Window",L"Window", WS_OVERLAPPEDWINDOW, 
        300, 150, 500, 400, NULL, NULL, hInstance, NULL);

    HWND combobox = CreateWindowEx(0, L"COMBOBOX", NULL, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, 
        10, 10, 100, 40, hWndMainForm, NULL, hInstance, NULL);

    SendMessage(combobox, CB_ADDSTRING, 3, (LPARAM)L"one");
    SendMessage(combobox, CB_SETCURSEL, 0, 0);

    ShowWindow(hWndMainForm, nShowCmd);
    UpdateWindow(hWndMainForm);
    SetWindowPos(combobox, HWND_BOTTOM, 60, 20, 100, 40, SWP_NOACTIVATE | SWP_NOZORDER);

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


Опять всё то же... Я тут подумал, а если фокус помещается на комбобокс при перемещении, а потом уходит дальше, а выделение остаётся?
Может есть какой-то флаг при создании комбобокса (или даже главного окна), чтобы текстовые поля без фокуса не выделялись?

Это сообщение отредактировал(а) Cheloveck - 30.4.2009, 13:34


--------------------
user posted image
PM Jabber   Вверх
voov
Дата 30.4.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Cheloveck, елси поменять местами вызовы SetCurSel и MoveWindow, то выделения нет. 
Код

    combobox->MoveWindow(CRect(20, 160, 160, 180));

    combobox->AddString(_T("one"));
    combobox->SetCurSel(0);

такое решение устроит?
PM MAIL   Вверх
voov
Дата 30.4.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



елси использовать стиль CBS_DROPDOWNLIST вместо CBS_DROPDOWN, тоже помогает

Добавлено через 3 минуты и 11 секунд
и вот еще такой код не оставляет выделения:
Код

    combobox->AddString(_T("one"));
    combobox->SetCurSel(0);

    combobox2->AddString(_T("two"));
    combobox2->SetCurSel(0);

    combobox->MoveWindow(CRect(20, 160, 160, 180));
    combobox->SetFocus();
    combobox2->MoveWindow(CRect(120, 120, 250, 140));
    combobox2->SetFocus();

PM MAIL   Вверх
Cheloveck
Дата 5.5.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата

такое решение устроит? 

Нет, не устроит, ибо мне надо перемещать после добавления и выбора строки.
Цитата

елси использовать стиль CBS_DROPDOWNLIST вместо CBS_DROPDOWN, тоже помогает

Мне нужно редактируемое поле.
Цитата

CBS_DROPDOWNLIST   Similar to CBS_DROPDOWN, except that the edit control is replaced by a static-text item that displays the current selection in the list box.

Ясно сказано, что текстовое поле заменяется статиком. Хотя в результате моей Spy-атаки на Explorer, я выяснил, что Microsoft всё же использует CBS_DROPDOWNLIST, вероятно проводя какие-то манипуляции по замене статика эдитом.

Фокус убирать я тоже пробовал, НО, мне нужно перемещать контролы при изменении размера окна. И если постоянно снимать фокус - то выделение мерцает.

//==========================================================================

Очень интересные результаты показало исследование сообщений, при изменении размера комбобокса, точнее эдита в нём:
Код

<00001> 002802AA S WM_WINDOWPOSCHANGING lpwp:0015F764
<00002> 002802AA R WM_WINDOWPOSCHANGING
<00003> 002802AA S WM_GETTEXTLENGTH
<00004> 002802AA R WM_GETTEXTLENGTH cch:3
<00005> 002802AA S WM_GETTEXT cchTextMax:8 lpszText:0015EE8C
<00006> 002802AA R WM_GETTEXT cchCopied:3 lpszText:0015EE8C ("o")
<00007> 002802AA S WM_SETTEXT lpsz:0015F6D8 ("one")
<00008> 002802AA R WM_SETTEXT fSucceeded:True
<00009> 002802AA S EM_SETSEL nStart:0 nEnd:2147483647
<00010> 002802AA R EM_SETSEL
<00011> 002802AA P WM_PAINT hdc:00000000
<00012> 002802AA S WM_NCPAINT hrgn:00000001
<00013> 002802AA R WM_NCPAINT
<00014> 002802AA S WM_ERASEBKGND hdc:0101091F
<00015> 002802AA R WM_ERASEBKGND fErased:True

То есть, выделение устанавливается не так, как было прочитано, а EM_SETSEL nStart:0 nEnd:2147483647.

Тем не менее решение найдено!!! Не оптимальное, но в моём случае достаточное.

Код

class ComboBox : public CComboBox
{
    DECLARE_MESSAGE_MAP();
public:
    virtual void OnSize(UINT nTipe, int cx, int cy);
};

BEGIN_MESSAGE_MAP(ComboBox, CComboBox)
    ON_WM_SIZE()
END_MESSAGE_MAP()

void ComboBox::OnSize(UINT nTipe, int cx, int cy)
{
    DWORD sel = GetEditSel();
    CComboBox::OnSize(nTipe, cx, cy);
    SetEditSel(HIWORD(sel), LOWORD(sel));
}


Плюс к этому при изменении размеров я ввёл таймер, который производит перемещение контролов каждые 100 миллисекунд (собственно как в Qt). Мерцания не видно, выделение текста сохраняется, что и требовалось.

P.S. тема закрыта.

Это сообщение отредактировал(а) Cheloveck - 5.5.2009, 16:08


--------------------
user posted image
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.