Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Неактивируемое окно   Найти похожие ветки 

 
MultIfleX   (2007-08-13 11:37) [0]

Необходимо создать обыкновенную VCL форму, при нажатии на которую мышью не устанавливался на неё фокус. пробывал перехват сообщений и установку параметров в CreateParams но не помогло. может что не так? Подскажите если кто встречался с такой задачей.


 
Сергей М. ©   (2007-08-13 11:54) [1]

Установи у формы BorderStyle = bsNone,
брось на форму любой компонент-наследник TWinControl, установи его св-ва Enabled = False, Align = alClient


 
MultIfleX   (2007-08-13 12:04) [2]

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


 
MultIfleX   (2007-08-13 12:05) [3]

ЗЫ, сообщения то от мыша надо не блокировать а обрабатывать :)


 
Сергей М. ©   (2007-08-13 12:07) [4]


> сообщения то от мыша надо не блокировать а обрабатывать


Ну и обрабатывай их себе на здоровье)
Зачем же для этого лишать окно фокуса ?


 
Lacmus ©   (2007-08-13 12:10) [5]

>MultIfleX

WS_EX_NOACTIVATE ?


 
MultIfleX   (2007-08-13 12:13) [6]

WS_EX_NOACTIVATE пробывал, блин не получаеццо. ставил флаг в CreateParams к exStyle через or :)) не помогло. Окно показываю через
ShowWindow( handle , sw_shownoactvate );

> Ну и обрабатывай их себе на здоровье)Зачем же для этого
> лишать окно фокуса ?

ну блин вот охото мне лишать окно фокуса :) точнее не лишать фокуса другое окно :)


 
Сергей М. ©   (2007-08-13 12:17) [7]


> точнее не лишать фокуса другое окно


А чем плох вариант с обработкой события OnActivate формы, которая получает нежелательный фокус ?

В обработчике достаточно просто вернуть фокус той форме, которая его потеряла.


 
MultIfleX   (2007-08-13 12:20) [8]

Мне кажется что сделать что то со своим окном гораздо прощще чем возвращать фокус, окну во-первых не всегда моему, а во вторых, видеть это мигание. К томуже окно у которого я заберу фокус очень к его потери чувствительно, а именно закрывается нафиг. блин ну у popup menus"ов както же сделано???


 
MultIfleX   (2007-08-13 12:23) [9]

По мне дак надо перехватить кокоенибудь SystemMessage и не дать ему хода.... но чегото у мну не получаетццо оно. :( я аж грустен стал :) помогите люди опытные !!


 
MultIfleX   (2007-08-13 12:50) [10]

Что, так никто ничего и не придумал??? сложновато чтоли слишком? :)


 
{RASkov} ©   (2007-08-13 12:59) [11]

> [6] MultIfleX   (13.08.07 12:13)


> [10] MultIfleX   (13.08.07 12:50)

Тебе нужно на "безфокусной" форме использовать "безфокусные" контролы.... имхо.... это они фокус отбирают(принимают).
Вопрос у тебя интересный.... я тоже как-то бился над этой "проблемой", хотел некое подобие попам меню свое сделать с возможностью не закрывать его после клика мышью на его контролах.... так и забросил это дело...
Если решишь - напиши решение здесь, ок?


 
MultIfleX   (2007-08-13 13:02) [12]

Да в принципе задача в том и заключается что делаю красивые по_пупы, но то что они забирают фокус у ПАП и МАМ не есть хорошо. решу проблему напишу сюда, тем не менее, Господа мастера, не расслабляйтесь и также пробуйте :) возможно и решите этот квест :)


 
Lacmus ©   (2007-08-13 13:07) [13]

WM_MOUSEACTIVATE, MA_NOACTIVATE ?


 
MultIfleX   (2007-08-13 13:40) [14]

сделал следующим образом, всё прекрасно заработало. буду точить на свои нужды :)
unit Unit2;

interface

uses
 Classes, Windows , messages;

procedure StartPopupWindow;

implementation

var
 cursor : TPoint;
threadvar
 Msg            : TMsg;
 wndClass       : TWndClass;
 PopupHandle    : Hwnd;
 SplashShowed   : Boolean;
 BlendFunc      : TBlendFunction;
 wdc            : LongWord;
 drawbmpHandle  : HBITMAP;
 Left, Top      : Integer;

Procedure OnPaint;
var
hb : LongWord;
i : Integer;
begin
hb := Windows.GetStockObject( WHITE_BRUSH );
FillRect( wdc , rect( 0 , 0 , 100 , 200 ) , hb );
DeleteObject( hb );
for i := 0 to 11 do
 begin
   moveToEx( wdc , 0, i*20 , NIL );
   LineTo( wdc , 100, i*20 );
 end;

end;

function WndProc(Wnd : HWND; message : UINT; wParam : Integer; lParam: Integer) : Integer; stdcall;
var
 ps     : TPaintStruct;
begin
Result := 0;
 case message of
   WM_PAINT:
     begin
       wdc := BeginPaint(Wnd, ps);
       OnPaint;
       EndPaint(Wnd, ps);
       Result := 0;
     end;
   WM_TIMER :
    begin

    end;
   WM_DESTROY:
    begin
    end;
   WM_LBUTTONDOWN:
    begin
      SendMessage( Wnd , WM_CLOSE , 0 , 0 );
    end
  else
     result := DefWindowProc(Wnd, message, wParam, lParam);
  end;
end;

Function  PopupThreadWnd( param : Pointer ):LongWord; stdcall;
begin
try
 left := cursor.X;
 top := cursor.Y;
 wndClass.style          := 0;
 wndClass.hCursor        := LoadCursor(0, IDC_ARROW);
 wndClass.lpfnWndProc    := @WndProc;
 wndClass.cbClsExtra     := 0;
 wndClass.cbWndExtra     := 0;            
 wndClass.hInstance      := hInstance;
 wndClass.hIcon          := 0;
 wndClass.lpszMenuName   := nil;
 wndClass.lpszClassName  := "class_my_popup_wnd";
//  wndClass.hbrBackground  := LongWord(GetStockObject(WHITE_BRUSH));
 RegisterClass( wndClass );

 PopupHandle := CreateWindow(
                             "class_my_popup_wnd",
                             "class my popup wnd",
                             WS_POPUp  ,
                             Left,       Top,
                             100,        200,
                             0,          0,
                             hInstance,  nil             );
 Windows.SetTimer( PopupHandle , 1 , 30 , NIL );
 SetWindowLong(PopupHandle, GWL_EXSTYLE, WS_EX_NOACTIVATE  );
 ShowWindow( PopupHandle , sw_shownoactivate );
 SetWindowPos( PopupHandle , HWND_TOPMOST , left , top , 100 , 200 , 0 );
 while(GetMessage(msg, 0, 0, 0)) do
  begin
   TranslateMessage(msg);
   DispatchMessage(msg);
  end;
 except
 end;
 Result := 0;
end;

procedure StartPopupWindow;
var
id     : Cardinal;
begin
GetCursorPos( cursor );
CreateThread( NIL , 0 , @PopupThreadWnd , nil , 0 , id );
end;

end.


если конечно никого не смущщает что использован отдельный поток.


 
MultIfleX   (2007-08-13 13:45) [15]


> Lacmus ©   (13.08.07 13:07) [13]
> WM_MOUSEACTIVATE, MA_NOACTIVATE ?

респект. это гораздо прощще :):)


 
Leonid Troyanovsky ©   (2007-08-13 14:58) [16]


> MultIfleX   (13.08.07 11:37)  

> Необходимо создать обыкновенную VCL форму, при нажатии на
> которую мышью не устанавливался на неё фокус.

http://groups.google.com/group/borland.public.delphi.graphics/browse_thread/thread/f2d32af38bee139a/c40b0811b5c9f072#c40b0811b5c9f072

Можешь добавить и WS_EX_NOACTIVATE.
Ну, а для обработки мыши ставить WH_MOUSE_LL hook.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
2-1191824158
Quart
2007-10-08 10:15
2007.10.28
Текущая запись


3-1182263931
Tonich
2007-06-19 18:38
2007.10.28
Трансакция


15-1191409720
PPop
2007-10-03 15:08
2007.10.28
Ну как указать этот Main-Class в файле manifest.mf?


1-1186741765
Kolan
2007-08-10 14:29
2007.10.28
Одинаковые имена модулей в разных пакетах, как исправить


15-1190718469
passlight
2007-09-25 15:07
2007.10.28
Завораживающий боян :-)