Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.068 c
15-1189765740
pasha_golub
2007-09-14 14:29
2007.10.28
[Fatal Error] Internal error: L681


2-1191434154
Riply
2007-10-03 21:55
2007.10.28
Различное поведение в зависимости от юнита.


6-1168705868
vidiv
2007-01-13 19:31
2007.10.28
сетевой select в INDY


3-1182192180
Lavrenty
2007-06-18 22:43
2007.10.28
Не работает сообщение (из триггера)


2-1191236054
sydenis
2007-10-01 14:54
2007.10.28
неявное связывание с bpl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский