Как clr будет обрабатывать стандартные события в C # по сравнению с c ++ для элементов управления Windows? - PullRequest
1 голос
/ 11 декабря 2011

Как c # обрабатывает событие под капотом в clr, для стандартных элементов управления win32, скажем, кнопка:

Пример: (c #)

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.Click += (_, __) => { MessageBox.Show("You clicked me !"); };
    }

Это похоже на c ++ восновной цикл обработки сообщений? `

Пример:

while (GetMessage(&msg, NULL, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{

case WM_COMMAND:


    if(hWnd>0 && hWnd==buttonhwnd) //Button click
    {
        callback_button();
    }

default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

Я имею в виду, будут ли все стандартные элементы управления в c # отправлять каждый сигнал, например щелчок, наведение мыши и т. д., в симметричный цикл - и затемчтобы обратный звонок зарегистрирован в исходном коде?Как мой лямбда-пример?

Ответы [ 2 ]

3 голосов
/ 11 декабря 2011

Конечно, основной механизм тот же. Тем не менее, Winforms (и в некоторой степени WPF) значительно изменяет маршрутизацию сообщений. В Windows дочерний элемент управления отправляет уведомления в родительское окно. Система Winforms меняет это путем сочетания подклассов окна и сообщения, отражающего запуск кода в самом элементе управления. Например, метод OnClick () для кнопки.

Откуда через подписки на события любой другой класс может получить обратный вызов события Click. Например, распространенным шаблоном является не панель, на которой вы размещаете кнопку для обработки обратного вызова, а форма верхнего уровня. Это дает большую гибкость по сравнению с родным способом Windows.

1 голос
/ 11 декабря 2011

Это наоборот.

Есть цикл сообщений, один для вашего приложения.Я подозреваю, что это где-то около класса Application.Цикл отправляет все входящие сообщения обработчикам, встроенным где-то в класс Control.

И затем встроенный обработчик проверяет, имеет ли экземпляр элемента управления делегат, присоединенный к событию, и если это так,событие называется.

...