Q: Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню.
Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не
получается ни затенить, ни чек поставить. Что делать?A:В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.
Визардом обработчик не добавляется, поэтому можно переопределить
виртуальную DefWindowProc() и там обработать:
#include <afxpriv.h> //этот файл надо включить, там определёна WM_KICKIDLE
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_KICKIDLE)
{
//делаем апдейт для всех пунктов меню
CMenu* pMainMenu=GetMenu();
if(pMainMenu)
{
CCmdUI cmdUI;
for (UINT n=0; n < pMainMenu->GetMenuItemCount(); ++n)
{
CMenu* pSubMenu = pMainMenu->GetSubMenu(n);
if(!pSubMenu)continue;
cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
for (UINT i = 0; i < cmdUI.m_nIndexMax;++i)
{
cmdUI.m_nIndex = i;
cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
cmdUI.m_pMenu = pSubMenu;
cmdUI.DoUpdate(this, FALSE);
}
}
}
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
Q: Не могу понять, что делает функция ScrollWindow()A:К примеру, у вас есть уже нарисованное изображение на клиентской
части окна, и нужно сделать скролинг этой части.
Первый путь: Стереть что уже было нарисовано, и перерисовывать все
заново с учетом скролинга.
Второй путь: Передвинуть ту часть, которая останется в зоне видимости,
и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение
рисунка на заданное количество пикселей. Остаётся потом только дорисовать
Q: В редакторе ресурсов на диалоге создаю элемент ComboBox.
Почему во время работы программы список не выпадает, хотя клавишами
"вверх" и "вниз" значения перебираются?A:Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за
нижний маркер растяни вниз - то есть задайте размер выпадающего
списка.
Q: Internet Explorer : как поменять настройки программно?A:путь в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\
AdvancedOptions\
(всякие настройки)
Q: Как узнать, когда приложение уже готово к работе? (в этот
момент мне нужно стартовать вспомогательный диалог для показа
определенных значений)A:Можно попробовать переопределить функцию CWinApp::OnIdle. Эта
функция вызывается всякий раз, когда в очереди сообщений
приложения нет больше сообщений. И при первом вызове OnIdle
показывать вспомогательный диалог.
Q: Что такое Oracle ?A: Это система управления базами данных (СУБД)
( подробности здесь
http://www.oracle.com/ru/corporate/ )
Q: Как получить короткое и длинное имя файла?
Например имеется путь к файлу:
D:\program files\Microsoft Office\OFFICE11\winword.exe
надо привести его к виду:
d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE
и наоборот
A:использовать функции API
GetShortPathName(
LPCSTR lpszLongPath,
LPSTR lpszShortPath,
DWORD cchBuffer); //получить короткий путь
и
GetLongPathName(
LPCSTR lpszShortPath,
LPSTR lpszLongPath,
DWORD cchBuffer); //получить полный путь
Q: В чём разница между сообщениями WM_MOVE и WM_MOVING ?A:VM_MOVING - посылается окну, когда пользователь перемещает окно
VM_MOVE - посылается окну, когда пользователь завершил перемещение
окна (отпустил кнопку мыши)
Q: Как из программы определить каталог, в котором находится эта программа?A:Функция
возвращает абсолютное имя модуля.
В MFC можно использовать переменную-член класса CWinApp, определённую как
Вызывать так:
AfxGetApp()->m_pszExeName;
Q: Как получить полное имя пользователя и организации, то есть то, что
на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке
General перечисленно под пунктом Registred To ?A:в реестре
тут
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
или тут
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
(зависит от версии Windows)
Q: Мне надо в процессе выполнения программы динамичски создавать / удалять
элементы (иконки и текстбоксы). Для этого мне надо при создании элемента
задавать ID. Как определить первый свободный ИД, который можно использовать ?A:Можно поступить так: Начать "поиск" ID со значения 1000 и, проверяя функцией
GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден
свободный ID.
Q: Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(),
ничего не получаетсяA:Это сделать, если перехватывать сообщение, которое идет на прорисовку не
клиентской части окна WM_NCPAINT
Q: Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же
возвращает управление, а мне нужно дождаться, когда запущенный процесс
завершится, а только потом продолжить дальнейшее выполнение программы.
Как это сделать?A:Нужно использовать 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, тогда текущий каталог будет как у
родительского процесса.
Q:Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)A: HICON m_hIcon;//
...
...
HICON m_hIcon = AfxGetApp()->LoadIcon(IDR_1);
SetIcon(m_hIcon, TRUE);
где
IDR_1 - ИД иконки в ресурсах
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)
Q: Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО
перерисовать окно?A:скажем , находимся в неком обработчике диалога
MyDialog::f()
{
...
...
//тут потребовалось перерисовать немедленно
//помечаем всё окно "инвалидным" (требующим перерисовки)
Invalidate(0);
//перерисовываем "напрямую" посылая сообщение WM_PAINT в
//оконную процедуру, минуя очередь сообщений
UpdateWindow();
...
...
}