FAQ:WinAPI, VCPP Part 4
Содержание
- 1 Как создавать всплывающие сообщения?
- 2 Не могу понять, что делает функция ScrollWindow()
- 3 В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами "вверх" и "вниз" значения перебираются?
- 4 Internet Explorer: как поменять настройки программно?
- 5 Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)
- 6 Как получить короткое и длинное имя файла?
- 7 В чём разница между сообщениями WM_MOVE и WM_MOVING?
- 8 Как из программы определить каталог, в котором находится эта программа?
- 9 Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To?
- 10 Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать?
- 11 Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается
- 12 Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?
- 13 Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)
- 14 Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?
Как создавать всплывающие сообщения?
Называется ето сообщение 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(); ... ... }