![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Кто подскажет как запретить выходить курсору за форму если форма написана на api. Знаю как реализовать в VLC, но в api не могу ее перевести или просто не понимаю как.
Как я реализовываю в VLC: Код:
var aRect: TRect; begin aRect:=BoundsRect; ClipCursor(@myr); end; Кто поможет перевести в api? |
|
#2
|
||||
|
||||
|
Код:
var ARect: TRect; begin GetWindowRect(Handle, ARect); ClipCursor(@ARect); end; |
|
#3
|
|||
|
|||
|
Цитата:
а как правильно применить если форма на api |
|
#4
|
||||
|
||||
|
Посмотреть исходники ClipCursor религия не позволяет?
|
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
||||
|
||||
|
Цитата:
Код:
var Handle: THandle; ... Handle:=CreateWindow() ... GetWindowRect() ClipCursor() Последний раз редактировалось NumLock, 13.10.2014 в 18:35. |
|
#7
|
||||
|
||||
|
Похоже ТСу нужна инфа про отлов сообщений нахождения курсора в пределах "самопальной" формы, есть непонятки как эта форма вообще создется, без кода не видно какие описатели к ней применимы, если аффтар данное святотатство покажет, то можно кое-что и подсказать ему, ясен пень, имхо (оффтоп - тема по-тихоньку во флудильню переходит:-)
|
|
#8
|
|||
|
|||
|
вот в таком форме нужно отловаить, пробывал как написано выше но увы не отловил(
Код:
program Project1;
uses
windows,
messages;
var
wc: TWndClass;
hWindow: HWND;
Msg: TMsg;
function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
lParam: lParam): LRESULT; stdcall; export;
var
ps: TPaintStruct;
begin
Result := 0;
case Msg of
WM_PAINT:
begin
BeginPaint(hWindow, ps);
SetBkMode(ps.hdc, TRANSPARENT);
EndPaint(hWindow, ps);
end;
WM_DESTROY: PostQuitMessage(0);
else
begin
Result := DefWindowProc(hWindow, Msg, wParam, lParam);
Exit;
end;
end;
end;
begin
wc.lpszClassName := 'YourAppClass';
wc.lpfnWndProc := @MainWndProc;
wc.Style := CS_VREDRAW or CS_HREDRAW;
wc.hInstance := hInstance;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := (COLOR_WINDOW + 1);
wc.lpszMenuName := nil;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
RegisterClass(wc);
hWindow := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
'YourAppClass',
'API',
WS_VISIBLE or WS_CLIPSIBLINGS or
WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0,
400, 300,
0,
0,
hInstance,
nil);
ShowWindow(hWindow, CmdShow);
UpDateWindow(hWindow);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end.
|
|
#9
|
||||
|
||||
|
Ну и что непонятно? Обработку курсора можно "повесить" на активность окна:
Код:
program Project1;
uses
Windows, Messages;
const
szAppName = 'YourAppClass';
var
wc : TWndClassEx;
Wnd : HWND;
Msg : TMsg;
aRect : TRect;
function MainProc(Wnd : HWND; Msg : Integer; wParam, lParam : Longint) : Integer; stdcall;
var
ps : TPaintStruct;
begin
Result := 0;
case Msg of
WM_ACTIVATEAPP :
begin
if Boolean(wParam) then
begin
GetWindowRect(Wnd, aRect);
ClipCursor(@aRect);
end
else
ClipCursor(NIL);
end;
WM_PAINT :
begin
BeginPaint(Wnd, ps);
SetBkMode(ps.hdc, TRANSPARENT);
EndPaint(Wnd, ps);
end;
WM_DESTROY :
begin
PostQuitMessage(0);
Exit;
end;
end;
Result := DefWindowProc(Wnd, Msg, wParam, lParam);
end;
begin
FillChar(wc, SizeOf(TWndClassEx), 0);
wc.cbSize := SizeOf(TWndClassEx);
wc.Style := CS_VREDRAW or CS_HREDRAW;
wc.lpszClassName := szAppName;
wc.lpfnWndProc := @MainProc;
wc.hInstance := hInstance;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := (COLOR_WINDOW + 1);
if RegisterClassEx(wc) = 0 then
Halt(255);
Wnd := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
szAppName, 'API',
WS_VISIBLE or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
0, 0, 400, 300,
0, 0, hInstance, NIL);
ShowWindow(Wnd, SW_SHOW);
UpDateWindow(Wnd);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end. |