Главная страница

Справочник по математике. Справочное_пособие_Visual C++. Программа на C, типы данных и их размер Адресация в С


Скачать 0.66 Mb.
НазваниеПрограмма на C, типы данных и их размер Адресация в С
АнкорСправочник по математике
Дата19.12.2022
Размер0.66 Mb.
Формат файлаpdf
Имя файлаСправочное_пособие_Visual C++.pdf
ТипПрограмма
#852232
страница12 из 13
1   ...   5   6   7   8   9   10   11   12   13
2 #include
3 #include
4 #include
5 #include
6 #define SRV_HOST "delta"
7 #define SRV_PORT 1234
8 #define CLNT_PORT 1235
9 #define BUF_SIZE 64
10 #define TXT_ANSW "I am your client\n"
11 main () {
12 int s;
13 int from_len;
14 char buf[BUF_SIZE];
15 struct hostent *hp;
16 struct sockaddr_in clnt_sin, srv_sin;
17 s = socket (AF_INET, SOCK_STREAM, 0);
18 memset ((char *)&clnt_sin, '\0', sizeof(clnt_sin));
19 clnt_sin.sin_family = AF_INET;
20 clnt_sin.sin_addr.s_addr = INADDR_ANY;
21 clnt_sin.sin_port = CLNT_PORT;
22 bind (s, (struct sockaddr *)&clnt_sin, sizeof(clnt_sin));
23 memset ((char *)&srv_sin, '\0', sizeof(srv_sin));
24 hp = gethostbyname (SRV_HOST);
25 srv_sin.sin_family = AF_INET;
26 memcpy ((char *)&srv_sin.sin_addr,hp->h_addr,hp->h_length);

27 srv_sin.sin_port = SRV_PORT;
28 connect (s, &srv_sin, sizeof(srv_sin));
29 from_len = recv (s, buf, BUF_SIZE, 0);
30 write (1, buf, from_len);
31 send (s, TXT_ANSW, sizeof(TXT_ANSW), 0);
32 close (s);
33 exit (0);
34 }
В строках 6 и 7 описываются константы SRV_HOST и SRV_PORT, определяющие имя удаленного узла, на котором функционирует программа-сервер, и номер порта, к которому привязан socket сервера.
Строка 8 приписывает целочисленной константе 1235 символическое имя CLNT_PORT. В дальнейшем эта константа будет использована в качестве номера порта клиента.
В строках 17...22 создается привязанный к порту на локальном узле socket.
В строке 24 посредством библиотечной функции gethostbyname транслируется символическое имя удаленного узла (в данном случае "delta"), на котором должен функционировать сервер, в адрес этого узла, размещенный в структуре типа hostent.
В строке 26 адрес удаленного узла копируется из структуры типа hostent в соответствующее поле структуры srv_sin, которая позже (в строке 28) используется в системном вызове connect для идентификации программы-сервера.
В строках 29...31 осуществляется обмен данными с сервером и вывод вопроса, поступившего от сервера, в стандартный вывод.
Строка 32 посредством системного вызова close закрывает (удаляет) socket.
17. Простая программа, использующая MDI интерфейс
В этом разделе рассматривается программа использующая MDI ( интерфейс многих документов )
Мы создадим программу, в которой документом является графическое изображение - круг. В ToolBar будет создана иконка, при нажатие на которою будет вызываться диалоговое окно, позволяющее изменять координаты круга. Местоположение круга можно будет согранять в файл с расширением CIR.
Создание проекта программы
1. Создайте новый проект( у меня MDI ), использующая MDI интерфейс с поддержкой MFC. Все шесть шагов в
MFC AppWizard оставте без изменения.
2. Если вы сделали всё правильно, то создадутся пять классов : CMDIApp, CMainFrame, CChildFrame,
CMDIDoc и CMDIView. В классе документов CMDIDoc вы пишите код для поддержки данных программы, а в классе представления CMDIView - код, отвечающий за то, что вы видите на экране. Вы будете писать код в функциях-элементах только этих двух классов.
3. Объявляем элементы данных класса документа. Их будет два : координаты круга по X и по Y. Для этого открываем файл CMDIDoc.h и изменяем объявление класса CMDIDoc следующим образом:
class CMDIDoc : public CDocument {

protected: // create from serialization only
CMDIDoc();
DECLARE_DYNCREATE(CMDIDoc) // Attributes
public:
int m_X; //
координаты круга по x
int m_Y; //
координаты круга по y
// Operations ... ...
4. Объявляем элементы данных класса представления. Их будет тоже два : координаты круга по X и по Y. Для этого открываем файл CMDIView.h и изменяем объявление класса CMDIView следующим образом:
class CMDIView : public CView {
protected: // create from serialization only
CMDIView();
DECLARE_DYNCREATE(CMDIView) // Attributes
public:
CMDIDoc* GetDocument();
int m_X; //
координаты круга по x
int m_Y; //
координаты круга по y
// Operations ... ...
Как вы видите, имена переменных могут совпадать( обычно так и делается ).
5. Инициализируем элементы данных класса документа. Для этого откройте файл MDIDoc.cpp, найдите в нём функцию OnNewDocument() и напишите в ней следующий код:
BOOL CMDIDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
m_X = 100; //
начальное положение по X=100
m_Y = 100; //
начальное положение по Y=100
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;

}
6. Инициализируем элементы данных класса представления. Для этого нужно создать функцию-элемент
OnInitialUpdate() класса представления:
Выберите ClassWizard в меню View. На странице Message Maps выберите следующие события:
Class neme : CMDIView
Object ID : CMDIView
Message : OnInitialUpdate
и нажмите на кнопку Add Function
Напишите следующий код в функцию OnInitialUpdate():
void CMDIView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the
base class
CMDIDoc* pDoc = GetDocument(); //
получить указатель на
документ
//
обновить элементы данных представления
//
соответствующими значениями документа.
m_X = pDoc->m_X;
m_Y = pDoc->m_Y;
pDoc->SetTitle("ANDY"); //
всем документам даётся название
ANDY
}
7. Теперь напишем код для вывода круга на экран.
Функция OnDraw() класса представления автоматически выполняется всякий раз, когда нужно вывести окно документа.
Напишите следующий код в функции OnDraw() :
void CMDIView::OnDraw(CDC* pDC)
{
CMDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

pDC->Ellipse(m_X - 20, m_Y - 20, m_X + 20, m_Y + 20); //
рисуем круг диаметром 20
}
8. Напишем код для сохранения и считывания данных из файла.
Откройте файл MDIDoc.cpp, найдите в нём функцию Serialize() и измените её:
void CMDIDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring()) {
// TODO: add storing code here(
это выполняется если
выбрать SAVE )
ar<
записываем m_X в выбранный файл
ar<
записываем m_Y в выбранный файл
} else {
// TODO: add loading code here (
это выполняется если
выбрать OPEN )
ar>>m_X; //
считываем значение из выбранного файла в
m_X
ar>>m_Y; //
считываем значение из выбранного файла в
m_Y
}
}
9. Часто бывает нужно изменить некоторые параметры программы, такие как заголовок главного окна или тип файла по умолчанию, который выводится в диалоговых панелях SAVE и OPEN. Для этого нужно выбрать закладку ResourceView и открыть пункт String Table. Вы увидите список переменных проекта( три колонки : ID,
Value и Caption ).
IDR_MAINFRAME - заголовок главного окна (изменяется в поле Caption)
IDR_MCIRCLTYPE - тип файла по умолчанию, вы увидите 6 подстрок разделёнными знаком \n. Третья и четвёртая подстроки определяют тип документа по умолчанию. У меня CIR FILES( *.cir ) и .cir соответственно. Вы можете поставить свои значения.
10. Теперь создадим кнопку в панеле инструментов. Для этого нужно выбрать закладку ResourceView и открыть пункт Toolbar. Вы увидите панель инструментов в режиме редактирования. Нажмите на самую правую кнопку( пунктирный квадрат ), ниже нарисуйте кнопку по вашему усмотрению. Теперь дважды нажмете на вашу кнопку и введите ID: ID_MYBUTTON и Prompt: Изменение координат круга\nИзменение координат круга. Ну вот и всё, кнопка готова. Теперь нужно создать функцию, которая будет выполняться при нажатии на вашу кнопку :
Выберите пункт меню View далее ClassWizard, выберите закладку Message Maps, Project: MDI, Class name:
CMDIView, Object IDs: ID_MYBUTTON, Message: COMMAND и нажмите на кнопку Add Function. В ответ создастся функция void CMDIView::OnMybutton().
11. Теперь по аналогии с главой 15 создадим собственное диалоговое окно с ID: IDD_MY_DIALOG и классом
CMyDialog и разместим в нём четыре Edit Box с переменными типа INT: m_DX - текущая позиция по X, m_DY
- текущая позиция по Y, m_DXN - новая позииция по X, m_DYN - новая позииция по Y. Не забудте написать

#include "MyDialog.h" в файлах MDIDoc.cpp и MDIView.cpp.
12. Теперь напишем код в функцие OnMybutton().
void CMDIView::OnMybutton()
{
// TODO: Add your command handler code here
CMDIDoc* pDoc = GetDocument(); //
получаем указатель на
документ
CMyDialog MyD; //
создаём переменную класса CMyDialog
MyD.m_DX = MyD.m_DXN = pDoc->m_X; //
инициализмруем
переменные диалога
MyD.m_DY = MyD.m_DYN = pDoc->m_Y; //
MyD.DoModal(); //
создаём новый диалог
pDoc->m_X = MyD.m_DXN; //
получаем новые значения
pDoc->m_Y = MyD.m_DYN; //
OnInitialUpdate(); //
синхронизируем данные
Invalidate( TRUE ); //
перерисовываем экран (вызов OnDraw())
pDoc->SetModifiedFlag(); //
ставим флаг изменения документа
}
13. Ну вот и всё, программа готова.
18. Проигрывание Wave-файлов под MFC
1. Введение
2. Проигрывание Wave-файла в виде ресурса
3. Проигрывание Wave-файла с диска
4. Пример проекта
1. Введение
В этой главе мы создадим программу, проигрывающую WAVE-файлы. Для начала создадим проект mysound в диалоговом режиме с использованием MFC. В начало файла mysoundDlg.cpp надо написать #include , но это не всё, а теперь самое главное( если это не сделать, то будет ошибка при линковании ) :
1. Выберите Project -> Settings... --> C/C++ --> Code Generation и поставте Multithreaded DLL
2. Выберите Project -> Settings... --> Link --> General и поставте в поле Object/Library modules библиотеку
winmm.lib( это очень важно, проверте !!! )
2. Проигрывание Wave-файла в виде ресурса
Первым делом надо создать ресурс, для этого в файле mysound.rc2 надо вписать строчку IDSOUND_CORRECT sound

res\correct.wav, где IDSOUND_CORRECT - индефикатор ресурса, sound - тип ресурса( название можно менять ),
res\correct.wav - файл ресурса. После этого в файле Resource.h надо зарегистрировать ресурс: #define
IDSOUND_CORRECT 130. Число 130 не должно совпадать с другими числами.
Как только ресурс зарегистрирован можно написать в файле mysoundDlg.cpp функции проигрывания этого ресурса :
static void PlayResource(LPCTSTR lpszSound)
{
HRSRC hRes; // resource handle to wave file
HGLOBAL hData;
BOOL bOk = FALSE;
if ((hRes = ::FindResource(AfxGetResourceHandle(), lpszSound,
_T("sound"))) != NULL && (hData =
::LoadResource(AfxGetResourceHandle(), hRes)) != NULL) {
// found the resource, play it
bOk = sndPlaySound((LPCTSTR)::LockResource(hData),
SND_MEMORY|SND_SYNC|SND_NODEFAULT);
FreeResource(hData);
}
if (!bOk) {
AfxMessageBox("ERROR !!! Can not play the sound. \nNot
find sound board !!!");
}
}
inline static void PlayResource(UINT nIDS) {
PlayResource(MAKEINTRESOURCE(nIDS)); }
В фунции ::FindResource(AfxGetResourceHandle(), lpszSound, _T("sound")) третий параметр - тип ресурса, который был описан выше.
Теперь можно проиграть ресурс : PlayResource( IDSOUND_CORRECT );
3. Проигрывание Wave-файла с диска
Для проигрывания WAVE-файла с диска можно использовать функцию :
BOOL sndPlaySound( LPCTSTR lpszSoundName; UINT fuOptions;);
Параметры функции: lpszSoundName Имя файла. Если этот параметр NULL, то проигрывание файла останавливается.
fuOptions Специальные опции для проигрывания музыки. Они могут быть следующими: Значение Описание
SND_SYNC Музыка играется синхронно, и функция не возвращает указатель пока не будет конца файла. SND_ASYNC
Музыка играется асинхронно, и функция возвращает указатель сразу после начала проигрывания файла. Чтобы остановить проигрывание, надо вызвать функцию SndPlaySound с параметром lpszSoundName установленным в NULL.

SND_NODEFAULT Если файл не найден, то функция возвращает указатель сразу и не проигрывает стандартный звуковой эффект Windows. SND_MEMORY Этот параметр нужен для проигрывания Wave-файла в виде ресурса( из памяти ). SND_LOOP Этот параметр нужен для проигрывания Wave-файла в циклическом режиме. Также при этом вы должны использовать влаг SND_ASYNC. Чтобы остановить проигрывание, надо вызвать функцию SndPlaySound с параметром lpszSoundName установленным в NULL. SND_NOSTOP Если музыка уже проигрывается, то функция возврвщает FALSE. Возвращаемое значение: Если музыка проигрывается правильно, то функция возврвщает TRUE, иначе FALSE.
Пример использования:
BOOL bOk = sndPlaySound( "test.wav", SND_SYNC);
if (!bOk) {
AfxMessageBox("Error ! Can not play the sound. !!!");
}
19. Создание собственных ActiveX элементов
1. Введение
2. Создание проекта
3. Настройка значка инструмента MyClock
4. Рисование в элементе управления MyClock
5. Вывод текущего времени в непрерывном режиме
6. Включение базовых свойств в ActiveX MyClock
7. Включение специального свойства в ActiveX MyClock
1. Введение
Элементов управления ActveX — это файл с расширением ОСХ (например, MyButton.OCX), который вы можете использовать в своем приложении Visual C++. Visual C++ и другие визуальные языки программирования дают вам возможность включить элемент управления ActiveX в свою программу и пользоваться им так же, как и стандартным элементом управления Visual C++. Вы помещаете элемент управления ActiveX в диалоговую панель, задаете его свойства и связываете код с его событиями. После того как ы создали собственный элемент управления ActiveX, вы ожете передавать его другим программистам, которые могут вводить его в свои программы.
Поскольку расширением файла элемента управления ActiveX является .ОСХ, то иногда элементы управления ActiveX называют элементами ОСХ.
В этой главе вы разработаете свой собственный элемент управления ActiveX — MyClock.ОСХ, который выполняет задачу вывода текущего времени. Когда программист помещает элемент управления MyClock.ОСХ в форму или в диалоговую панель, MyClock. ОСХ будет непрерывно отображать текущее время.
2. Создание проекта
Чтобы создать проект элемента управления MyClock.OCX :
1) Выберите New в меню File.
В ответ Visual C++ выведет диалоговую панель New.
2) Выберите закладку Projects диалоговой панели New.
3) Выберите MFC ActiveX ControlWizard из списка типов проектов
4) Напечатайте MyClock в окне Project Name.
5) Щелкните на кнопке, которая расположена с правой стороны окна Location, и выберите каталог для проекта.
6) Щелкните на кнопке ОК.
В ответ Visual C++ выведет окно MFC ActiveX ControlWizard Step 1 of 2
В окне ActiveX ControlWizard Step 1 оставьте все установки в состоянии по умолчанию и щелкните на кнопке
Next.
В окне ActiveX ControlWizard Step 2 оставьте все установки в состоянии по умолчанию и щелкните на кнопке
Finish.
В ответ Visual C++ выведет диалоговую панель New Project Information.
Щелкните на кнопке ОК в диалоговой панели New Project Information и выберите Set Active Configuration в меню
Build.

В ответ Visual C++ выведет диалоговую панель Set Active Project Configuration.
Выберите MyClock - Win32 Release в диалоговом окне Set Active Project Configuration и щелкните на кнопке ОК.
Это все! Вы завершили создание файла проекта и каркасов файлов элемента управления ActiveX MyClock.ОСХ.
1   ...   5   6   7   8   9   10   11   12   13


написать администратору сайта