Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 493
от 06.12.2007, 16:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 382, Экспертов: 37
В номере:Вопросов: 1, Ответов: 2


Вопрос № 111865: Здравствуйте, уважаемые эксперты. Пишет вам простой инженер из села кукуево.... Внимание, вопрос!!! ;) .... Предыстория: Есть задумка сделать всем известную оконную процедуру, членом класса. Естественно она является статической... но для зад...

Вопрос № 111.865
Здравствуйте, уважаемые эксперты. Пишет вам простой инженер из села кукуево.... Внимание, вопрос!!! ;) ....

Предыстория: Есть задумка сделать всем известную оконную процедуру, членом класса. Естественно она является статической... но для задумки необходимо знать экземпляр класса внутри этой оконной процедуры. Так вот, решил я этот экземпляр передать через последний параметр функции CreateWindow(... &_cs);
CREATESTRUCT _cs;
в структуре _cs.lpCreateParams = &_ExData; &ExData - это указатель на мои данные TDlgExtraData
struct TDlgExtraData
{
short cbExtra;// я бы просто передал указатель на экземпляр, но в документации по неизвестным для меня заморочкам говорят, что нужно сделать структуру и передавать указатель на нее, типа говорят о каком то выравнивании на SHORT
void* pObj; // указатель на экземпляр класса
};

на WM_CREATE
делаю следующее:
pExData = (UNALIGNED TDlgExtraData*)( ((CREATESTRUCT*)lParam)->lpCreateParams );
SetClassLong(hwnd,0,LONG(pExData->pObj));
однако pExData->pObj никак не является this !!!

Из описания и следует вопрос: что не так?

Надеюсь на Вашу помощь... :)

прогу пишу в eVC4...
Отправлен: 01.12.2007, 15:38
Вопрос задал: Solodov Evgeniy Vladimirovich (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Ross
Здравствуйте, Solodov Evgeniy Vladimirovich!

Так вроде работает:
TDlgExtraData *pTde = new TDlgExtraData;
pTde->pObj = (void *)this; pTde->cbExtra = 0;

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, (LPVOID)pTde);

case WM_CREATE:
/*TDlgExtraData* */ pTde = (TDlgExtraData*)((CREATESTRUCT*)lParam)->lpCreateParams;
/*void * */ thispointer = pTde->pObj;
delete pTde;
break;
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 02.12.2007, 14:35
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ. :)

Это такая хитрость, или я чего-то не понимаю? Вы передали в CreateWindow - ... (LPVOID)pTde. Не указатель на CREATESTRUCT, а указатель на пользовательскую структуру...

Обязательно попробую Ваш вариант.

Отвечает: Aristos
Здравствуйте, Solodov Evgeniy Vladimirovich!

Порядок действий такой.
1. В функцию CreateWindow соответствующим параметром передать требуемый указатель (this, а не указатель на CREATESTRUCT).
2. При обработке сообщения WM_CREATE в параметр lParam будет передан указатель на структуру CREATESTRUCT, одним из полей которой (lpCreateParams) будет переданный указатель.

В предыдущем ответе так и было сделано. Только дополнительно была использована структура TDlgExtraData, без которой в вашем случае вполне можно обойтись.
---------
нет ничего невозможного
Ответ отправил: Aristos (статус: 8-ой класс)
Ответ отправлен: 02.12.2007, 16:55
Оценка за ответ: 5
Комментарий оценки:
Спасибо Вам за ответ. :)


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.65 от 04.12.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное