Опять VC++

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Опять VC++

Сообщение A.A.Z. » 29.06.2004 (Вт) 21:33

Как сделать так, чтобы какое-то событие стало выполняться сразу после того, как форма вместе с контролами загрузилась? Это не совсем аналог Form_Load, и не совсем Form_Activate. Т.е. это должно выполняться один раз, сразу после полной загрузки формы.
На VB я это реализовывал с помощью таймера с интервалом 1 и Timer1.Enabled = False в конце процедуры.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 30.06.2004 (Ср) 8:48

Если я правильно понял, то тебе нужен OnInitDialog:
Код: Выделить всё
BOOL CMyDlg::OnInitDialog()
{
   CDialog::OnInitDialog();

   // Set the icon for this dialog.  The framework does this automatically
   //  when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);         // Set big icon
   SetIcon(m_hIcon, FALSE);      // Set small icon

   // TODO: Add extra initialization here

   
   return TRUE;  // return TRUE  unless you set the focus to a control
}

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 30.06.2004 (Ср) 16:33

Попробую...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 30.06.2004 (Ср) 16:46

Почти... :roll:
Я вставил код
Код: Выделить всё
int i = 0;
for (i=0;i<101;i++){
PB.SetPos(i);
ShowWindow(1);
Sleep(100);}
(PB - переменная ProgressBar'а)

Он делает все правильно, но:
1) Кнопка и лейбл, которые помимо ProgressBar'а на форме, не видны до завершения цикла;
2) Не умею пользоваться SetWindowPos - ругается на несоответствие типов в первом параметре, а без него окно появляется в левом верхнем углу. :(
Помоги, пожалуйста!

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 01.07.2004 (Чт) 8:16

Все правильно, так и должно быть.
1) Пока OnInitDialog не завершит выполнение -- окно диалога не будет полностью отображаться. И графические элементы на нем тоже.

2)Тут важно какую функцию ты вызываешь
Код: Выделить всё
CWnd::SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );
или
BOOL SetWindowPos(
  HWND hWnd,             // handle to window
  HWND hWndInsertAfter,  // placement-order handle
  int X,                 // horizontal position
  int Y,                 // vertical position
  int cx,                // width
  int cy,                // height
  UINT uFlags            // window-positioning options
);

Если не указать явно
::SetWindowPos(....) -- (т.е. вызов API-функции), то по умолчанию вызывается функция базового класса CWnd::SetWindowPos(...)
Тогда в этом варианте нужно первым параметром передавать указатель "на себя":
Код: Выделить всё
SetWindowPos(this, x, y, cx, cy, wndTop);

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.07.2004 (Чт) 14:49

ПАСИБА! :mrgreen: Заодно научил меня объявлять API :D

А как сделать событие, эквивалентное Activate? :roll:

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 01.07.2004 (Чт) 15:09

А что это такое-- Activate? :?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.07.2004 (Чт) 15:12

Ну VB событие Form_Activate :)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.07.2004 (Чт) 15:15

Вот еще такая бредовая идея:
раз, как я понял, в VC++ можно импортировать функции типа API, то можно и использовать функции msvbvm60.dll? Или нет? :roll:

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 01.07.2004 (Чт) 15:32

:) API-функции не импортируются в VC++, они как бы "там и живут".
Это в VB их надо импортировать. Просто :: указывает на глобальную область видимости, чтобы отличить API-вызовы от вызовов MFC-вариантов подобных функций.
msvbvm60.dll .. :? По идее, в VC++ можно сделать все 8)
Но для подлключения msvbvm60.dll тебе придется делать
#include "msvbvm60.h
LoadLibrary(msvbvm60.dll ..) ..."
если вообще такой файл есть.
Я думаю, все что нужно, ты сможешь найти в VC и без msvbvm60.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.07.2004 (Чт) 16:07

Нет, я неправильно выразился... :)
Я уже давно понял, что API в C объявлять не надо, я имел ввиду функции типа API, которые в VB объявлялись так же, как и API. А насчет msvbvm60 - просто там функции "роднее" - я подумал, может их можно и сюда подключить... :)


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList