Форум: "WinAPI";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
Вниз2 окна - отлов событий на втором окне Найти похожие ветки
← →
Velocity (2003-01-14 12:30) [0]Народ, помогите плиз, вопрос туповат - но сам не могу разобраться. В общем создаю средствами винапи окно, назначаю ему обработчик событий мышиных и т.д. Потом создаю 2 окно (поверх 1-го и меньше размерами) - и не могу отловить допустим клик мышкой над этим вторым окном. Пытался влепить на это второе окно и отдельный обработчик (не работает) и назначить уже имеющийся - ну в общем полный бред получается, окно не реагирует ни на что. Может есть у кого простенький примерчик? Знаю, вопрос смешной да и уже кажется обсуждался - но найти никак не могу. Помогите, очень надо.
← →
Cobalt (2003-01-14 12:49) [1]Код в Студио!
>поверх 1-го и меньше размерами
? StayOnTop?
Конечно надо назначить второй обработчик. А КЛАСС ты для него зарегестрировал?
← →
Velocity (2003-01-14 16:46) [2]>Cobalt
Класс окна зарегистрировал, там ставится один параметр - адрес обработчика. ставлю на отдельную процедуру (как для главного окна, похожая). не работает. второе окно кидаю с флагом WS_EX_TOPMOST - это то что надо?
Вообще лучше всего примерчик. Народ ну у кого есть? Подкиньте
← →
Cobalt (2003-01-14 21:12) [3]Лучше, все-таки, свой примерчик выложи - тебе объяснят на пальцах, где у тебя ошибки.
← →
Diamond Cat (2003-01-15 03:08) [4]попробуй его setactivewindow , если я правильно помню , то WS_EX_TOPMOST это положить поверх всех но не активировать
← →
Velocity (2003-01-16 16:12) [5]Ок, код - так код. Вот он, болезный...
program OpenGLViewer;
uses Windows, Messages, OpenGL;
{$R cursors.res}
var
wClass:TWndClass;
Window,SetupWindow:HWND;
hInstance:HINST;
PixelFormat:GLUINT;
pfd:TPIXELFORMATDESCRIPTOR;
DC:HDC;
RC:HGLRC;
msg:TMsg;
x_pos,y_pos,rotate_x_pos,rotate_y_pos,scale_y_variable:Integer;
State:TState;
aCursors:HCURSOR;
function WinProc(hWnd,msg,wParam,lParam:LongInt):Integer;stdcall;
begin
result:=DefWindowProc(hWnd,msg,wParam,lParam);
if ((msg=WM_KEYDOWN) and (wParam=VK_ESCAPE)) or (msg=WM_DESTROY) then begin
wglDeleteContext(RC);
Halt;
end;
if msg=WM_RBUTTONDOWN then begin
ShowWindow(SetupWindow,SW_SHOW);
SetActiveWindow(SetupWindow);
SetFocus(SetupWindow);
end;
end;
function SetupWinProc(hWnd,msg,wParam,lParam:LongInt):Integer;stdcall;
begin
result:=DefWindowProc(hWnd,msg,wParam,lParam);
if msg=WM_RBUTTONDOWN then begin
ShowWindow(SetupWindow,SW_HIDE);
end;
end;
//------------------------------------------------------
begin
hInstance:=GetModuleHandle(nil);
ZeroMemory(@wClass,SizeOf(wClass));
with wClass do begin
lpfnWndProc:=@WinProc;
style:=CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
hbrBackground:=COLOR_BTNFACE;
lpszClassName:="GL_Engine";
hInstance:=hInstance;
hCursor:=LoadCursor(0,IDC_ARROW);
hIcon:=0;
end;
if RegisterClass(wClass)=0 then begin
MessageBox(0,"Сбой регистрации класса окна","Ошибка",MB_ICONERROR);
Halt;
end;
Window:=CreateWindowEx(0,"GL_Engine","OpenGL-Viewer",WS_POPUP or WS_VISIBLE,0,0,
GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),
0,0,hInstance,nil);
if Window=0 then begin
MessageBox(0,"Сбой при создании окна","Ошибка",MB_ICONERROR);
Halt;
end;
//создаём второе окно
ZeroMemory(@wClass,SizeOf(wClass));
with wClass do begin
lpfnWndProc:=@SetupWinProc;
style:=CS_HREDRAW or CS_VREDRAW;
hbrBackground:=COLOR_WINDOW;
lpszClassName:="Setup";
hCursor:=LoadCursor(0,IDC_ARROW);
hIcon:=0;
end;
if RegisterClass(wClass)=0 then begin
MessageBox(0,"Сбой регистрации класса окна","Ошибка",MB_ICONERROR);
Halt;
end;
SetupWindow:=CreateWindowEx(WS_EX_TOPMOST,"Setup","Setup",WS_POPUP or WS_SYSMENU or WS_CAPTION,100,100,
320,240,Window,0,0,nil);
UpdateWindow(Window);
while GetMessage(Msg,Window,0,0)=true do begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
конечно многое (лишнее) порезано.
← →
Velocity (2003-01-16 18:44) [6]апну, мож кто подскажет...
← →
Cobalt (2003-01-16 19:07) [7]Может, проблема с OpenGL?
И, еще - попробуйresult:=DefWindowProc(hWnd,msg,wParam,lParam);
ставить в конце обработчика... (типа, традиция)
← →
Velocity (2003-01-17 18:48) [8]гм. такого не пробовал. сенькс, попробую, может и будет результат.
← →
Nick_N_A (2003-01-18 05:34) [9]Ой-Ой-Ой сколько кода!
Самый эффективный способ отлова далее:
programm ...
Uses ... ... , Windows;
Var Msg: tagMsg;
Begin
Application.Initialize;
Form1:=TForm1.Create;
Form2:=TForm2.Create;
...
Form1.Show;
while Form1.Visible do Begin
GetMessage(Msg,0,0,0);
// здесь вы получаете абсолютно все сообщения, касающиеся
// Application к которому привязаны Form-ы VCL
Case Msg.msg of
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
← →
Velocity (2003-01-20 05:32) [10]Перенос DefWindowProc видимого result"а не дал...
>Nick_N_A
Огроменное спасибо! Может и заработает наконец-то.
← →
Nick_N_A (2003-01-21 06:46) [11]Коды сообщений в модуле Messages
WM_MOUSEMOVE
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
почитай на них хелп делфи
т.е. Case Msg.Msg of WM_LBUTTONUP:do_some ; end;
см также TWMMouse,
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c