Конференция "WinAPI" » Аналог MESSAGE_MAP для чистых API-проектов на FPC/D7 [D7, Win2k]
 
  • Афонтий (12.04.13 15:35) [0]
    Преподаватель в институте сильно нахваливал MESSAGE_MAP в C++MFC, как сделать так же в Делфи7 на чистом API?
    Ну или просто как лучше поступать, мне кажется всё писать прям в самой оконной как-то плохо для самой программы, когда там совсем много.
    Хочется также учесть что некоторые сообщения приходят редко, а некоторые по много раз в секунду, а некоторые вообще не нужны (причём возможно не известно заранее какие как что).
  • brother © (12.04.13 15:57) [1]
    > MESSAGE_MAP

    я не знаю что это, но может через case удобнее?)
  • Афонтий (12.04.13 16:01) [2]
    Что уж тогда, давайте If!
  • Афонтий (12.04.13 16:02) [3]
    А это идея если кроме шуток.. Много вложенных If'ов.. Половинным делением..
    Надо обдумать..
  • Rouse_ © (12.04.13 18:36) [4]

    > Афонтий   (12.04.13 15:35)
    > Преподаватель в институте сильно нахваливал MESSAGE_MAP
    > в C++MFC, как сделать так же в Делфи7 на чистом API?

    MESSAGE_MAP - это карта обработчиков сообщений. В дельфи делается просто.


    > procedure MyMessage(var Message: TMessage); message WM_MYMESSAGE;


    т.е. вместо раскидки обработчиков по карте присутствует явное назначение онного через
    message "константа сообщения"

    ;

    Во вторых, что MESSAGE_MAP, что MFC к "чистому АПИ", собственно как и "грязному" (будет такой есть в умах студентов и преподавателей) не относится вообще никак :)
  • Dimka Maslov © (13.04.13 22:03) [5]
    Список адресов обработчиков с двоичным поиском по индексу. За нас уже давно всё сделано.
  • Афонтий (18.04.13 19:04) [6]

    > В дельфи делается просто.
    > > procedure MyMessage(var Message: TMessage); message WM_MYMESSAGE;


    Отлично! Ну и куда мне это запихивать? =\\


    program A;

    uses Windows.h;

    var Wc: TWndClassEx; Msg: TMsg;

    function WindowProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    begin
    case Msg of
         WM_DESTROY:
               begin
               PostQuitMessage(0); // PostMessage(Wnd, WM_QUIT, 0, 0);
               Result:=0;
               Exit;
               end;
         else
               begin
               Result:=DefWindowProc(Wnd, Msg, wParam, lParam);
               end;
         end;
    end;

    begin
    Wc.cbSize:=SizeOf(Wc);
    Wc.style:=CS_HREDRAW Or CS_VREDRAW;
    Wc.lpfnWndProc:=@WindowProc;
    Wc.cbClsExtra:=0;
    Wc.cbWndExtra:=0;
    Wc.hInstance:=hInstance;
    Wc.hIcon:=LoadIcon(0, IDI_APPLICATION);
    Wc.hCursor:=LoadCursor(0, IDC_ARROW);
    Wc.hbrBackground:=COLOR_WINDOW;
    Wc.lpszMenuName:=Nil;
    Wc.lpszClassName:='A';
    RegisterClassEx(Wc);
    CreateWindowEx(0, 'A', 'TitleA', WS_VISIBLE Or WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, Nil);
    while GetMessage(Msg, 0, 0, 0) do
         begin
         TranslateMessage(Msg);
         DispatchMessage(Msg);
         end;
    end.

  • Афонтий (18.04.13 19:13) [7]
    Я не говорил что MESSAGE_MAP или MFC "относятся к АПИ", я сказал что в MFC есть понятие MESSAGE_MAP.
    BEGIN_MESSAGE_MAP(бла-бла..


    > как и "грязному" (будет такой есть в умах студентов и преподавателей)


    Чистый АПИ:
    * Подключать какие-либо модули кроме оригинальных заголовочников Windows - нельзя.
    * Объявлять классы - нельзя.
    * ..ну и по мелочи.. =)


    > Список адресов обработчиков с двоичным поиском по индексу.
    >  За нас уже давно всё сделано.


    Это и интересует. Где возможно посмотреть реализацию?
 
Конференция "WinAPI" » Аналог MESSAGE_MAP для чистых API-проектов на FPC/D7 [D7, Win2k]
Есть новые Нет новых   [134430   +4][b:0][p:0.001]