Форум: "Основная";
Текущий архив: 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.04 c