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

Материал из Весельчак У
Перейти к: навигация, поиск
м (пробел перед знаком вопроса в заголовке)
(Перенаправление на FAQ:WinAPI VCPP)
 
(не показано 12 промежуточных версий 3 участников)
Строка 1: Строка 1:
===Как создавать всплывающие сообщения?===
+
#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
+
 
+
и еще:
+
<pre>
+
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения
+
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора
+
</pre>
+
 
+
===Не могу понять, что делает функция ScrollWindow()===
+
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.
+
 
+
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.
+
 
+
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать
+
 
+
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами "вверх" и "вниз" значения перебираются?===
+
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего
+
списка.
+
 
+
===Internet Explorer: как поменять настройки программно?===
+
путь в реестре:
+
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)
+
 
+
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===
+
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений
+
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.
+
 
+
===Как получить короткое и длинное имя файла?===
+
Например имеется путь к файлу:
+
  D:\program files\Microsoft Office\OFFICE11\winword.exe
+
надо привести его к виду:
+
  d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE
+
и  наоборот,
+
использовать функции API
+
<pre>
+
GetShortPathName(
+
LPCSTR lpszLongPath,
+
LPSTR  lpszShortPath,
+
DWORD    cchBuffer); //получить короткий путь
+
и
+
GetLongPathName(
+
LPCSTR lpszShortPath,
+
LPSTR  lpszLongPath,
+
DWORD    cchBuffer); //получить полный путь
+
</pre>
+
 
+
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===
+
VM_MOVING - посылается окну, когда пользователь перемещает окно
+
 
+
VM_MOVE - посылается окну, когда пользователь завершил перемещение
+
  окна (отпустил кнопку мыши)
+
 
+
=== Как из программы определить каталог, в котором находится эта программа?===
+
Функция
+
GetModuleFileName
+
возвращает абсолютное имя модуля.
+
 
+
В MFC можно использовать переменную-член класса CWinApp, определённую как
+
LPCTSTR m_pszExeName;
+
Вызывать так:
+
AfxGetApp()->m_pszExeName;
+
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To? ===
+
в реестре
+
 
+
тут
+
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
+
 
+
или тут
+
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
+
 
+
(зависит от версии Windows)
+
 
+
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать?===
+
Можно поступить так: Начать "поиск" ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.
+
 
+
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===
+
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT
+
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===
+
Нужно использовать CreateProcess/WaitForSingeObject.
+
<pre>
+
STARTUPINFO StartupInfo;
+
PROCESS_INFORMATION ProcessInfo;
+
DWORD dwRetValue;
+
RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
+
StartupInfo.cb = sizeof(StartupInfo);
+
if(!CreateProcess(
+
szApplicationName,
+
szCommandLine,
+
NULL, NULL, FALSE,
+
NORMAL_PRIORITY_CLASS,
+
NULL,
+
szCurrentDirectory,
+
&StartupInfo,
+
&ProcessInfo))
+
{
+
//ошибка
+
DWORD dwdErr=GetLastError(); //определяем ошибку
+
}
+
else
+
{
+
CloseHandle(ProcessInfo.hThread);
+
WaitForSingleObject(ProcessInfo.hProcess, 30000);
+
GetExitCodeProcess(ProcessInfo.hProcess, &dwRetValue);
+
CloseHandle(ProcessInfo.hProcess);
+
}
+
</pre>
+
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,
+
в последнем случае файл будет искаться в текущем каталоге.
+
 
+
szCommandLine может быть NULL, если не надо передавать командную строку
+
запускаемому процессу.
+
 
+
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у
+
родительского процесса.
+
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===
+
<pre>
+
HICON m_hIcon;//
+
...
+
...
+
HICON m_hIcon = AfxGetApp()->LoadIcon(IDR_1);
+
SetIcon(m_hIcon, TRUE);
+
</pre>
+
где
+
 
+
IDR_1 - ИД иконки в ресурсах
+
 
+
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)
+
 
+
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===
+
скажем , находимся в неком обработчике диалога
+
<pre>
+
MyDialog::f()
+
{
+
...
+
...
+
//тут потребовалось перерисовать немедленно
+
+
//помечаем всё окно "инвалидным" (требующим перерисовки)
+
Invalidate(0);
+
//перерисовываем "напрямую" посылая сообщение WM_PAINT в
+
//оконную процедуру, минуя очередь сообщений
+
UpdateWindow();
+
...
+
...
+
}
+
</pre>
+
 
+
[[Category:FAQ]]
+

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

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