Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Графика -> Гончаров Д. -> "DirectX 7.0 Для программистов" -> 183

DirectX 7.0 Для программистов - Гончаров Д.

Гончаров Д., Салихо Т. DirectX 7.0 Для программистов — Спб.: Питер, 2001. — 528 c.
ISBN 5-318-00173-4
Скачать (прямая ссылка): dirext7dlyaprogrammistov2001.djvu
Предыдущая << 1 .. 177 178 179 180 181 182 < 183 > 184 185 186 187 188 189 .. 229 >> Следующая

BOOL CALLBACK ChatDlgProc( HWND hDlg, UINT msg. WPARAM wParam, LPARAM IParam ) {
int iLength; char *szBuffer; char szTitle[255];
HMENU hMenu;
switch( msg )
{
case WM_INITDIALOG:
hwndChat-GetDl gltem( hDl g, IDCCHATWINDOW); hwndMessage*GetDl gltem( hDl g. IDCSENDTEXT);
wsprintf(szTitle."*s • Xs".AppName.szLocalPlayer);
SetWi ndowText(hDlg.szTi tle);
SendMessage(hDlg, WM_SETICON, IC0N_BIG. (LPARAM)hicon); SendMessage(hDlg. WM_SETICON. ICON_SMALL, (LPARAM)hicon);
hMenu-GetSystemMenu(hDlg,FALSE);
Del eteMenu (hMenu. SC_RESTORE. MFBYCOMMAND);
Del eteMenu( hMenu. SC_MAXIMIZE, MFBYCOMMAND);
Del eteMenu(hMenu. SC_SIZE. MF BYCOMMAND);
return (TRUE);
case WM ACTIVATE:
if (wParaift-WA_ACTIVE)
{
SetFocus(GetDlgItem(hDlg,IDC_SENDTEXT)); return (TRUE);
}
case WM_CL0SE:
DestroyWindow(hDlg); return (TRUE);
case WM DESTROY:
PostQuitMessage(O); return (TRUE);
case WM COMMAND:
if (LOWORD(wParam)—IDC_SEND)
продолжение &
422
Урок 12 • Сетевые подключения
Листинг 12.3 (продолжение)
{
i Length-GetWi ndowT extLength(hwndMessage); if (i Length—0)
{
MessageBeep(O); return (TRUE);
}
szBuffer-(char*)inaTloc(iLength+l);
GetWi ndowText(hwndMessage,szBuffer.i Length+1); SendDPMessage(szBuffer);
AddMessageC szLocalPIayer, szBuffer); free(szBuffer);
SetWindowText(hwndMessage.NULL);
>
return (TRUE):
}
return (FALSE);
}
//...........................................
// Добавление текста в окно //
void AddMessageCchar* szName. char* szMessage)
{
char* szBuffer;
int iLength.iNewLength;
iLength-GetWindowTextLength(hwndChat); i NewLength-i Length+strlen(szName)+strlen(szMessage)+5+l;
szBuffer-(char*)maTloc(iNewLength+l);
GetWi ndowText(hwndChat.szBuffer.i Length+1);
strcat(szBuffer.szName); strcat(szBuffer,":> "); strcat(szBuffer.szMessage); strcatCszBuffer."\r\n");
SetWindowText(hwndChat.szBuffer); free(szBuffer);
i nt k-Edi t_GetLi neCount(hwndChat); for (int i-0;i<k;i++)
SendMessageC hwndChat. EMLINESCROLL. 0. k);
Мы хотели бы обратить внимание на организацию главного цикла программы. В качестве главного окна приложения мы используем немодальный диалог. Делается это по одной причине — внутри цикла выборки сообщений нам требуется проверять состояние объекта события hEvent при помощи функции MsgWaitFor MultipleObjects, поэтому использование модального диалогового окна не подходит. Напомним, что модальное диалоговое окно организует свой собственный цикл выборки сообщений, к которому мы не имеет доступа. В целом, главный цикл окна, созданного при помощи CreateDialog, ничем особенным не отличается от аналогичного цикла обыкновенного окна. В нашей программе в этом цикле происходит блокировка программы либо до получения какого-нибудь сообщения, либо до перехода объекта «событие» в установленное состояние. Сообщения
Подводя итоги
423
обрабатываются в соответствии с принципами работы немодальных диалогов, а в ответ на переход объекта «событие» в установленное состояние вызывается функция ReceiveDPMessage, так как дескриптор этого объекта передавался нами при инициализации DirectPlay.
ChatDlgProc является диалоговой процедурой и обрабатывает все сообщения, предназначенные для главного ркна приложения. На ее примере читатель может убедиться в многословности синтаксиса WinGUI. Тем не менее ничего сложного в этой процедуре нет: в ответ на сообщение WM INITDIALOG устанавливается заголовок окна и его значок, а также удаляются ненужные пункты из его системного меню. Главным действием в этой процедуре является обработка сообщения WM COHMAND, которое происходит в ответ на нажатие кнопки «Отправить». При проектировании ресурсов эта кнопка указана как «кнопка по умолчанию», поэтому, если пользователь нажимает Enter, выполняется обработчик именно этой кнопки. Таким образом, нажатие клавиши Enter расценивается как завершение ввода сообщения, после чего происходит его печать в главном окне (функция AddMessage) и рассылка всем игрокам сеанса (функция SendDPMessage). Многократно упоминавшаяся функция AddMessage имеет два параметра (имя игрока и его сообщение) и производит вывод строки сообщения от этого игрока в главное окно. Дело в том, что для вывода сообщений всех участников сеанса используется стандартное текстовое поле Windows. Добавление сообщения происходит так: определяется размер текущего содержимого текстового поля, вычисляется его новый размер в соответствии с добавляемым текстом, выделяется участок памяти нужного размера. Затем в выделенный участок копируется текущее содержимое текстового поля и новое сообщение. И наконец, новый буфер передается текстовому полю. Обратите внимание на следующий фрагмент кода: int k-Edit GetLineCount(hwndChat): for (int i-0;i<k;i++)
SendMessage( hwndChat. EMLINESCROLL. 0. k);
Он выполняет прокрутку текстового поля для того, чтобы последнее сообщение всегда было видно на экране.
На этом мы заканчиваем рассмотрение данного примера. Его полный код и все необходимые ресурсы вы можете найти на прилагаемом компакт-диске.
Подводя итоги
В этом уроке мы рассмотрели:
0 Принципы работы DirectPlay.
Предыдущая << 1 .. 177 178 179 180 181 182 < 183 > 184 185 186 187 188 189 .. 229 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.