Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI и SetCaretPos(), позиция каретки после WM_SETTEXT 
V
    Опции темы
Dogo
  Дата 6.8.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



После получения текста edit контролом, с помощью сообщения WM_SETTEXT, каретка отказывается перемещаться при помощи функции SetCaretPos()
Код

LRESULT CALLBACK NotepadWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hWndClient, hWndFrame, hWndTextInput;
    static RECT childRect;
    int            wmId, wmEvent;
         HDC            hdc;
    PAINTSTRUCT ps;    
    char text[]="text, text, text...";

    GetClientRect(hWnd, &childRect);

    switch(iMsg)
    {
        case WM_CREATE:
            hdc=GetDC(hWnd);
            hWndClient = GetParent(hWnd);
            hWndFrame  = GetParent(hWndClient);
            hWndTextInput = CreateWindow("edit", "", ES_MULTILINE | WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL, \
                                         childRect.left, childRect.top, childRect.right, childRect.bottom,\
                                         hWnd, (HMENU)TEXT_INPUT, hInst, NULL);
            break;

            case WM_COMMAND:
                wmId    = LOWORD(wParam); 
                wmEvent = HIWORD(wParam);
                switch (wmId)
                {
                case TEXT_INPUT:
                    switch(wmEvent)
                    {
                        case EN_CHANGE:
                            SendMessage(GetDlgItem(hWnd, TEXT_INPUT), \
                                        WM_SETTEXT, \
                                        0, \
                                        (LPARAM)text);
                            
                            SetCaretPos(20,2);
                            break;                

                    }
                    break;
                }    
                break;
...

В приложении файлы проекта VS2003

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  CARETandMDI.rar 23,71 Kb
--------------------
 
PM MAIL ICQ   Вверх
Dogo
  Дата 6.8.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решение проблемы оказалось банальным ...
Код

InvalidateRect(hWnd, NULL, true);
UpdateWindow(hWnd);

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


Шустрый
*


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

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



Поспешил я с выводами, InvalidateRect помогает только в SDI, в MDI приложении такой способ не работает, причем если убрать сообщение WM_SETTEXT тогда каретка перемещается, но после вызова не слушается... InvalidateRect делаю от hWndClient

Это сообщение отредактировал(а) Dogo - 6.8.2007, 23:21
--------------------
 
PM MAIL ICQ   Вверх
Dogo
  Дата 7.8.2007, 01:00 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил проблему так:
Код
SendMessage ( hWndTextInput,  EM_SETSEL,  iCurCharIndex,  iCurCharIndex ) ;

Где hWndTextInput - дескриптор edit контрола в который производится ввод,
iCurCharIndex - индекс символа рядом с которым должна появиться каретка. 
Так как индекс начала и конца выделения совпадают, фактически никакого выделения не будет.  smile 

--------------------
 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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