Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> про окна в Windows, HELP! 
:(
    Опции темы
setq
Дата 21.5.2003, 16:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











здравствуйте, не могу врубиться в какие-то элементарные вещи. помогите пожалуйста:
на сколько я знаю, в среде Windows если открыть приложение несколько раз, то будет несколько экземпляров главной функции WinMain () и только один экземпляр оконной процедуры ( WndProc () ).
как оконная процедура определяет, какой экземпляр WinMain () отправил ей сообщение?
каким образом оконная процедура может получить доступ к данным этого приложения?
как например поступает NOTEPAD когда в одном окне – один документ, а в параллельно открытом окне – другой.
спасибо.

  Вверх
RAN
Дата 21.5.2003, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



WndProc получает дескриптор окна в качестве первого параметра. Этот дескриптор у всех созданных окон свой, это адрес памяти, где храниться информация об окне и, если нужно, любая другая информация заложенная программистом. Через эту дополнительную информацию и передавай данные. Дело в том, что WndProc назначается классу, на основе которого может быть создано сколько угодно окон и дополнительные данные может содержать и класс, и окно. Только в первом случае данные будут общими для всех окон, созданных на основе класса (это редко используется), а во втором индивидуальны для каждого окна.

А вообще ты уверен, что при запуске двух экземпляров программы оконная функция будет одна? Мне кажется это не так и такую возможность надо предусмотреть самому.

PM MAIL ICQ   Вверх
RAN
Дата 21.5.2003, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 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 - дескриптор экземпляра приложения и он у каждого приложения свой.

PM MAIL ICQ   Вверх
setq
Дата 23.5.2003, 10:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











<<А вообще ты уверен, что при запуске двух экземпляров программы оконная функция будет одна?>>

нет. теперь уже не так уверен smile.gif


<<Кстати, hinstance - дескриптор экземпляра приложения и он у каждого приложения свой.>>

кстати, я заметил, что указывать его приходится дважды: в приведённой выше структуре WNDCLASS и как параметр в CreateWindow (). очень бы хотелось понять зачем? (т.е. зачем дважды-то?)

за ответ спасибо. буду экспериментировать дальше smile.gif
  Вверх
RAN
Дата 23.5.2003, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Смотри, ты с помощью RegisterClass или RegisterClassEx регистрируешь класс окна под каким-то именем (параметр lpszClassName структуры WNDCLASS), Windows "запоминает", что приложение с дескриптором hinstance, указанном в структуре WNDCLASS, зарегистрировало класс для окон под именем lpszClassName. В будущем ты вызываешь функцию CreateWindow, которую Windows получает не только от твоего приложения. И чтоб ОС "поняла", что функция получена именно от твоего приложения, ты передаёшь ей дескриптор своего приложения hinstance, а чтоб операционка знала на основе какого класса создать окно, ты её передаёшь имя класса. Ведь класс с таким именем может создать и другое приложение, то чтоб Windows однозначно определила, какой класс использовать ты и передаёшь в функцию CreateWindows и hinstance, и lpszClassName.
PM MAIL ICQ   Вверх
kain
Дата 14.12.2004, 19:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вопрос в тему. Я хотел бы убить двух, а то и более, зайцев. С одной стороны, я хотел бы свалить всю рутинную работу на MFC, с другой стороны, оставить непосредственность WinApi. В обсчем вопрос такой: как в MFC создавать унаследованные от CFrameWnd окна на основе WNDCLASSEX?
  Вверх
kain
Дата 14.12.2004, 19:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











М да... Кой че почитал, понял, какую глупость захотел =) Все равно, как получить доступ к таким свойствам окна, как hCursor, hbrBackground,style ? (моё окно унаследовано от CFrameWnd)
  Вверх
mr.DUDA
Дата 14.12.2004, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.


--------------------
user posted image
PM MAIL WWW   Вверх
kain
Дата 15.12.2004, 12:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ежели я б не порылся в книгах, MSDN и в инете (в том числе и на этом сайте), я б не стал вас беспокоить =). Это уже от отчаинья у Вас спросил =)
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.