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
Содержание
- 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();
...
...
}