Visual C++ FAQАвтор: Michael Dunn Данный материал представляет собой небольшую подборку часто задаваемых вопросов по Visual C++ и MFC, ну и естевственно ответов на них. Так же присутствуют вопросы по ошибкам компилятора и и общие вопросы программирования в Си. Содержание: 1. Почему я получаю unresolved external error (LNK2001) в
1. Почему я получаю unresolved external error
(LNK2001) в Release версия ATL проектов содержит оптимизацию, по средствам чего проект не связан с C runtime library (CRT) чтобы уменьшить размер Вашего исполняемого модуля. Если Вы используете функции из CRT (например, функции манипуляции со строками) или классы из библиотеки C++, то Вам необходимо линковать проект с CRT. В опциях проекта, в закладке C/C++ выберите
категорию Preprocessor. Удалите директиву Для получения более детальной информации, в MSDN задайте поиск по слову "lnk2001 atl".
2. Как сделать новую строчку в многострочном edit ? Для создания новой строки используется
"\r\n". Если Вы будете использовать "\r"
или "\n" или даже "\n\r",
3. Как сделать, чтобы диалог не закрывался при нажатии пользователем Enter или Esc? Для начала разберёмся, почему диалог
закрывается, даже если убрать кнопки OK и Cancel.
Если у Вас есть кнопки с идентификаторами IDOK и
IDCANCEL, то можно воспользоваться Визардом (ClassWizard)
для добавления обработчиков class CMyDialog : public CDialog { // ... // Generated message map functions //{{AFX_MSG(CMyDialog) virtual void OnOK(); virtual void OnCancel(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; А затем в соответствующем .CPP файле: void CMyDialog::OnOK() { } void CMyDialog::OnCancel() { } Теперь обработчики не будут вызывать
4. Я пытаюсь вызвать Windows API, но компилятор выдаёт undeclared identifier error (C2065). Почему? Заголовочные файлы Windows могут использоваться создания приложения для различных версий Windows начиная с Windows 95 и NT 3.51. Так получилось, что не все функции API присутствуют во всех версиях Windows. Так вот, чтобы компилятор не ругался а, соответственно и не ипытался использовать несуществующие в данной версии Windows функции API, необходимо использовать следующую систему деректив препроцессора. Директивы позволяют выборочно включать прототипы API:
По умолчанию Вы можете использовать только
функции присутствующие в Windows 95, NT 3.51, и pre-IE3 common
controls. Чтобы использовать API в более поздних
версиях Windows, необходимо Здесь полный список значений для данных макросов.
6. Я добавляю исходные файлы к проекту, а компилятор выдаёт ошибку "C1010: unexpected end of file while looking for precompiled header directive." Почему? По умолчанию, поекты Visual C++ используют
прекомпилированные заголовки. Данная система
компилирует большие заголовки только один раз
при создании stdafx.cpp. В любом другом файле .CPP
Вашего проекта необходимо добавить Если возникает такая ошибка, то необходимо отключить прекомпилированные заголовки (precompiled headers). В опциях проекта, в закладке C/C++ выберите категорию Precompiled headers. Кликните радио кнопку Not using precompiled headers, а затем нажмите OK.
11. Как изменить курсор, когда он находится на моём окне? Обработайте сообщение
12. Как я могу скрыть или показать окно? Чтобы показать окно: ShowWindow ( hwndYourWindow, SW_SHOW ); Чтобы скрыть его: ShowWindow ( hwndYourWindow, SW_HIDE ); Так же существуют и другие флаги, которые
позволяют максимизировать и минимизировать
окна. Смотрите страницу
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 консольные функции могут
работать с аттрибутами двумя способами. Следующие функции можно использовать для
нормального, жирного и обратного текста
(предполагается, что класс имеет обработчик
консоли через вызов 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 данным методом.
21. Как сделать глобальную переменную, доступной всем моим файлам .CPP? Для начала, в одном из файлов .CPP (и только одном) объявите переменную, которая будет глобальной (то есть за пределами всех функций и классов). Например: int g_volume;
Затем, в заголовочном файле, который будет
включён во все файлы .CPP - такой как stdafx.h -
добавьте объявление extern int g_volume; Ключевое слово
22. У меня есть строка, которая является представлением числа, скажем "10235". Как преобразовать её в integer? Используйте функции char* szNumber = "10235"; int iNum = atoi ( szNumber ); // integer long lNum = atol ( szNumber ); // long integer double dNum = atof ( szNumber ); // floating-point
23: Как из моего приложения запустить другую программу? Существует несколько функций, позволяющих
запускать другие программы. Самая простая - WinExec ( "C:\\path\\to\\program.exe", SW_SHOWNORMAL ); Так же существует функция ShellExecute ( hwndYourWindow, "open", "C:\\path\\to\\readme.txt",
NULL, NULL, SW_SHOWNORMAL );
В данном примере, Если Вам необходимо полностью контролировать
запущенное приложение, то необходимо
использовать STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = {0};
BOOL bSuccess;
bSuccess = CreateProcess ( NULL, "\"C:\\Program Files\\dir\\program.exe\"",
NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi );
Обратите внимание, что если имя программ содержит пробелы, то его необходимо заключить в кавычки, как показано выше. Если CloseHandle ( pi.hThread ); CloseHandle ( pi.hProcess ); Конечно же, если всё, что Вам нужно, это просто
запустить программу, то необходимость в
|