FAQ:WinAPI, VCPP Part 4 — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
м
(Перенаправление на FAQ:WinAPI VCPP)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
−
===Как создавать всплывающие подсказки (ToolTip)?===
+
#REDIRECT [[FAQ:WinAPI_VCPP]]
−
Этот элемент управления называется "Balloon ToolTip". (В МСДН есть статья под названием "Using ToolTip Controls")
+
−
[[Изображение:context_help.GIF]]
+
−
 
+
−
Тематические ссылки:
+
−
* http://www.codeproject.com/shell/LiviuBirjegaCode.asp
+
−
* http://www.codeproject.com/useritems/wtlntray.asp
+
−
 
+
−
 
+
−
Для того, чтобы подсказка имела вид "облака" (как в комиксах), нужно установить недокументированный стиль
+
−
TTS_BALLOON == 0x40
+
−
 
+
−
Вот ещё пара полезных функций API для работы с подсказками
+
−
<syntaxhighlight lang="cpp">
+
−
// через какое время появится на экране после наведения курсора
+
−
CToolTipCtrl::SetDelayTime(TTDT_INITIAL, время_в_миллисекундах);
+
−
 
+
−
// время горения подсказки на экране
+
−
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP, время_в_миллисекундах);
+
−
 
+
−
//время в миллисекундах - тип DWORD
+
−
</syntaxhighlight>
+
−
 
+
−
===Что делает функция ScrollWindow()===
+
−
Функция ScrollWindow() всего лишь двигает рисунок, уже нарисованный на контексте окна, на заданное количество пикселов.
+
−
 
+
−
К примеру, у имеется нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.
+
−
 
+
−
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.
+
−
 
+
−
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Функция ScrollWindow() как раз и пригодится, чтобы передвинуть рисунок на заданное количество пикселов. Останется потом только дорисовать.
+
−
 
+
−
===Почему список CComboBox не выпадает, хотя клавишами "вверх" и "вниз" значения перебираются?===
+
−
Нужно задать высоту выпадающего списка: находясь в редакторе форм, нужно щёлкнуть по стрелке комбобокса и за нижний маркер растянуть вниз, тем самым и задать размер выпадающего списка.
+
−
 
+
−
===Как программно поменять настройки Internet Explorer?===
+
−
Можно воспользоваться редактированием реестра:
+
−
 
+
−
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)
+
−
 
+
−
===Как узнать, когда после запуска приложение уже готово к работе?===
+
−
 
+
−
* Можно переопределить функцию CWinApp::Run(). Эта функция вызывается непосредственно перед запуском оконной процедуры.
+
−
 
+
−
<syntaxhighlight lang="cpp">
+
−
int CMyApp::Run()
+
−
{
+
−
// 1) приложение готово к работе, сейчас вызовется Run,
+
−
//    в котором реализована обработка очереди сообщений процесса
+
−
 
+
−
// 2) запускается очередь
+
−
int res = /*return*/ CWinApp::Run();
+
−
 
+
−
// 3) было получено сообщение WM_QUIT, вышли из CWinApp::Run()
+
−
 
+
−
// 4) возвращаемое приложением значение
+
−
return res;
+
−
}
+
−
</syntaxhighlight>
+
−
 
+
−
* Можно так же переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений приложения нет больше сообщений. Самый первый вызов функции будет соответствовать моменту, когда приложение стало быть готово к работе.
+
−
 
+
−
===Как получить короткое и длинное имя файла?===
+
−
Можно использовать функции API
+
−
<syntaxhighlight lang="cpp">
+
−
GetShortPathName(
+
−
LPCSTR lpszLongPath,
+
−
LPSTR  lpszShortPath,
+
−
DWORD    cchBuffer); //получить короткий путь
+
−
</syntaxhighlight>
+
−
и
+
−
<syntaxhighlight lang="cpp">
+
−
GetLongPathName(
+
−
LPCSTR lpszShortPath,
+
−
LPSTR  lpszLongPath,
+
−
DWORD    cchBuffer); //получить полный путь
+
−
</syntaxhighlight>
+
−
 
+
−
 
+
−
Например имеется путь к файлу:
+
−
 
+
−
D:\program files\Microsoft Office\OFFICE11\winword.exe
+
−
 
+
−
функция GetShortPathName() поможет привести его к виду:
+
−
 
+
−
d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE
+
−
 
+
−
а функция GetLongPathName() - наоборот.
+
−
 
+
−
Максимальная длина пути файла равна MAX_PATH (==260) символам
+
−
 
+
−
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===
+
−
 
+
−
Сообщение VM_MOVING посылается окну, когда пользователь перемещает окно.
+
−
 
+
−
Сообщение VM_MOVE посылается окну, когда пользователь завершил перемещение окна (отпустил кнопку мыши).
+
−
 
+
−
=== Как из программы определить каталог, в котором находится эта программа?===
+
−
Это можно сделать при помощи функции, которая возвращает абсолютное имя модуля.
+
−
<syntaxhighlight lang="cpp">
+
−
GetModuleFileName()
+
−
</syntaxhighlight>
+
−
 
+
−
В MFC можно использовать переменную-член класса CWinApp, определённую как
+
−
<syntaxhighlight lang="cpp">
+
−
LPCTSTR m_pszExeName;
+
−
</syntaxhighlight>
+
−
 
+
−
Получить доступ можно двумя способами:
+
−
<syntaxhighlight lang="cpp">
+
−
//1
+
−
AfxGetApp()->m_pszExeName;
+
−
 
+
−
//2
+
−
//extern CMyApp theApp
+
−
theApp.m_pszExeName;
+
−
</syntaxhighlight>
+
−
 
+
−
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечислено под пунктом Registred To? ===
+
−
Значение можно взять в реестре:
+
−
 
+
−
тут (для  Windows NT)
+
−
 
+
−
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
+
−
 
+
−
или тут (W98, W95)
+
−
 
+
−
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
+
−
 
+
−
===Как определить первый свободный ID, который можно использовать при динамическом создании элементов управления?===
+
−
Можно поступить так: начать перебор значений ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.
+
−
 
+
−
===Как изменить цвет рамки приложения?===
+
−
Это можно сделать, если перехватить сообщение WM_NCPAINT, которое отвечает за прорисовку не клиентской части окна.
+
−
 
+
−
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, когда запущенный процесс завершится, только потом продолжить выполнение программы?===
+
−
Нужно использовать функции
+
−
 
+
−
* CreateProcess()
+
−
* WaitForSingeObject()
+
−
 
+
−
<syntaxhighlight lang="cpp">
+
−
STARTUPINFO StartupInfo;
+
−
PROCESS_INFORMATION ProcessInfo;
+
−
DWORD dwRetValue;
+
−
RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
+
−
StartupInfo.cb = sizeof(StartupInfo);
+
−
 
+
−
//запуск экзешника
+
−
if(!CreateProcess(
+
−
szApplicationName,
+
−
szCommandLine, //командная строка (можно указать NULL)
+
−
NULL, NULL, FALSE,
+
−
NORMAL_PRIORITY_CLASS,
+
−
NULL,
+
−
szCurrentDirectory, //рабочая директория (можно указать NULL)
+
−
&StartupInfo,
+
−
&ProcessInfo))
+
−
{
+
−
//ошибка запуска
+
−
DWORD dwdErr=GetLastError(); //определяем ошибку
+
−
}
+
−
else
+
−
{
+
−
//ждём 30 секунд момента, пока процесс завершится
+
−
//(ProcessInfo.hProcess перейдёт в сигнальное состояние)
+
−
//если задать INFINITE, будет ждать до бесконечности
+
−
DWORD dwd=WaitForSingleObject(ProcessInfo.hProcess, 30000);
+
−
 
+
−
//dwd покажет причину завершения процедуры WaitForSingleObject
+
−
//WAIT_OBJECT_0 Состояние объекта переведено в сигнальное
+
−
//WAIT_TIMEOUT Кончился таймаут
+
−
 
+
−
//к теме не относится, но для мутекса ещё есть возвращаемое значение:
+
−
//WAIT_ABANDONED Объект является мутексом, который был занят потоком, затем поток завершился,
+
−
// не разблокировав мутекс. Мутекс находится в несигнальном состоянии
+
−
 
+
−
 
+
−
//если нужно - смотрим, какое значение вернуло приложение
+
−
GetExitCodeProcess(ProcessInfo.hProcess, &dwRetValue);
+
−
 
+
−
//освобождаем хендлы, открытые CreateProcess
+
−
CloseHandle(ProcessInfo.hThread);
+
−
CloseHandle(ProcessInfo.hProcess);
+
−
}
+
−
</syntaxhighlight>
+
−
 
+
−
В szApplicationName может быть либо полный путь к файлу, либо только имя файла. В последнем случае файл будет искаться в текущем каталоге.
+
−
 
+
−
szCommandLine может быть NULL, если не надо передавать командную строку запускаемому процессу.
+
−
 
+
−
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у родительского процесса.
+
−
 
+
−
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===
+
−
 
+
−
Пример:
+
−
<syntaxhighlight lang="cpp">
+
−
HICON m_hIcon;
+
−
...
+
−
...
+
−
HICON m_hIcon = AfxGetApp()->LoadIcon(IDR_1);
+
−
SetIcon(m_hIcon, TRUE);
+
−
</syntaxhighlight>
+
−
 
+
−
где
+
−
 
+
−
* IDR_1 - ИД иконки в ресурсах
+
−
* m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)
+
−
 
+
−
[[Category:FAQ]]
+

Текущая версия на 19:43, 3 октября 2009

Перенаправление на: