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

Материал из Весельчак У
Перейти к: навигация, поиск
Строка 14: Строка 14:
 
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения
 
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения
 
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора
 
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>
 
</pre>

Версия 08:46, 9 июля 2007

Содержание

Как создавать всплывающие сообщения?

Называется ето сообщение 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

и еще:

CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора

Не могу понять, что делает функция 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

GetShortPathName(
	LPCSTR lpszLongPath,
	LPSTR  lpszShortPath,
	DWORD    cchBuffer);	//получить короткий путь
и
GetLongPathName(
	LPCSTR lpszShortPath,
	LPSTR  lpszLongPath,
	DWORD    cchBuffer);	//получить полный путь

В чём разница между сообщениями 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.

	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);
	}

В szApplicationName может быть либо полный путь к файлу, либо только имя файла, в последнем случае файл будет искаться в текущем каталоге.

szCommandLine может быть NULL, если не надо передавать командную строку запускаемому процессу.

szCurrentDirectory может быть NULL, тогда текущий каталог будет как у родительского процесса.

Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)

	HICON m_hIcon;//
...
...
	HICON m_hIcon = AfxGetApp()->LoadIcon(IDR_1);
	SetIcon(m_hIcon, TRUE);

где

IDR_1 - ИД иконки в ресурсах

m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)

=Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?

скажем , находимся в неком обработчике диалога

MyDialog::f()
{
	...
	...
	//тут потребовалось перерисовать немедленно
	
	//помечаем всё окно "инвалидным" (требующим перерисовки)
	Invalidate(0);
	//перерисовываем "напрямую" посылая сообщение WM_PAINT в
	//оконную процедуру, минуя очередь сообщений
	UpdateWindow();
	...
	...
}