Windows Mobile 6.1 - Изменение размера окна HTMLControl на Soft Keyboard Показать / Скрыть - PullRequest
0 голосов
/ 21 марта 2011

Так что это распространенная проблема, и она была решена в нескольких местах, но не относится к элементу управления HTML в Windows Mobile 6.1 professional.

Так вот моя проблема

  • A WC_HTML Элемент управления HTML, созданный как дочернее окно окна приложения Windows Mobile.
  • HTML Control обслуживает HTML-страницы с редактируемыми полями.
  • Когда полная страница заполнена редактируемыми полями, а пользователь использует программную клавиатуру, для полей внизу страницы программная клавиатура перекрывает несколько полей.

Что я определенно пропустил, так это изменил размер окна на основе событий открытия / скрытия программной клавиатуры.

Что я уже пробовал

  • Первый подход - Использование глобально объявленного объекта SHACTIVATEINFO sai;, который инициализируется перед созданием окна родительского контейнера, который затем передается в методы WM_SETTINGCHANGE и WM_ACTIVATE WndProc (как объяснено ) здесь ). Это не имеет желаемого эффекта. Я пробовал оба - передать родительский HWND (как рекомендуется), а также HWND Web Control - ничего не происходит.

    case WM_ACTIVATE: SHHandleWMActivate(hWnd, wParam, lParam, &sai, 0); break;

    case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam, lParam, &sai); break;

  • Второй подход - также попытался вручную изменить размер окна на основе события клавиатуры, проверив событие с помощью SIPINFO si;, а затем с помощью si.fdwFlags, чтобы определить, скрыта ли программная клавиатура или не

    case WM_SETTINGCHANGE: {
           SIPINFO si;
           switch( wParam ) 
           {
               case SPI_SETSIPINFO: {
               memset( &si, 0, sizeof( si ) );
               si.cbSize = sizeof( si );
               if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) ) {
                   RECT rcMenuBar;
                   // Get the size of the menu bar
                   GetWindowRect(g_hWndMenuBar, &rcMenuBar);
                   // Keyboard opens up
                   if(si.fdwFlags == 0x00000003) { 
                       MoveWindow(webControlHWND, 0, 0, (si.rcVisibleDesktop.right - si.rcVisibleDesktop.left), (si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top), TRUE);          
                   } else if(si.fdwFlags == SIPF_DOCKED) { 
                         // keyboard closes down - weird that this msg comes when keyboard is closed instead of SIPF_OFF
                         // visible area above menu bar
                         si.rcVisibleDesktop.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
                         MoveWindow(webControlHWND, 0, 0, (si.rcVisibleDesktop.right - si.rcVisibleDesktop.left), (si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top), TRUE);            
                   }
                }
             break;
           }
         }
    break;
    }
    

Этот второй подход вызывает странные не объяснимые проблемы - вот что я заметил

  1. Если я отправил одно из редактируемых полей для фокусировки с помощью JS, SETTINGCHANGED в Windows Mobile будет запущен для (si.fdwFlags == 0x00000003), для которого выполняется вызов MoveWindow() для изменения размера окна в меньшую видимую область (после клавиатура появляется), и появляется другое сообщение (происходит автоматически) - возможно, из-за MoveWindow(), и программная клавиатура закрывается, а размер окна изменяется до полного экрана. После отладки я вижу, что когда открыта программная клавиатура, полученное сообщение сначала 0x00000003, а затем 0x00000002 (SIPF_DOCKED) для закрытия.

  2. После того, как # 1 произойдет, иногда поле не реагирует на нажатия на сенсорном экране (не может сфокусироваться на поле), но можно перейти к полю с помощью панели навигации или клавиш со стрелками на клавиатуре. Так что это большая проблема, вызванная проблемой # 1, когда клавиатура подсвечивается, а затем автоматически скрывается. Хотя я могу силой нажать на мягкую клавиатуру, используя кнопку (функция автоматического переключения из-за изменений потеряна).

Кто-нибудь сталкивался с этой проблемой раньше? Я надеюсь, что каждый, кто использовал HTMLControl для Windows Mobile 6.1 professional, столкнулся с такой же проблемой.

ОБНОВЛЕНИЕ - 22Mar2011-11: 27 AM Здесь мое родительское окно не обрабатывает методы WM_SETFOCUS или WM_KILLFOCUS, вместо этого дочерний элемент управления HTML (WC_HTML), вероятно, будет обрабатывать их. Беспокойство здесь заключается в том, что цикл обмена сообщениями родительского окна HWND получает сообщение WM_SETTINGSCHANGE, которое необходимо преобразовать в дочернее окно. Я также попытался сделать то же самое, что и образец HandleSIP для Windows Mobile SDK, в котором объект SHACTIVATEINFO memset() каждый раз принимается при получении сообщения - в отличие от ранее, где оно хранилось глобально, а memset() делается один раз до этого. окно создано или в WM_CREATE

case WM_CREATE : {
    memset(&sai, 0, sizeof(SHACTIVATEINFO));
    break;
}
case WM_ACTIVATE:
    if (SPI_SETSIPINFO == wParam){
        memset(&sai, 0, sizeof(SHACTIVATEINFO));
        SHHandleWMActivate(webControlHWND, wParam, lParam, &sai, 0);
    }
    break;
case WM_SETTINGCHANGE: {
    if (SPI_SETSIPINFO == wParam){
        memset(&sai, 0, sizeof(SHACTIVATEINFO));
        SHHandleWMSettingChange(webControlHWND, wParam, lParam, &sai);
    }
    break;
}

как для родительского окна, так и для HTML Control HWND, который тоже не работает - клавиатура накладывается на редактируемое поле (без изменения размера окна), и окно больше не принимает сообщения (зависает)

1 Ответ

0 голосов
/ 24 августа 2011

Так что я действительно нашел обходной путь для этой проблемы. В Windows Mobile есть какая-то ошибка, которая приводит к зависанию экрана, если на экране отсутствует HTML <1 страница. Итак, окончательное решение </p>

1) Придерживайтесь обработки WM_SETTINGCHANGE сообщения только тогда, когда на телефоне нет физической клавиатуры. Если да, то я бы позволил моей программной клавиатуре перекрывать видимые поля. Обратите внимание, что если устройство имеет физическую клавиатуру, программная клавиатура не появляется по умолчанию, если она не вызывается явно, и после этого сохраняет это поведение ..

case WM_SETTINGCHANGE: {
   SIPINFO si;
   switch( wParam ) 
   {
       case SPI_SETSIPINFO: {
       memset( &si, 0, sizeof( si ) );
       si.cbSize = sizeof( si );
       if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) ) {
           RECT rcMenuBar;
           // Get the size of the menu bar
           GetWindowRect(g_hWndMenuBar, &rcMenuBar);
           // Keyboard opens up
           if(si.fdwFlags == 0x00000003) { 
           } else if(si.fdwFlags == SIPF_DOCKED || si.fdwFlags==10) { 
                 // keyboard closes down - weird that this msg comes when keyboard is closed instead of SIPF_OFF
                 // visible area above menu bar
                 si.rcVisibleDesktop.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
           }
           MoveWindow(webControlHWND, 0, 0, (si.rcVisibleDesktop.right - si.rcVisibleDesktop.left), (si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top), TRUE);          

        }
     break;
   }
 }
 break;
 }

2) Внедрить прозрачный PNG-файл длиной в 1 страницу Если в телефоне нет физической клавиатуры, убедитесь, что в конце каждого HTML-кода отображается «прозрачный PNG-файл длиной 1 страница». Я знаю, что большинство людей не могут этого сделать, так как HTML происходит из других источников. Но это то, что я сделал, и это работает сейчас. Это только для того, чтобы избавиться от проблемы зависания, которая происходила другим образом. Это гарантирует, что все страницы имеют полосу прокрутки без беспокойства о содержании. Недостатком является то, что пользователь может прокручивать пустое пространство внизу (хотя это ни на что не повлияет).

p.s - Это была удачная находка, и я действительно не знаю, почему у MS тоже такая хромая ошибка. Пока я тестировал свое приложение с более длинной версией HTML, оно всегда работало, а мои реальные тесты - нет. Именно тогда я попробовал пустой PNG в конце, и это сработало. :)

...