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

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

ru
Offline Offline
Пол: Мужской

« : 14-02-2006 10:44 » 

Есть стандартное диалоговое окно изменения настроек com-порта. Оно вызывается функцией CommConfigDialog.
Можно ли как-то изменить этот диалог, и если да, то как?
Записан

С уважением, asker
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-02-2006 09:32 » 

Я так думаю что варианты этих диалогов храняться в .dll.
Если это так то, проше написать свой диалог (я думаю с этим проблем не должно возникнуть).
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 21-02-2006 08:37 » 

asker,

с тем диалогом, о котором ты говоришь, я не работала, поэтому конкретного решения подсказать не могу. Я имела похожую головную боль с диалогом FileOpen - мне надо было вставить туда дополнительные элементы и обрабатывать некоторые сообщения, которые в обычном состоянии никому не нужны, посему для пользователя не видны.
Надо писать свой диалог-оболочку, при этом базовым классом будет выступать основной диалог, а потом уже вставлять туда свои элементы.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 21-02-2006 10:18 » 

Чтобы добавлять контролы нужен темплейт диалога. Доступ к нему у диалогов вызываемых APIшными функциями обычно отсутствует.
asker, а почему бы просто свой диалог не сделать?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 21-02-2006 12:17 » 

Спасибо всем за ответы.

Serg79, ты прав. Этот диалог хранится в serialui.dll.

Малайа, если я правильно понял, то под основным диалогом ты имела ввиду FileOpen, но в этом случае тебе известен класс CFileDialog, на основе которого тебе надо было сделать свой. А в случае с диалогом ... CommConfigDlg мне как таковой класс не доступен. Но может быть я и не прав.

Джон, я просто подумал, что если что-то есть (да еще стандартное и подходящее), то почему бы этим ни воспользоваться. К тому же, если в Windows настраивать com-порт, то этот диалог является, как бы, вкладкой (может это не совсем корректно сказано - не суди строго), поэтому я и подумал, а почему-бы и мне так ни сделать, вот и все.
« Последнее редактирование: 21-02-2006 12:19 от asker » Записан

С уважением, asker
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #5 : 16-04-2006 21:37 » 

Чего то я не пойму, в чем проблема-то (может позно уже )))) месяц как прошел), но для добавления любого функционала (в том числе и необходимых тебе контролов) все что нужно это знать - это HWND окна. В твоем случае это CommConfigDlg. Зная этот дискриптор и подменив функцию обработки сообщений (если добавляеши, новый функционал, но не забуть вызвать стандартную цункцию) для этого окна (это делается функцией SetWindowLong) можно не только свои контролы забабахать, но и реакцию на уже существующие изменить... короче
берем дискриптор окна + используем WIN API = можем ВСЕ!
Записан

С уважением Lapulya
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 17-04-2006 02:28 » 

Цитата
но не забуть вызвать стандартную цункцию
Что имеется ввиду? СallWindowProc()?
Записан

ещё один вопрос ...
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-04-2006 13:50 » 

lapulya, т.е. ты имеешь в виду во время выполнения программы добавлять новые контролы в окно?
Записан

С уважением, asker
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 19-04-2006 12:40 » 

lapulya,

извини за дурные вопросы, но мне это теперь тоже интересно Ага Т.е. с этого места еще раз и поподробней, пожалуйста Ага (С)

У меня была подобная задача - мне надо было получить контроль за диалогом Open As (я должна была знать, когда пользователь выбрал какой-то файл, считать его содержимое и показать в соседнем окне). Я тогда делала это через субклассинг (что-то нашла в инете, многое подсказали тут на форуме, за что всем еще раз огромное спасибо).

А как бы это надо было делать по твоему методу?
Насколько я понимаю, надо сделать следующее (Только не бей ногами за глупость
Ага ):
1) создать обьект типа CFileDialog myDlg;
2) получить его handle (hwnd = myDlg.GetSafeHandle())
3) объявить :
     FARPROC OldWndProc; 
     LRESULT CALLBACK WndMyProc(HWND,UINT,WPARAM,LPARAM);
4) сделать OldWndProc=(FARPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WndMyProc);
5) в WndMyProc() описать обработчик события

Так или нет?
И еще дин вопрос: ты говоришь, что с помощью SetWindowLong() можно вносить новые элементы в этот диалог.
А как Не понял Может, у тебя есть какой-то пример? Еще раз прошу прощения за тупые вопросы.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #9 : 22-04-2006 22:57 » 

Ну про MFC ничего писать не буду... не мой это метод... ну а про Win API рассказываю

пусть кто-то (что-то) создал окно, пусть для определенности это стандартное окно OpenFile созданное например функцией "BOOL GetOpenFileName(LPOPENFILENAME lpofn);" причем совершенно не важно создано оно вами или нет, главное при программировании на Win API ни много ни мало знать дискриптор этого окна (это тоже легко делается Улыбаюсь) ну а далее лишь дело техники...
например, пусть мы уже имеем parentHandle того окна куда мы хотим засодить новый элемент управления. Да еще нам нужен дискриптор экземпляра приложения, пусть это hInstance он.
Ну ясное дело, что новый элемент управления, например кнопка, добаляется так:
Код:
const long ICD_MyMegaNewButton = 12345;
HWND NewButtonHandle = CreateWindow( "BUTTON", "MyMegaNewButton",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
20,
20,
100,
100,
parentHandle, // вот оно
(HMENU)ICD_MyMegaNewButton,
hInstance,
NULL);
ну размеры и расположение кнопки надо заменить нужными, а ICD_MyMegaNewButton нужен для того чтобы при нажатию (а точнее по любому событию которое кнопка передает родительскому окну) можно было это событие обработать. Далее надо раздобыть указатель funcWindowPtr на функцию обработки сообщений РОДИТЕЛЬСКОГО окна делаем это:
Код:
WNDPROC funcWindowPtr = (WNDPROC)GetWindowLong(parentHandle, GWL_WNDPROC);
отлично, теперь подменим функцию обработки сообщений родительского окна, которая была определена при создании окна (назовем ее  - базовая функция обработки сообщений родительского окна), на нашу NewWndProc, примерно так (читаем комментарии).
Код:
	SetWindowLong(hWnd, GWL_WNDPROC, (LONG)NewWndProc);

// SetWindowLong(hWnd, GWL_WNDPROC, NewWndProc);
// Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.
// Если таки надо у окна в другом процессе подменить функциональности, то это все равно можно сделать )))
простой пример нашей функции обработки сообщений родительского окна, которая обрабатывает, как все то, что обрабатывала базовая функция обработки сообщений, так и события нашей новой кнопки, примерно так:
Код:
LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (WM_COMMAND == message && LOWORD(wParam) == ICD_MyMegaNewButton)
{
MessageBox(hWnd, "Bububububu", "Bububububu", MB_OK);
return 0;
}

if (funcWindowPtr)
return CallWindowProc(funcWindowPtr, hWnd, message, wParam, lParam);

return 0;
}
функция CallWindowProc вызывает стандартную функцию обработки сообщений (мы это делаем если сообщение не относится к нашей кнопке, так как оно, это я про сообщение  Отлично возможно !!! обрабатывается стандартной функцией), мы можем это сделать так, как предусмотрительно сохранили указатель на нее (вот он funcWindowPtr). Ну вот теперь при нажатии на нашу кнопку будет выдаваться на экран MessageBox с сообщением и заголовком "Bububububu".

Собственно и ВСЕ!!!
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #10 : 22-04-2006 23:06 » 

Если нужен полный пример (который к томуже еще и работает), то могу накропать.... а точнее я уже его накропал..., но описания выше должно быть достаточно.

Malaja, 
естесссно SetWindowLong никаких новых элементов не добавляет, эта функция позволяет заменить некоторые атрибуты окна (в том числе и функцию обработки сообщений) на другие. А добавление ЛЮБОГО элемента управления на необходимое окноделается с помощью CreateWindow (ну или более модно CreateWindowEx)
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines