![]() |
#1 |
Бессмертный
|
![]()
Эти уроки, как я надеюсь, помогут научить Вас тому, что считается классическим программированием для Windows. Для начала возьмем старый добрый C (а не C++) и используем напрямую базовый интерфейс программирования приложений (API), а не какую бы то ни было другую оболочку, скрывающую под упрощенным, на первый взгляд, интерфейсом все тот же API. Постепенно, по мере возрастания сложности примеров, будут добавляться тексты программ на C++.
Конечно, для программирующих, скажем на Delphi, написание программы на простом C с использованием только API покажется сложным, однако в любом случае Вы сможете более отчетливо представлять, как действует Windows и ее приложения. Такой подход даст Вам знания, о которых Вы никогда не пожалеете. В дальнейшем Вы сможете пользоваться средствами, облегчающими программирование, такими как Microsoft Foundatoin Classes (MFC) или Object Windows Library (OWL), однако не советую делать это прежде, чем Вы научитесь программировать на обычном C. Что Вам потребуется? Компилятор C/C++ (Автор пользуется Microsoft Visual C++ 6.00). Настоятельно рекомендую пользоваться компилятором фирмы Microsoft, т.к. при использовании продуктов других фирм могут быть проблемы (в частности несоответствие библиотек). Если Вы послушались совета и используете Microsoft Visual C++, то Вам желательно также добавить в Ваш AUTOEXEC.BAT инструкцию: CALL VCVARS32.BAT Естественно, нужно указать правильный путь к файлу VCVARS32.BAT. Этот файл, включенный в VC++, устанавливает переменные среды DOS для компиляции программ с помощью командной строки DOS. Кроме того, желательно вставить в AUTOEXEC.BAT и вторую инструкцию CALL: CALL MSC.BAT и поместить файл MSC.BAT в удобный для вас каталог. Файл MSC.BAT SET CC=cl SET CFLAGS=-c -DSTRICT -G3 -Ow -W3 -Zp -Tp SET CFLAGSMT=-c -DSTRICT -G3 -MT -Ow -W3 -Zp -Tp SET LINKER=link SET GUIFLAGS=-SUBSYSTEM:windows SET DLLFLAGS=-SUBSYSTEM:windows -DLL SET GUILIBS=-DEFAULTLIB:user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib SET RC=rc SET RCVARS=-r -DWIN32 Ну а теперь... Урок №1 Hello, World! Не могу удержаться, чтобы не привести простейшую программу всех времен... #include <stdio.h> void main(void) { printf("Hello, world!\n"); } Если Вы думаете, что эта программа не будет работать под Windows, то глубоко ошибаетесь! Под Windows можно писать так называемые консольные приложения. Пример популярной консольной программы - Far manager. Для консольной программы в момент ее запуска операционной системой автоматически создается окно сеанса DOS, как и для обычной DOS-программы. На первый взгляд разницы между обычной DOS-программой и консольной программой нет. Однако это не так. Консольная программа может использовать всю мощь API (например работа с огромными блоками памяти, файлами, проецируемыми в память и т.д.), и даже создавать обычные Windows-окна. Для запуска приведенной выше программы создайте в MS Visual C++ проект с типом Console Application, добавьте в проект файл (с любым именем и расширением .c или .cpp) с текстом программы и затем откомпилируйте проект. Hello, Windows! (1) Однако наша задача - научиться писать полноценные программы под Windows (консольные приложения все же трудно назвать полноценными, хотя некоторые могут и не согласиться). Вот простейшая программа из серии Hello, Windows: //файл winmain.cpp #include <windows.h> //этот файл всегда включается //в Windows-программу //Это главная функция программы. int WINAPI WinMain(HINSTANCE hInst, //пусть Вас не смущает то, HINSTANCE hPrevInst, //что здесь написано. PSTR szCmdLine, //Мы разберем int iCmdShow) //это позже. { //Вывести сообщение на экран. MessageBox( //функция вывода сообщения NULL, //окно сообщения не имеет родителя "Hello, Windows!", //текст сообщения "Наша первая программа", //заголовок окна MB_ICONINFORMATION); //иконка, которая будет //выведена левее сообщения return 0; } Чтобы запустить эту программу, создайте проект с типом Win32 Application, добавьте в него файл с текстом программы и откомпилируйте. Конечно, эта программа - не более, чем учебный пример. Ничего полезного она делать не может. Hello, Windows! (2) Давайте теперь создадим скелет программы, который мы будем использовать в дальнейшем. Эта программа уже имеет нормальную структуру (т.е. примерно такую, какую имеют все Windows-программы). //файл hellowin.cpp #include <windows.h> //описание оконной процедуры LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //Это главная функция программы. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASSEX w; static CHAR *szAppName={"HelloWin"}; w.cbSize=sizeof(w); w.style=CS_HREDRAW|CS_VREDRAW; w.lpfnWndProc=WndProc; w.cbClsExtra=0; w.cbWndExtra=0; w.hInstance=hInst; w.hIcon=LoadIcon(NULL,IDI_APPLICATION); w.hCursor=LoadCursor(NULL,IDC_ARROW); w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH ); w.lpszMenuName=NULL; w.lpszClassName=szAppName; w.hIconSm=w.hIcon; RegisterClassEx(&w); hwnd=CreateWindow( szAppName, "Hello, Windows", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //Оконная процедура LRESULT CALLBACK WndProc(HWND hwnd, UINT imsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT r; switch(imsg) { case WM_CREATE: return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); GetClientRect(hwnd,&r); DrawText(hdc,"Hello, Windows!!!",-1,&r, DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,imsg,wParam,lParam); } Эта программа уже имеет все свойства обычной Windows-программы. Вы можете изменять размер окна, при этом текст всегда будет выводиться в его центре. Вы можете свернуть окно или развернуть его на весь экран. Конечно, сложность исходного текста поначалу может пугать, но это только в начале. На следующем уроке Вам предлагается изучить весь исходный текст этой программы строчка за строчкой. |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|