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

Материал из Весельчак У
Перейти к: навигация, поиск
(Перенаправление на FAQ:WinAPI VCPP)
 
(не показаны 22 промежуточные версии 4 участников)
Строка 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>
+

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

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