![]() |
|
|
Регистрация | << Правила форума >> | 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. Пишу программы за еду. __________________ |
#10
|
|||
|
|||
![]() NumLock, вопрос не в том как обрабботать кнопку, это я знаю. Вопрос в другом как обработать потерю фокуса и сделать форму-поплавок, ну или чтобы она всегда была активна(в фокусе).
|
#11
|
||||
|
||||
![]() пиши сразу что нужно!
Цитата:
Код:
BOOL SetForegroundWindow( HWND hWnd // handle of window to bring to foreground ); Пишу программы за еду. __________________ |