Кодим сокеты на MFC

cuttah (cutter@real.xakep.ru)

Xakep, номер #061, стр. 061-090-1

Бесконечные крестики-нолики по Сети

Ты когда-нибудь заморачивался сетевым программированием под винды? Писал клиент-серверные приложения? В общем, писал - не писал, а сегодня научишься. Разберешься с работой асинхронных сокетов в MFC, поймешь, как устроен класс CSocket. А в итоге мы с тобой напишем бесконечные сетевые крестики-нолики. Так что активизируйся, и поехали...

Как я сказал, писать мы будем при помощи класса CSocket под MFC. Для этого, по понятным причинам, нам понадобится Visual C++. И вот что мы сделаем. Вначале мы создадим обычное диалоговое приложение. Затем добавим какие-нибудь простенькие bitmap для изображения пустого поля, с крестиком и с ноликом. Потом добавим обработчик нажатия мышки по полю. Сделаем отображение поля. Создадим новый класс для работы с Сетью. И самое последнее – замутим обмен данными по Сети, чтобы люди могли нормально поиграть. Что ж, обо все по порядку.

Стартовая часть

Запускай Visual C++ (у меня это Microsoft Visual Studio .NET 2003) и создавай новое MFC приложение – Visual C++ Projects -> MFC -> MFC Application. Дай ему имя, например xo, и дави на кнопку OK. Выползет новое окно. В нем заходи во вкладку Application Type. Там выбирай приложение Dialog based. Теперь во вкладке Advanced Features добавь поддержку сокетов. Для этого отметь крестиком надпись Windows sockets.

Все, можно давить на Finish. Будет создано новое приложение. С ним мы и продолжим нашу работу. Для начала добавим в него поддержку русского языка. Для этого открывай вкладку Resource View. Найди в ней свое диалоговое окно. Кликай на Properties окна и выбирай там русский язык. Сделал? Прекрасно! Теперь наше приложение понимает великий и могучий. Можешь попробовать запустить его – Debug -> Start.

Кликабельное поле

Приложение компилится. Русский язык отображается. Все ок. Тогда добавим в него поле для нашей будущей игры и сами формочки для соединения. Для этого открой еще раз диалоговое окно. Удали оттуда все кнопки и поле с надписью TODO. Добавь на него 1 Edit Control (IDC_EDIT_ADDRESS) и 3 кнопки (Button). В Edit Control будет прописываться хост для соединения (если ты клиент, а не сервер). А для трех кнопок поставь следующие значения: Connect, Create Server и Exit. Соответственно, одна предназначена для соединения, а две другие для создания сервера либо выхода из программы.

Теперь нам надо нарисовать 3 bitmap. Вот что в них будет содержаться: пустое поле, поле с крестиком и поле с нулем. Назови их соответственно: IDB_EMPTY, IDB_X и IDB_O. Само поле мы будем хранить в переменной-массиве m_stat. Объяви ее в описании класса. У меня это выглядит так:

int m_stat[20][20];

Теперь нам надо добавить цикл, который будет отображать состояние поля на форме. Для этого в своем классе найди метод OnPaint. В него я добавил следующий код:

for (x=0; x<size_x; x++){

for (y=0; y<size_y; y++){

if (m_stat[x][y]==0)

dc.DrawState(CPoint (posx, posy), picsize, bmp_empty, DST_BITMAP);

if (m_stat[x][y]==1)

dc.DrawState(CPoint (posx, posy), picsize, &bmp_x, DST_BITMAP);

Содержание  Вперед на стр. 061-090-2
ttfb: 3.4098625183105 ms