![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
отлавливаю сообщение формы следующим способом
Код:
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall; begin //тут код end; Result:=DefWindowProc(hWnd,Msg,wParam,lParam); end; |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
Цитата:
Код:
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall;
begin
Result:=0;
case msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end;
//тут еще сообщения которые отлавливаются
//...
//...
end;
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
inherited;
end;ошибка связана как я понял что-то на до было добавить в TYPE, класс что ли, но форма то api'ишная как что прописать в type? this form of method call only allowed in methods of derived types Последний раз редактировалось HTTqp, 31.10.2014 в 18:07. |
|
#4
|
||||
|
||||
|
Тогда инхирайт здесь не нужен. Блок обработки сообщений у "чисто" апишной формы (по drkb) должен выглядеть примерно так
Код:
function WindowProc(hWnd,Msg,wParam,lParam: Longint): Longint; stdcall; export;
begin
//подпрограмма обработки сообщений
case Msg of
WM_DESTROY: begin
PostQuitMessage(0);
Exit;
end;
//тут еще сообщения которые отлавливаются
//...
//...
else
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
end;Код:
... var wcx: TWndClass; ... // адрес оконной процедуры wcx.lpfnWndProc := @WindowProc; ... Код:
...
var
AMessage: msg;
...
while (GetMessage(AMessage, 0, 0, 0)) do
begin
//Запускаем цикл обработки сообщений
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
... |
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
|||
|
|||
|
Программу пишу на чистом api значит и форма создается с использованием api, проблема только вот в чем некоторые сообщения отлавливаются 1 раз, после запуска как только форма потеряла фокус все они не обрабатываются, сначала думал надо сделать через таймер, но бесполезно наверное, форма то вне фокуса. Так вот почитал можно сделать форму поплавок, то есть пока программа открыта пользователь работает только с ней, как он заканчивает тогда все программу закрывает ее и все. Как реализовать тогда форму поплавок, потому что например у меня игры перекрывают ее.
|
|
#7
|
||||
|
||||
|
формы в VCL, там - окна. вызывай DefWindowProc внутри оконной процедуры, для необрабатываемых сообщений! пример работающей процедуры:
Код:
function WindowProc(AWnd: HWND; Msg: Integer;
wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
case Msg of
WM_CLOSE: begin
PostQuitMessage(0);
Result:=0;
end;
else Result:=DefWindowProc(AWnd, Msg, wParam, lParam);
end
end; |
|
#8
|
|||
|
|||
|
Цитата:
Код:
program Project1;
uses
Windows,
Messages;
const
WindowWidth=600;
WindowHeight=400;
var
HM: THandle;
Msg: TMsg;
wc: TWndClass;
hWindow: HWND;
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall;
var
PS: TPaintStruct;
begin
Result:=0;
case msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end;
end;
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
end;
//Процедура создания окна
procedure CreateMain;
begin
FillChar(wc,SizeOf(TWndClassEx), 0);
wc.lpszClassName:='MainForm';//Название имени класса окна
wc.lpfnWndProc:=@WindowProc;
wc.hbrBackground:=COLOR_WINDOW;//Цвет формы
wc.hIcon:=LoadIcon(hInstance,MakeIntResource('MAINICON'));{тут мы подгрузим дефолтную иконку делфи}
wc.hCursor:=LoadCursor(0,IDC_ARROW);{Выставим курсор по умолчаннию}
RegisterClass(wc);{Регистрируем класс}
CreateWindowEx(WS_EX_CONTROLPARENT,{Поверхи всех окон}
wc.lpszClassName,{Имя класса окна}
'Window'{Имя окна},
WS_TILEDWINDOW or WS_VISIBLE{Стиль окна or Видимое окно},
300,100,WindowWidth,WindowHeight,
0,0,
hInstance,{Описатель приложения, с которым окно связывается}
nil);
ShowWindow(hWindow,SW_SHOW);
UpDateWindow(hWindow);
end;
begin
CreateMain;
while GetMessage(Msg,0,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end. |
|
#9
|
||||
|
||||
|
нет там никаких кнопок, ни их обработки! вот тут есть:
Код:
program CreateWindowAPI;
uses
Windows, Messages;
var
AWndClass: WNDCLASS;
AMsg: TMsg;
AWnd: HWND;
function WindowProc(hwnd: HWND; uMsg: UINT;
wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
Result:=0;
case uMsg of
WM_COMMAND: begin
if HIWORD(wParam)=0 then
case LOWORD(wParam) of
2014: MessageBox(hwnd, 'Button1', 'TWINAPIFORM', MB_OK);
2015: MessageBox(hwnd, 'Button2', 'TWINAPIFORM', MB_OK);
end;
end;
WM_CLOSE: if MessageBox(hwnd, 'Close?', 'TWINAPIFORM', MB_OKCANCEL)=IDOK then PostQuitMessage(0) else Exit;
end;
Result:=DefWindowProc(hwnd, uMsg, wParam, lParam);
end;
begin
AWndClass.Style:=CS_HREDRAW or CS_VREDRAW;
AWndClass.lpfnWndProc:=@WindowProc;
AWndClass.cbClsExtra:=0;
AWndClass.cbWndExtra:=0;
AWndClass.hInstance:=HInstance;
AWndClass.hIcon:=LoadIcon(0, IDI_APPLICATION);
AWndClass.hCursor:=LoadCursor(0, IDC_ARROW);
AWndClass.hbrBackground:=COLOR_WINDOW+1;
AWndClass.lpszMenuName:=nil;
AWndClass.lpszClassName:='TWINAPIFORM';
RegisterClass(AWndClass);
AWnd:=CreateWindow(
AWndClass.lpszClassName,
AWndClass.lpszClassName,
WS_VISIBLE or WS_OVERLAPPEDWINDOW,
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
640, 480, 0, 0,
HInstance, nil);
CreateWindow('BUTTON', 'Button1', WS_CHILDWINDOW or WS_VISIBLE,
10, 10, 75, 25, AWnd, 2014, HInstance, nil);
CreateWindow('BUTTON', 'Button2', WS_CHILDWINDOW or WS_VISIBLE,
10, 45, 75, 25, AWnd, 2015, HInstance, nil);
while GetMessage(AMsg, 0, 0, 0) do
begin
TranslateMessage(AMsg);
DispatchMessage(AMsg);
end;
end. |