Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (уже готовое, часть1)  (Прочитано 11266 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 13-05-2007 05:49 » 

Q:У меня есть наименование класса ActiveX. Мне необходимо
узнать в каком файле он находится, и какой версии этот фай
« Последнее редактирование: 07-07-2007 12:43 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-07-2007 19:51 » new



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


« Последнее редактирование: 07-07-2007 12:55 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines