|
|
| (не показано 5 промежуточных версий 2 участников) |
| Строка 10: |
Строка 10: |
| | TTS_BALLOON==0x40 | | TTS_BALLOON==0x40 |
| | | | |
| − | и еще:
| + | [pre] |
| − | <pre>
| + | |
| | CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения | | CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения |
| | CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора | | CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора |
| − | </pre>
| + | [/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>
| + | |
| − | | + | |
| − | [[Category:FAQ]]
| + | |
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по етому поводу называется "Using ToolTip Controls"
Файл:Context help.GIF
Для получения сообщения того, как на картинке установите стиль
TTS_BALLOON==0x40
[pre]
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора
[/pre]