Иллюстрированный самоучитель по Visual Studio.Net

         

Если вы знакомы со структурой



Если вы знакомы со структурой приложения Win32, то можете безболезненно пропустить несколько параграфов и перейти к параграфу с заголовком «Развитие начальной заготовки».

Рассмотрим более подробно структуру традиционного Windows-приложения, представленную нам мастером Win32 Application Wizard Studio.Net. Программа спроектирована как шаблон (стартовая заготовка), который можно развивать, внося в него желаемую разработчиком функциональность.

Создайте новый проект приложения Win32. Для этого:

  • В меню File > New выберите команду Project.

  • В появившемся диалоге New Project, в окне Project Type раскройте узел дерева под именем Visual C++ Projects и выберите узел Win32 Projects.

  • В окне Templates выберите тип проекта Win32 Project.

  • В окне Name задайте имя проекта: API. В окне Location задайте или оставьте без изменения местоположений новой папки с файлами решения (solution).

  • Нажмите ОК и проанализируйте предлагаемые по умолчанию мастером Win32 Application Wizard настройки проекта.

  • Нажмите кнопку Finish.


  • Запустите стартовую заготовку и убедитесь, что она создает окно с планкой меню и реагирует на shortcut-комбинацию Alt+? или Alt+/, создавая диалог About. Раскройте дерево в окне Class View студии и щелкните два раза имя глобальной переменной hlnst. Курсор переходит в окно редактора, где вы видите заготовку традиционного приложения Win32. Надо отметить, что она богаче оснащена, чем аналогичные заготовки предыдущих версий Visual C++. Кроме пяти функций здесь содержатся ресурсы (меню, диалог, значок, строки текста, и клавиатурный ускоритель). Вы можете убедиться в этом, раскрыв дерево ресурсов в окне Resource View, которое входит в блок страниц вместе с окном Class View. Анализ и развитие этой заготовки мы произведем немного позже, а сейчас приведем листинг, который создал мастер Win32 Application Wizard.1

    // API.cpp : Определяет точку входа приложения

    //

    #include "stdafx.h"

    #include "API.h"



    #define MAX_LOADSTRING 100

    //======== Глобальные переменные:



    HINSTANCE hlnst;

    // Текущий экземпляр

    TCHAR szTitle[MAX_LOADSTRING];

    // Текст заголовка окна

    TCHAR szWindowClass[MAX_LOADSTRING];

    // Текст регистрации

    //======== Прототипы функций, входящих в данный модуль

    ATOM MyRegisterClass(HINSTANCE hlnstance);

    BOOL Initlnstance(HINSTANCE, int);

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

    int APIENTRY WinMain(HINSTANCE hlnstance,

    HINSTANCE hPrevInstance,

    LPSTR IpCmdLine,

    int nCmdShow)

    {

    //======= TODO: Помещайте код здесь

    MSG msg;

    HACCEL hAccelTable;

    //======= Инициализация глобальных строк текста

    LoadString(hlnstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hlnstance, IDC_API, szWindowClass, MAX_LOADSTRING);

    //======= Вызов функции регистрации приложения

    MyRegisterClass(hlnstance);

    //======= Инициализация приложения:

    if (!Initlnstance (hlnstance, nCmdShow))

    {

    return FALSE;

    }

    //======= Загрузка клавиатурных ускорителей

    hAccelTable = LoadAccelerators (hlnstance, (LPCTSTR)IDC_API);

    //======= Цикл ожидания и обработки сообщений:

    while (GetMessage(&msg, NULL, 0, 0))

    if (!TranslateAccelerator(msg.hwnd, hAccelTable, Smsg))

    {

    TranslateMessage(Smsg);

    DispatchMessage(Srasg);

    }

    }

    return msg.wParam;

    }

    //

    // FUNCTION: MyRegisterClass ()

    //

    // НАЗНАЧЕНИЕ: Регистрирует оконный класс

    //

    // COMMENTS: //

    // Эта функция нужна только если вы хотите, чтобы код

    // был совместим с Win32 системами, которые

    // существовали до создания функции 'RegisterClassEx ' ,

    // введенной в Windows 95.

    // Вызов 'RegisterClassEx' необходим для правильного

    // создания маленького (small) значка, ассоциированного

    // с приложением.

    //

    ATOM MyRegisterClass (HINSTANCE hlnstance)

    {

    WNDCLASSEX wcex;

    wcex.cbSize = sizeof (WNDCLASSEX) ;

    wcex. style = CS_HREDRAW | CS_VREDRAW;

    wcex.lpfnWndProc = (WNDPROC) WndProc;

    wcex. cbClsExtra = 0;

    wcex.cbWndExtra = 0;

    wcex. hlnstance = hlnstance;

    wcex.hlcon = Loadlcon (hlnstance,



    (LPCTSTR) IDI_API) ;

    wcex.hCursor = LoadCursor (NULL, IDC_ARROW) ;

    wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW+1) ;

    wcex.lpszMenuName = (LPCSTR) IDC_API;

    wcex. IpszClassName = szWindowClass;

    wcex.hlconSm = Loadlcon (wcex. hlnstance, (LPCTSTR) IDI_SMALL)

    return RegisterClassEx (&wcex) ;

    }

    //

    // FUNCTION: Initlnstance (HANDLE, int)

    //

    // НАЗНАЧЕНИЕ: Запоминание описателя экземпляра

    // приложения и создание главного окна приложения

    //

    // COMMENTS:

    // В этой функции мы запоминаем описатель экземпляра

    // приложения в глобальной переменной и создаем

    // главное окно приложения.

    //

    BOOL Initlnstance(HINSTANCE hlnstance, int nCmdShow)

    {

    HWND hWnd;

    //======= Запоминаем экземпляр приложения

    hlnst = hlnstance;

    //======= Создаем главное окно

    hWnd = CreateWindow(szWindowClass, szTitle, WSJDVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hlnstance, NULL),

    if (IhWnd) {

    return FALSE; }

    ShowWindow(hWnd, nCmdShow);

    UpdateWindow(hWnd) ;

    return TRUE; }

    //

    // FUNCTION: WndProc(HWND, unsigned, WORD, LONG)

    //

    // НАЗНАЧЕНИЕ: Обработка сообщений главного окна.

    //

    // WM_COMMAND - обработка команд меню

    // WM_PAINT - перерисовка окна

    // WM_DESTROY - посылка сообщения о завершении и выход

    //

    //

    LRESULT CALLBACK WndProc (HWND hWnd, UINT message,

    WPARAM wParam, LPARAM IParam)

    {

    int wmld, wmEvent;

    PAINTSTRUCT ps;

    HDC hdc;

    switch (message)

    {

    case WM_COMMAND:

    wmld = LOWORD (wParam) ;

    wmEvent - HIWORD (wParam) ;

    //====== Расшифровка выбора в меню:

    switch (wmld)

    {

    case IDM_ABOUT:

    DialogBox (hlnst, (LPCTSTR) IDD_ABOUTBOX, hWnd,

    (DLGPROC)About) ;

    break;

    case IDM_EXIT:

    DestroyWindow(hWnd);

    break;

    default:

    return DefWindowProc(hWnd, message, wParam, IParara);

    {

    break;

    //======= Ветвь перерисовки содержимого окна

    case WM_PAINT:

    hdc = BeginPaint(hWnd, sps);

    //======= TODO: Вставьте сюда рисующий код

    EndPaint(hWnd, Sps);

    break; //======= Ветвь закрытия окна

    case WM_DESTROY:



    PostQuitMessage(0);

    break; default:

    return DefWindowProc(hWnd, message, wParam, IParam);

    }

    return 0;

    }

    //======= Обработчик команды вызова диалога About

    LRESULT CALLBACK About(HWND hDlg, UINT message,

    WPARAM wParam, LPARAM IParam)

    {

    switch (message)

    {

    //======= Ветвь инициализации окна диалога

    case WM_INITDIALOG:

    return TRUE;

    //======= Ветвь обработки команд, исходящих

    //======= от элементов управления диалога

    case WM_COMMAND:

    if (LOWORD(wParam) == IDOK ||

    LOWORD(wParam) == IDCANCEL)

    EndDialog(hDlg, LOWORD(wParam));

    return TRUE;

    }

    break;

    }

    return FALSE;

    }




    Содержание раздела