FAQ:WinAPI, VCPP Part 4

Материал из Весельчак У
Версия от 22:18, 14 августа 2008; Mczim (обсуждение | вклад) (пробел перед двоеточием)

Перейти к: навигация, поиск

Содержание

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

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