(уже готовое, часть1)

(1/1)

Алексей++:
Q:У меня есть наименование класса ActiveX. Мне необходимо
узнать в каком файле он находится, и какой версии этот фай

Алексей++:

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:
Функция
Код:

GetModuleFileName

возвращает абсолютное имя модуля.

В MFC можно использовать переменную-член класса CWinApp, определённую как
Код:

LPCTSTR m_pszExeName;


Вызывать так:
Код:

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


Навигация

[0] Главная страница сообщений