Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Это как это такое может быть? Главное окно приложения теряет фокус. 
:(
    Опции темы
vaddsm
  Дата 19.7.2008, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Окно верхнего уровня имеет фокус ввода при этом заголовок окна находящегося под этим окном также остается активным!

Вот, что странно, цитата из мануала по WinAPI: 

Цитата

Активное окно (active window) - это окно верхнего уровня, с которым пользователь работает в данный момент. Чтобы пользователь мог легко определить активное окно, Windows помещает его на вершину Z-порядка и изменяет цвет его заголовка и рамки на цвет, который определен системой для активного окна. Только окно верхнего уровня может быть активным окном. Когда пользователь работает с дочерним окном, Windows активизирует родительское окно верхнего уровня, связанное с этим дочерним окном.


Таким образом, словесно смоделируем ситуацию:  Предположим, что существует главное окно приложения (окно №0). По нажатию на UI элемент которого создается окно №1 со стилем: WS_OVERLAPPED | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, и Ex-стилем: WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_CONTROLPARENT. А уже на этом окне, в свою очередь создается поле ввода, окно №3 со стилем: WS_CHILD… 

Parent окна №1, в этом примере  – десктоп. 

В итоге у нас получается всплывающий поп-ап содержащий текстфилд, имеющий фокус ввода, но окно №0 при этом не окрашивается как не активное. Реализовано данное, без каких либо хаков заголовков окон, хуков и прочих жесточайших способов. Меня в данном случае вгоняет в ступор в работающем примере на мой взгляд описано полное противоречие того что сказано в документации WinAPI.

Этот работающий пример я прикрепил в аттач. Моя задача реализовать тоже самое но на нейтив коде, а для этого я должен понять логику создания этой замысловатой окноной системы. Прошу помочь, о гуру!!!

P.S Именно то, что я описывал - третий комбобокс.



Это сообщение отредактировал(а) vaddsm - 19.7.2008, 08:51

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  CustomComboDemo_v2.zip 34,41 Kb
PM MAIL   Вверх
vaddsm
  Дата 20.7.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тему закрываю, так как решение нашел. В приведенном примере в действительности окно главной формы после создания попап окна оставалось не активным. Визуально можно наблюдать некоторое перемигивание заголовка главной формы, такой эффект возникает как следствие потери окном активного состояния, но чтобы окно КАЗАЛОСЬ активным ему (видимо) отправляется сообщение WM_NCACTIVATE, wParam = TRUE. DefWindowProc съедает такое сообщение и рисует активный заголовок и рамку окна. 

Но гадкий эффект мерцания создает впечатление некоторой незавершенности и не профессиональности. В свою очередь пошел немного дальше и решил избавится от мерцания путем подмены параметра wParam сообщения WM_NCACTIVATE. Вот сыроватый пример на API приложения из 3-х окон, в котором реализовано то, о чем я говорил. 


Код

//---------------------------------------------------------------------------

#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#define ID_EDIT1 1000

#pragma argsused

LRESULT CALLBACK Proc_WindowPopup(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK Proc_WindowMain (HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam);

static HINSTANCE hInstance  = 0;
static HWND      hEditHwnd  = 0;
static HWND      hwnd_popup = 0;

WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

 hInstance = hInst;

 WNDCLASSEX wc;
 MSG wMsg;
 HWND hwnd_main;

 wc.cbSize           = sizeof(wc);
 wc.hbrBackground    = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
 wc.hCursor          = LoadCursor(hInstance,IDC_ARROW);
 wc.hInstance        = hInstance;
 wc.lpfnWndProc      = Proc_WindowMain;
 wc.lpszClassName    = "WindowMainClass";
 wc.style            = 0;//CS_VREDRAW|CS_HREDRAW;
 wc.hIcon            = 0;
 wc.hIconSm          = 0;
 wc.cbWndExtra       = 0;
 wc.cbClsExtra       = 0;
 wc.lpszMenuName     = 0;

 if(!RegisterClassEx(&wc)) return 1;

 hwnd_main = CreateWindowEx(0, wc.lpszClassName, "", WS_TILEDWINDOW,
 100, 100, 400, 300, 0, 0, hInstance, 0);

 if(!hwnd_main) return 1;

 ShowWindow(hwnd_main , SW_SHOW);
 ShowWindow(hwnd_popup, SW_SHOW);

 SetFocus(hEditHwnd);

// SendMessage(hwnd_main, WM_NCACTIVATE, TRUE, 0);        

 while (GetMessage(&wMsg, NULL, 0 ,0) == TRUE)
 {
  TranslateMessage(&wMsg);
  DispatchMessage(&wMsg);
 }

 return 0;

}


LRESULT CALLBACK Proc_WindowPopup(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{

 switch(wMsg)
 {

  case WM_CREATE:
  {



   hEditHwnd = CreateWindow("EDIT",
               0,
               WS_CHILD | WS_VISIBLE | WS_BORDER,
               5, 5, 100, 19, hwnd,
               (HMENU)ID_EDIT1,
               hInstance,
               0);

   return 1;

  }

  case WM_DESTROY:
  {
   PostQuitMessage(0);
   break;
  }

  default: return DefWindowProc(hwnd, wMsg, wParam, lParam);

 };

 return 0;

};

LRESULT CALLBACK Proc_WindowMain (HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{

 switch(wMsg)
 {

  case WM_CREATE:
  {

   MSG wMsg;
   WNDCLASSEX wc;

   wc.cbSize           = sizeof(wc);
   wc.hbrBackground    = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
   wc.hInstance        = hInstance;
   wc.hCursor          = LoadCursor(wc.hInstance,IDC_ARROW);
   wc.lpfnWndProc      = Proc_WindowPopup;
   wc.lpszClassName    = "WindowPopupClass";
   wc.style            = 0;
   wc.hIcon            = 0;
   wc.hIconSm          = 0;
   wc.cbWndExtra       = 0;
   wc.cbClsExtra       = 0;
   wc.lpszMenuName     = 0;

   if(!RegisterClassEx(&wc))  return 1;

   hwnd_popup =  CreateWindowEx ( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR |
                 WS_EX_CONTROLPARENT | WS_EX_TOPMOST
                 ,
                 wc.lpszClassName,
                 "",
                 //WS_OVERLAPPED | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER,
                 WS_OVERLAPPED | WS_POPUP | WS_CLIPCHILDREN | WS_BORDER,
                 100,
                 100,
                 150,
                 100,
                 0,
                 0,
                 hInstance,
                 0);

   return 1;

  }

  case WM_DESTROY:
  {
   PostQuitMessage(0);
   break;
  }

  
  case WM_NCACTIVATE:
  {
   wParam = TRUE;
   return DefWindowProc(hwnd, wMsg, wParam, lParam);
  }


  default: return DefWindowProc(hwnd, wMsg, wParam, lParam);

 };

 return 0;

};



//---------------------------------------------------------------------------


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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