Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2010, 15:56   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Обработчик. Два (2) окна.

Приложение на API.
Код:
Procedure RegisterApp;
 Begin
  Application.Handle := GetModuleHandle(nil);
  With Application.WinClass do
  Begin
   Style := CS_HREDRAW Or CS_VREDRAW;
   hIcon := LoadIcon(Application.Handle, MAKEINTRESOURCE(APPLICATION_FORM_ICON));
   lpfnWndProc := @UNTHand.WindowProc;
   hInstance := Application.Handle;
   hbrBackground := COLOR_BTNFACE + 1;
   lpszClassName := APPLICATION_FORM_CLASS;
   hCursor := LoadCursor(0, IDC_ARROW);
  End;
  InitCommonControls;
  RegisterClass(Application.WinClass);
 End;
Прошу обратить внимание на подчеркнутую строку. Обработчик назначается и все отрабатывает шикарно. Если я добавлю вторую форму, что нужно изменить в обработчике, чтобы разделять события первой и второй форм?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 13.09.2010, 16:12   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у тя ж ООП?
то есть тебе нужен указатель на обьект^
1)в принципе можно хранить его в поле окна GWL_USERDATA через Set/GetWindowLong
тогда обработчик чтото типа такого.
Код:
function WndProc;
var T:TMyControl; 
begin
 T:=TMyControl(GetWindowLong(GWL_USERDATA));
 case uMsg of
  WM_CHAR:T.OnKeyPress(wParam);
 end;
end;

constructor TMyControl.Create;
begin
 inherited Create;
 //создаем окошко(допустим в локальной переменке h:THandle будет его хендл)
 SetWindowLong(GWL_USERDATA,LONG(Self));
end;
но есть один нюанс, это значение могут изменить...и тогда капец.
2)чтото типа списка HWND-TMyControl
тут все проще
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.09.2010, 16:18   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Эммм... а ежели я полный Winapiнец?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 13.09.2010, 16:24   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дык я vcl тут не использовал
TMyControl это твой класс, я просто как пример привел название это.
Цитата:
Эммм... а ежели я полный Winapiнец?
Мы с тобой одной крови, ты и я
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.09.2010, 16:33   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
TMyControl это твой класс
Мой мозг взорвался. Откуда классы в чистокровном WinAPI? О_о
Код:
 Function WindowProc(HWND, Msg : LongWord; WParam, LParam: LongInt): LongInt; StdCall;
 Begin
  Result := DefWindowProc(HWND, Msg, WParam, LParam);
  Case Msg Of
   WM_MOUSEMOVE : UNTProcs.DrawAll;     
   WM_PAINT     : UNTProcs.SetOnTop;  .
   WM_DESTROY   : UNTProcs.ShutDown;     
  End;
 End;
HWND - чей возвращается? Того окна, от кого пришло?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 13.09.2010, 16:38   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в АПИ классов нету, но они есть в Делфи(UNTHand это не класс?)

вообще по последнему вопросу, в обработчик поступает HWND окна которому предназначено сообщение.(то есть при обработке для второго окна получит хендл второго окна)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.09.2010, 16:39   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
(то есть при обработке для второго окна получит хендл второго окна)
Ясно.
Цитата:
UNTHand это не класс?
Unit Handler
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 13.09.2010, 19:43   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Код:
type
  TWinAPIDialog = class(TBaseDialog)
  private
    FDialog: HWND;
  protected
    property Dialog: HWND read FDialog;
    function DialogProc(const Msg, wParam, lParam: Cardinal): Integer; virtual;
  end;

function DialogProcStub(Wnd: HWnd; Msg, wParam, lParam: DWord): Integer; stdcall;
var
  Dialog: TWinAPIDialog;
begin
  Result := 0;

  if Msg = WM_INITDIALOG then
    SetWindowLong(Wnd, GWL_USERDATA, lParam);

  Dialog := TWinAPIDialog(Pointer(GetWindowLong(Wnd, GWL_USERDATA)));
  if Assigned(Dialog) then
  begin
    if Dialog.FDialog = 0 then
      Dialog.FDialog := Wnd
    else
      if Dialog.FDialog <> Wnd then
        Exit;

    Result := Dialog.DialogProc(Msg, wParam, lParam);
  end;
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 14.09.2010, 09:42   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Как такое сделать без ООП? Допустим если в языке нет классов.....
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 14.09.2010, 10:27   #10
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ну лично я их, например, и не использую, вместо них юзаю записи как упорядоченное хранилище информации:
Код:
 Unit UNTType;

{$mode objfpc}{$H+}

 Interface

 Uses
  Windows,

  UNTCons;

 Type

  TCell = Record           { Ячейка                }
   Name        : String;   { Имя ячейки            }
   Kind        : Integer;  { Тип ячейки            }
   FileName    : String;   { Имя файла             }
   Param       : String;   { Параметры запуска     }
   WorkDir     : String;   { Рабочая папка         }
   ContNum     : Integer;  { Номер контейнера      }
  End;

  TContainer = Array[0..CONTAINER_WIDTH - 1, 0..CONTAINER_HEIGHT - 1] Of TCell; { Контейнер - массив ячеек }

  TImage = Record    { Изображение                }
   Handle : HWND;    { Хендл контрола             }
   Font   : HFont;   { Шрифт контрола             }
   DC     : HDC;     { Холст контрола             }
   Left   : Integer; { Координаты : отступ слева  }
   Top    : Integer; { Координаты : отступ справа }
   Width  : Integer; { Координаты : ширина        }
   Height : Integer; { Координаты : высота        }
  End;

  TForm = Record             { Форма                      }
   Handle      : HWND;       { Хендл формы                }
   Left        : Integer;    { Координаты : Отступ слева  }
   Top         : Integer;    { Координаты : Отступ справа }
   Width       : Integer;    { Координаты : Ширина        }
   Height      : Integer;    { Координаты : Высота        }
   Image       : TImage;     { Изображение                }
   Visible     : Boolean;    { Видимость формы            }
   IsContainer : Boolean;    { Проверка на контейнер      }
   Container   : TContainer; { Контейнер формы            }
   ActiveCell  : TPoint;     { Активная ячейка            }
  End;

  TApplication = Record  { Приложение               }
   Handle   : HWND;      { Хендл приложения (hInst) }
   MSG      : TMSG;      { Сообщения приложения     }
   WinClass : TWndClass; { Класс приложения         }
  End;

  TTexture = Record  { Текстура    }
   BitMap : HBitMap; { Изображение }
   Width  : Integer; { Ширина      }
   Height : Integer; { Высота      }
  End;

  TSquaryInfo = Record   { Информация о панели    }
   CellCount : Integer;  { Количество ячеек       }
   AutoRun   : LongBool; { Автозапуск             }
   AutoHide  : LongBool; { Автоскрытие            }
   ShowHints : LongBool; { Показ подсказок        }
   OnTop     : LongBool; { Панель всегда сверху   }
   Container : Integer;  { Количество контейнеров }
  End;

  TCellArray            = Array Of TCell;      { Массив ячеек              }
  TSquaryInfoContainers = Array Of TContainer; { Массив контейнеров панели }

 Implementation

 End.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик ошибок XPAiN Microsoft Office Excel 3 21.04.2008 09:30
Размер окна в зависимости от размера окна Reverent JavaScript, Ajax 1 02.02.2008 15:49
закрыть все дочерни окна, кроме главного окна Worms Общие вопросы Delphi 2 03.12.2007 22:18
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13
два TMediaPlayer и два AVI-файла zeleniy Компоненты Delphi 0 01.06.2007 14:14