![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| setq |
|
|||
|
Unregistered |
здравствуйте, не могу врубиться в какие-то элементарные вещи. помогите пожалуйста:
на сколько я знаю, в среде Windows если открыть приложение несколько раз, то будет несколько экземпляров главной функции WinMain () и только один экземпляр оконной процедуры ( WndProc () ). как оконная процедура определяет, какой экземпляр WinMain () отправил ей сообщение? каким образом оконная процедура может получить доступ к данным этого приложения? как например поступает NOTEPAD когда в одном окне – один документ, а в параллельно открытом окне – другой. спасибо. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
WndProc получает дескриптор окна в качестве первого параметра. Этот дескриптор у всех созданных окон свой, это адрес памяти, где храниться информация об окне и, если нужно, любая другая информация заложенная программистом. Через эту дополнительную информацию и передавай данные. Дело в том, что WndProc назначается классу, на основе которого может быть создано сколько угодно окон и дополнительные данные может содержать и класс, и окно. Только в первом случае данные будут общими для всех окон, созданных на основе класса (это редко используется), а во втором индивидуальны для каждого окна.
А вообще ты уверен, что при запуске двух экземпляров программы оконная функция будет одна? Мне кажется это не так и такую возможность надо предусмотреть самому. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Чтоб дополнить топик:
Посмотри описание структуры WNDCLASS или WNDCLASSEX (что ты там используешь). typedef struct _WNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; } WNDCLASSEX; cbClsExtrа - Задается количество дополнительных байт класса. cbWndExtra Задается количество дополнительных байт для каждого окна Испоьзуй функции SetWindowLongPrt и GetWindowLongPrt. Кстати, hinstance - дескриптор экземпляра приложения и он у каждого приложения свой. |
|||
|
||||
| setq |
|
|||
|
Unregistered |
<<А вообще ты уверен, что при запуске двух экземпляров программы оконная функция будет одна?>>
нет. теперь уже не так уверен <<Кстати, hinstance - дескриптор экземпляра приложения и он у каждого приложения свой.>> кстати, я заметил, что указывать его приходится дважды: в приведённой выше структуре WNDCLASS и как параметр в CreateWindow (). очень бы хотелось понять зачем? (т.е. зачем дважды-то?) за ответ спасибо. буду экспериментировать дальше |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Смотри, ты с помощью RegisterClass или RegisterClassEx регистрируешь класс окна под каким-то именем (параметр lpszClassName структуры WNDCLASS), Windows "запоминает", что приложение с дескриптором hinstance, указанном в структуре WNDCLASS, зарегистрировало класс для окон под именем lpszClassName. В будущем ты вызываешь функцию CreateWindow, которую Windows получает не только от твоего приложения. И чтоб ОС "поняла", что функция получена именно от твоего приложения, ты передаёшь ей дескриптор своего приложения hinstance, а чтоб операционка знала на основе какого класса создать окно, ты её передаёшь имя класса. Ведь класс с таким именем может создать и другое приложение, то чтоб Windows однозначно определила, какой класс использовать ты и передаёшь в функцию CreateWindows и hinstance, и lpszClassName.
|
|||
|
||||
| kain |
|
|||
|
Unregistered |
Вопрос в тему. Я хотел бы убить двух, а то и более, зайцев. С одной стороны, я хотел бы свалить всю рутинную работу на MFC, с другой стороны, оставить непосредственность WinApi. В обсчем вопрос такой: как в MFC создавать унаследованные от CFrameWnd окна на основе WNDCLASSEX?
|
|||
|
||||
| kain |
|
|||
|
Unregistered |
М да... Кой че почитал, понял, какую глупость захотел =) Все равно, как получить доступ к таким свойствам окна, как hCursor, hbrBackground,style ? (моё окно унаследовано от CFrameWnd)
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Модератор: Пожалуйста, один топик - один вопрос.
Если бы речь шла о чистом WinAPI - я бы посоветовал заглянуть в MSDN, ф-ция GetWindowLong. В зависимости от GWL_xxx-константы, она может вернуть кучу разной информации (в т.ч. указатель на WdnProc) по хэндлу окна. Но так как речь идёт о MFC, то я даже подсказывать ничего не буду. Потому как, для того чтобы узнать, как получить hCursor и прочее из CFrameWnd, достаточно написать в VC++ строчку CFrameWnd:: - и студия сама подскажет список полей и методов класса (среди которых есть и требуемые kain-ом !). А вообще, вся эта инфа есть в книжках по MFC, или в MSDN, наконец. Если оооочень влом искать - то просим сюда: www.firststeps.ru раздел по VC++/MFC. -------------------- ![]() |
|||
|
||||
| kain |
|
|||
|
Unregistered |
Ежели я б не порылся в книгах, MSDN и в инете (в том числе и на этом сайте), я б не стал вас беспокоить =). Это уже от отчаинья у Вас спросил =)
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |