Программирование на Visual C++. Архив рассылки | страница 12



]

3) Вы показываете пример с переопределением precreatewindow(), в котором регистрируется новый класс окна, и в конце пишете: "В качестве первого параметра для AfxRegisterWndClass() можно указать "cs.style", чтобы установить стиль окна по умолчанию." По-моему, это некорректно. Ведь cs.style есть комбинация стилей для окна , а не для класса окна , что требуется при регистрации класса. [Виновен, Ваша честь! – AJ]  Мне пришлось столкнуться с этой проблемой, когда я хотел для своего класса CMyView добавить стиль CS_OWNDC, не меняя ничего больше. Дело в том, что при самом первом вызове CMyView::PreCreateWindow() класс окна просмотра еще не существует, так как он регистрируется в CView::PreCreateWindow(). Поэтому пришлось вызывать родительскую функцию дважды. Вот мое решение, которое, быть может, будет кому-то полезно: 

>//h-файл

>class CMyView :public CView {

>public:

> virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

>protected:

> static LPCTSTR lpszViewClassName;

>}


>//cpp-файл

>LPCTSTR CMyView::lpszViewClassName = NULL;

>BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs) {

> if (lpszViewClassName == NULL) {

>  CView::PreCreateWindow(cs);

>  WNDCLASS wc;

>  //пытаемся получить информацию о классе

>  //если не удается, выходим с ошибкой

>  if (!::GetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wc)) return FALSE;

>  // теперь изменяем в wc все, что нужно

>  // например, стиль класса

>  wc.style |= CS_OWNDC;

>  // регистрируем класс

>  lpszViewClassName = AfxRegisterWndClass(wc.style, wc.hCursor, wc.hbrBackground, wc.hIcon);

> }

> // изменяем класс окна на созданный нами:

> cs.lpszClass = lpszViewClassName;

> return CView::PreCreateWindow(cs);

>}

[Я немножко подправил код и добавил комментарии. Надеюсь, автор на меня не обидится – AJ]

Есть у меня и вопросы, ответы на которые, возможно, будут интересны не только мне.

Q1) В приложении есть операция, которая требует, скажем, больше пяти минут времени, причем по некоторым причинам дальнейшее выполнение не может быть продолжено до завершения этой операции. Хотелось бы, чтобы при этом окно приложения нормально обновлялось, могло быть свернуто-развернуто и т.п. Я нашел некоторое решение, но оно требует создания второго цикла обработки сообщений и потому мне не очень нравится, хотелось бы сделать более естественно.

Q2) Можно ли переопределенный обработчик событий сделать подставляемым (inline)?

Куканов Алексей (as_katos@mail.ru)

Очень хорошее, обстоятельное письмо. Хотя оно и содержит вопросы, я все же решил поместить его в "обратную связь", т.к. по большей части относится к теме, ну а разбивать письмо на две части – это было бы варварство. Если кто-нибудь знает ответы на заданные вопросы – очень прошу поделиться ! Вопросы действительно интересные.