![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неактивируемое окно [D7, WinXP]
MultIfleX © (2007-08-13 11:37:00)Необходимо создать обыкновенную VCL форму, при нажатии на которую мышью не устанавливался на неё фокус. пробывал перехват сообщений и установку параметров в CreateParams но не помогло. может что не так? Подскажите если кто встречался с такой задачей.
Leonid Troyanovsky (2007-08-13 14:58:00) [1]
> 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.
MultIfleX (2007-08-13 13:45:00) [2]
> Lacmus © (13.08.07 13:07) [13]
> WM_MOUSEACTIVATE, MA_NOACTIVATE ?
респект. это гораздо прощще :):)
MultIfleX (2007-08-13 13:40:00) [3]сделал следующим образом, всё прекрасно заработало. буду точить на свои нужды :)
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.
если конечно никого не смущщает что использован отдельный поток.
Lacmus (2007-08-13 13:07:00) [4]WM_MOUSEACTIVATE, MA_NOACTIVATE ?
MultIfleX (2007-08-13 13:02:00) [5]Да в принципе задача в том и заключается что делаю красивые по_пупы, но то что они забирают фокус у ПАП и МАМ не есть хорошо. решу проблему напишу сюда, тем не менее, Господа мастера, не расслабляйтесь и также пробуйте :) возможно и решите этот квест :)
{RASkov} (2007-08-13 12:59:00) [6]> [6] MultIfleX (13.08.07 12:13)
> [10] MultIfleX (13.08.07 12:50)
Тебе нужно на "безфокусной" форме использовать "безфокусные" контролы.... имхо.... это они фокус отбирают(принимают).
Вопрос у тебя интересный.... я тоже как-то бился над этой "проблемой", хотел некое подобие попам меню свое сделать с возможностью не закрывать его после клика мышью на его контролах.... так и забросил это дело...
Если решишь - напиши решение здесь, ок?
MultIfleX (2007-08-13 12:50:00) [7]Что, так никто ничего и не придумал??? сложновато чтоли слишком? :)
MultIfleX (2007-08-13 12:23:00) [8]По мне дак надо перехватить кокоенибудь SystemMessage и не дать ему хода.... но чегото у мну не получаетццо оно. :( я аж грустен стал :) помогите люди опытные !!
MultIfleX (2007-08-13 12:20:00) [9]Мне кажется что сделать что то со своим окном гораздо прощще чем возвращать фокус, окну во-первых не всегда моему, а во вторых, видеть это мигание. К томуже окно у которого я заберу фокус очень к его потери чувствительно, а именно закрывается нафиг. блин ну у popup menus'ов както же сделано???
Сергей М. (2007-08-13 12:17:00) [10]
> точнее не лишать фокуса другое окно
А чем плох вариант с обработкой события OnActivate формы, которая получает нежелательный фокус ?
В обработчике достаточно просто вернуть фокус той форме, которая его потеряла.
MultIfleX (2007-08-13 12:13:00) [11]WS_EX_NOACTIVATE пробывал, блин не получаеццо. ставил флаг в CreateParams к exStyle через or :)) не помогло. Окно показываю через
ShowWindow( handle , sw_shownoactvate );
> Ну и обрабатывай их себе на здоровье)Зачем же для этого
> лишать окно фокуса ?
ну блин вот охото мне лишать окно фокуса :) точнее не лишать фокуса другое окно :)
Lacmus (2007-08-13 12:10:00) [12]>MultIfleX
WS_EX_NOACTIVATE ?
Сергей М. (2007-08-13 12:07:00) [13]
> сообщения то от мыша надо не блокировать а обрабатывать
Ну и обрабатывай их себе на здоровье)
Зачем же для этого лишать окно фокуса ?
MultIfleX (2007-08-13 12:05:00) [14]ЗЫ, сообщения то от мыша надо не блокировать а обрабатывать :)
MultIfleX (2007-08-13 12:04:00) [15]Пасиба, но окно всё равно получает фокус. да это в принципе и не важно, т.к. для "многослойных" окон, обновляемых с помощью UpdateLayeredWindow этот способ не подойдет. жду других более изащрённых вариантов.
Сергей М. (2007-08-13 11:54:00) [16]Установи у формы BorderStyle = bsNone,
брось на форму любой компонент-наследник TWinControl, установи его св-ва Enabled = False, Align = alClient