|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Supporting the Screen Saver Window Procedure
Each screen saver must support a window procedure named ScreenSaverProc. Like most window procedures, ScreenSaverProc processes a set of specific messages and passes any unprocessed messages to a default procedure. However, instead of passing them to the DefWindowProc function, ScreenSaverProc passes unprocessed messages to the DefScreenSaverProc function. Another difference between ScreenSaverProc and a normal window procedure is that the handle passed to ScreenSaverProc identifies the entire desktop rather than a client window. The following example shows the ScreenSaverProc window procedure for the sample screen saver.
LONG WINAPI ScreenSaverProc(hwnd, message, wParam, lParam) HWND hwnd; UINT message; DWORD wParam; LONG lParam; { static HDC hdc; /* device-context handle */ static RECT rc; /* RECT structure */ static UINT uTimer; /* timer identifier */ switch(message) { case WM_CREATE: /* Retrieve the application name from the .RC file. */ LoadString(hMainInstance, idsAppName, szAppName, 40);
/* Retrieve the .INI (or registry) filename. */ LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN); /* Retrieve any redraw-speed data from the registry. */ lSpeed = GetPrivateProfileInt(szAppName, szRedrawSpeed, DEFVEL, szIniFile); /* * Set a timer for the screen saver window using the * redraw-rate stored in REGEDIT.INI.
*/ uTimer = SetTimer(hwnd, 1, lSpeed * 1000, NULL); break; case WM_ERASEBKGND: /* * The WM_ERASEBKGND message is issued before the * WM_TIMER message, allowing the screen saver to * paint the background as appropriate. */ hdc = GetDC(hwnd); GetClientRect (hwnd, &rc); FillRect (hdc, &rc, GetStockObject(BLACK_BRUSH));
ReleaseDC(hwnd,hdc); break; case WM_TIMER: /* * The WM_TIMER message is issued at (lSpeed * 1000) * intervals, where lSpeed == .001 seconds. This * code repaints the entire desktop with a white, * light gray, dark gray, or black brush each * time a WM_TIMER message is issued. */ hdc = GetDC(hwnd); GetClientRect(hwnd, &rc);
if (i++ <= 4) FillRect(hdc, &rc, GetStockObject(i)); else (i = 0); ReleaseDC(hwnd,hdc); break; case WM_DESTROY: /* * When the WM_DESTROY message is issued, the screen saver * must destroy any of the timers that were set at WM_CREATE * time. */ if (uTimer) KillTimer(hwnd, uTimer);
break; } /* * DefScreenSaverProc processes any messages * ignored by ScreenSaverProc. */ return DefScreenSaverProc(hwnd, message, wParam, lParam); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Опорный Процедура Окна Экранного Спасителя
Каждый экранный спаситель должен поддержать процедуру окна назвавшую ScreenSaverProc. Подобно большинству процедурам окна, ScreenSaverProc обрабатывает набор специфических сообщений и передает любые unprocessed сообщения во встроенную процедуру. Тем не менее, вместо прохождения них в функцию DefWindowProc, ScreenSaverProc передает unprocessed сообщения в функцию DefScreenSaverProc. Другое различие между ScreenSaverProc и нормальной процедурой окна - в том, что ручка пройденная на ScreenSaverProc идентифицирует целую настольную систему а не окно клиента. Следующий пример показывает процедуру окна ScreenSaverProc для экранного спасителя образца.
ДОЛГО (ДЛИНОЙ) WINAPI ScreenSaverProc(hwnd, сообщение, wParam, lParam) HWND hwnd; СООБЩЕНИЕ UINT; DWORD wParam; ДОЛГО (ДЛИНОЙ) lParam; { статический hdc HDC; /* устройство-контекстная ручка */ статический rc RECT; /* СТРУКТУРА RECT */ статический UINT uTimer; /* таймерный идентификатор */ ключ(сообщение) { случай WM_CREATE: /* Извлеките прикладное имя из file. .RC */ LoadString(hMainInstance, idsAppName, szAppName, 40);
/* Извлеките .INI filename. (или регистрация) */ LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN); /* Извлеките любые перерисовывать-скоростные данные из registry. */ lSpeed = GetPrivateProfileInt(szAppName, szRedrawSpeed, DEFVEL, szIniFile); /* * Установите таймер для экранного окна спасателя, использовавшего the * обновление изображения-показатель загружалось в REGEDIT.INI.
*/ uTimer = SetTimer(hwnd, 1, lSpeed * 1000, НЕДЕЙСТВИТЕЛЬНОЕ); прерывание; случай WM_ERASEBKGND: /* * Сообщение WM_ERASEBKGND выпущено перед the * сообщение WM_TIMER, допускающее экранного спасателя, чтобы * закрасьте фон как подходящий. */ hdc = GetDC(hwnd); GetClientRect (hwnd, &rc); FillRect (hdc, &rc, GetStockObject(BLACK_BRUSH));
ReleaseDC(hwnd,hdc); прерывание; случай WM_TIMER: /* * Сообщение WM_TIMER выпущено в (lSpeed * 1000) * интервалы, где lSpeed == .001 секунды. Это * код перекрашивает целую настольную систему с белым, * зажгите серый, темный серый, или черная щетка каждый * время сообщение WM_TIMER выпущено. */ hdc = GetDC(hwnd); GetClientRect(hwnd, &rc);
если (я++ <= 4) FillRect(hdc, &rc, GetStockObject(i)); еще (i = 0); ReleaseDC(hwnd,hdc); прерывание; случай WM_DESTROY: /* * Когда сообщение WM_DESTROY выпущено, экранный спасатель * должно уничтожить любое из таймеров, что были установлены в WM_CREATE * время. */ если (uTimer) KillTimer(hwnd, uTimer);
прерывание; } /* * DefScreenSaverProc ОБРАБАТЫВАЕТ любые сообщения * проигнорированное ScreenSaverProc. */ возвращайте DefScreenSaverProc(hwnd, сообщение, wParam, lParam); }
|
|
|
|
| |