Разработка прикладных программ для ОС WINDOWS с помощью интегрированных сред Delphi / C++Builder. Баканов В.М. - 12 стр.

UptoLike

Составители: 

- 12 -
щение WM_QUIT, означающее, что программа должна закончить работу.
Функция TranslateMessage обрабатывает только поступившие с клавиа-
туры сообщения, преобразуя последовательность событий типа 'клавиша от-
пущена / клавиша нажата' в одно из следующих сообщений
WM_DEADCHAR, WM_SYSCHAR и WM_SYSDEADCHAR.
Последняя в цикле функция DispatchMessage передает сообщение в окно
(реально - связанной с данным окном процедуре
обработки сообщений).
В действительности с каждым окном, создаваемым под управлением
WINDOWS, связана некоторая функция обработки сообщений, именуемая
оконной функцией WinProc. Связывание соответствующей WinProc-
функции с заданным окном осуществляется присвоением имени WinProc-
функции полю lpfnWndProc структуры типа WNDCLASS, определяющей
данное окно, и регистрацией класса окна функцией RegisterClass.
При вызове SendProc или DispatchMessage
в действительности вызыва-
ется именно функция WinProc (ниже приведен пример данной функции,
оформленной как С-функция с Pascal-вызовом); приведенная функция обра-
батывает всего два стандартных сообщения WINDOWS - WM_PAINT (пере-
рисовать окно - в данном простейшем случае вывести в окно заданный текст)
и WM_DESTROY (уничтожить окно)
LONG FAR PASCAL
WinProg_1(HWND hWnd, // идентификатор данного окна
WORD msg, // код кообщения
WORD wParam,
LONG lParam)
{
HDC hdc; // дескриптор устройства вывода
PAINTSTRUCT ps; // параметры отображения окна
RECT rect; // размер клиентской области вывода
switch (msg)
{
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
case WM_PAINT: // полность перерисовать окно
hdc=BeginPaint(hWnd, &ps); // взять дескриптор устройства
GetClientRect(hwnd, (LPRECT) &rect); // определить область вывода
DrawText(hdc, (LPSTR) ‘’Hello, BAKANOV !’’, // выдать текст
-1, (LPRECT) &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hWnd, &ps); // освободить дескриптор устройства
break;
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
case WM_DESTROY: // уничтожить окно
PostQuitMessage(0);
break;
                                              - 12 -


щение WM_QUIT, означающее, что программа должна закончить работу.
   Функция TranslateMessage обрабатывает только поступившие с клавиа-
туры сообщения, преобразуя последовательность событий типа 'клавиша от-
пущена / клавиша нажата' в одно из следующих сообщений
WM_DEADCHAR, WM_SYSCHAR и WM_SYSDEADCHAR.
   Последняя в цикле функция DispatchMessage передает сообщение в окно
(реально - связанной с данным окном процедуре обработки сообщений).
   В действительности с каждым окном, создаваемым под управлением
WINDOWS, связана некоторая функция обработки сообщений, именуемая
оконной функцией WinProc. Связывание соответствующей WinProc-
функции с заданным окном осуществляется присвоением имени WinProc-
функции полю lpfnWndProc структуры типа WNDCLASS, определяющей
данное окно, и регистрацией класса окна функцией RegisterClass.
    При вызове SendProc или DispatchMessage в действительности вызыва-
ется именно функция WinProc (ниже приведен пример данной функции,
оформленной как С-функция с Pascal-вызовом); приведенная функция обра-
батывает всего два стандартных сообщения WINDOWS - WM_PAINT (пере-
рисовать окно - в данном простейшем случае вывести в окно заданный текст)
и WM_DESTROY (уничтожить окно)

LONG FAR PASCAL
WinProg_1(HWND hWnd, // идентификатор данного окна
            WORD msg, // код кообщения
            WORD wParam,
            LONG lParam)
{
  HDC hdc; // дескриптор устройства вывода
  PAINTSTRUCT ps; // параметры отображения окна
  RECT rect; // размер клиентской области вывода

  switch (msg)
  {
    // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    case WM_PAINT: // полность перерисовать окно
    hdc=BeginPaint(hWnd, &ps); // взять дескриптор устройства
    GetClientRect(hwnd, (LPRECT) &rect); // определить область вывода
    DrawText(hdc, (LPSTR) ‘’Hello, BAKANOV !’’, // выдать текст
                     -1, (LPRECT) &rect,
                     DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    EndPaint(hWnd, &ps); // освободить дескриптор устройства
    break;
    // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    case WM_DESTROY: // уничтожить окно
    PostQuitMessage(0);
    break;