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