Visual C++ FAQ
Страница 9.


 

4. Я пытаюсь вызвать Windows API, но компилятор выдаёт undeclared identifier error (C2065). Почему?

Заголовочные файлы Windows могут использоваться создания приложения для различных версий Windows начиная с Windows 95 и NT 3.51. Так получилось, что не все функции API присутствуют во всех версиях Windows. Так вот, чтобы компилятор не ругался а, соответственно и не ипытался использовать несуществующие в данной версии Windows функции API, необходимо использовать следующую систему деректив препроцессора.

Директивы позволяют выборочно включать прототипы API:

  • WINVER: версия Windows (в добавление к 9x/Me и NT)
  • _WIN32_WINDOWS: для Windows 9x/Me
  • _WIN32_WINNT: для Windows NT
  • _WIN32_IE: Общие элементы управления

По умолчанию Вы можете использовать только функции присутствующие в Windows 95, NT 3.51, и pre-IE3 common controls. Чтобы использовать API в более поздних версиях Windows, необходимо #define вышеописанные директивы перед включением различных Windows заголовков.

Здесь полный список значений для данных макросов.

 

6. Я добавляю исходные файлы к проекту, а компилятор выдаёт ошибку "C1010: unexpected end of file while looking for precompiled header directive." Почему?

По умолчанию, поекты Visual C++ используют прекомпилированные заголовки. Данная система компилирует большие заголовки только один раз при создании stdafx.cpp. В любом другом файле .CPP Вашего проекта необходимо добавить #include "stdafx.h" в самом начале. Компилятор ищет имя "stdafx.h", чтобы знать, где вставить прекомпилированную заголовочную информацию.

Если возникает такая ошибка, то необходимо отключить прекомпилированные заголовки (precompiled headers). В опциях проекта, в закладке C/C++ выберите категорию Precompiled headers. Кликните радио кнопку Not using precompiled headers, а затем нажмите OK.

 

11. Как изменить курсор, когда он находится на моём окне?

Обработайте сообщение WM_SETCURSOR , и вызовите функцию SetCursor() для изменения курсора. Обратите внимание, что когда окно принимает это сообщение, при каждом движении мышки, поэтому позаботьтесь, чтобы обработчик WM_SETCURSOR работает довольно быстро.

 

12. Как я могу скрыть или показать окно?

Чтобы показать окно:

 ShowWindow ( hwndYourWindow, SW_SHOW );

Чтобы скрыть его:

 ShowWindow ( hwndYourWindow, SW_HIDE );

Так же существуют и другие флаги, которые позволяют максимизировать и минимизировать окна. Смотрите страницу ShowWindow() в MSDN.

 

13. Как разрешить или запретить элементы управления диалога (кнопки, окна редактирования, и т.д.)?

Чтобы разрешить элемент управления:

 EnableWindow ( hwndYourControl, TRUE );

Чтобы запретить его:

 EnableWindow ( hwndYourControl, FALSE );

 

14. Как заставить окно быть всегда на переднем плане?

Выводим окно на передний план:

 SetWindowPos ( hwndYourWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );

Возвращаем в обратное состояние:

 SetWindowPos ( hwndYourWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );

 

17. Как вывести текст в консольном приложении различными цветами?

Каждый символ сонсольного приложения имеет свои аттрибуты, и Win32 консольные функции могут работать с аттрибутами двумя способами. SetConsoleTextAttribute() работает с символами, записанными в буфере, в то время как FillConsoleOutputAttribute() напрямую изменяет атрибуты символов.

Следующие функции можно использовать для нормального, жирного и обратного текста (предполагается, что класс имеет обработчик консоли через вызов GetStdHandle()):

void CMyConsoleClass::SetTextNormal()
{
// белым на чёрном - по умолчанию
SetConsoleTextAttribute ( m_hConsole,
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
}

void CMyConsoleClass::SetTextBold()
{
// ярко-белым на чёрном
SetConsoleTextAttribute ( m_hConsole,
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
FOREGROUND_INTENSITY );
}

void CMyConsoleClass::SetTextReverse()
{
// чёрным на белом
SetConsoleTextAttribute ( m_hConsole,
BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE );
}

Обратите внимание, что нет никаких установок для мерцания и подчёркивания, так что Вам прийдётся проявить немного изобратательности, если Вы хотите полностью съэмулировать текстовые режимы ANSI или VT100 данным методом.

 

 
« Предыдущая статья