Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Создать динамически окно(контрол) и привязать к нему обработчик  (Прочитано 53126 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #30 : 31-07-2015 21:30 » 

Матчасть бы лучше понимать, тогда учить не приходится  Улыбаюсь

Это словоблудие, и в качестве отмазки не принимается. Как интересно придёт понмание без изучения? Хотя конечно, если Вам открыт доступ к Высшему Информационному Уровню, то ...

В противном случае, начинать надо с Win API. Что такое хэндлы и для чего они нужны. Для этого (и не только для этого) есть замечательная книжка Петцольда.

Согласно msdn SetBitmap принимает хэндл, а я туда сунул CBitmap - интересно че это он не заругался?
Но если бы каким то образом добыл хэндл (каким?), то все одно хэндл умер бы согласно этого кода, так ?

А всё потому... ладно, в последний раз, больше пересказывать теорию не буду. Опять же, "отcебятина". Ага

CBitmap - класс MFC, который является "обёрткой" (немножко ООП) для Win API. Другими словами, в Win API есть ф-ции, которым необходимы хэндлы. MFC прячет эти хэндлы внутри своих объектов и наделяет их (объекты) операторами приведения к необходимому типу. Вот и у CBitmap есть оператор приведения к типу HBITMAP. Сдепано это для удобства работы с native Win API функциями.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #31 : 02-08-2015 09:48 » 

Привет
Цитата
есть замечательная книжка Петцольда.
Эти ? Петцольд Ч. Программирование для Windows 95. Том 1,2
Брал в руки. Насколько помню там про на АРI(по оглавлению), а тогда нужно было на MFC. На API,МFC у нас не писал никто. спрашивать бесполезно. Толковой литературы про то как устроена "обвертка" не нашел. Ну и ограничился дизайнером - т.е. простейшим. Только вот как по Петцольду MFC разбирать ?
Цитата
и наделяет их (объекты) операторами приведения к необходимому типу
Про операторы читал, про перегруженные тоже, про операторы приведения не слышал.

Можно пару слов про мое "понятие HANDLE и его отличие от HBITMAP"
Цитата
HANDLE - адрес на объект создаваемый в системе.....
Соответствует положению дел ?
« Последнее редактирование: 02-08-2015 09:54 от Boriska » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #32 : 03-08-2015 05:48 » 

Boriska если Вам интересно, и Вы хотите разобраться как всё устроено - Вы можете даже без чтения книг просто посмотреть заголовочные файлы системы:

- посмотрите заголовочные файлы MFC (в данном случае afxwin.h), там, Вы сможете увидеть, что у CStatic есть:
Код: (C++)
        HBITMAP SetBitmap(HBITMAP hBitmap);
далее у CBitmap есть:
Код: (C++)
        operator HBITMAP() const;
ну и наконец, уже в WinAPI, в файле windef.h:
Код: (C)
DECLARE_HANDLE(HBITMAP);
и в файле windef.h
Код: (C)
#define DECLARE_HANDLE(name) typedef HANDLE name
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #33 : 03-08-2015 08:04 » 

Только вот как по Петцольду MFC разбирать ?

Даааа? Ну в таком случае надо сначала ответить на вопрос, а что же такое MFC? Если следовать Правилам (п.3.8), которые Вы кончно же прочитали и приняли, и воспользоваться Поиском, то можно найти темы, в которых про это уже говорилось.

Цитата
Цитата
и наделяет их (объекты) операторами приведения к необходимому типу
Про операторы читал, про перегруженные тоже, про операторы приведения не слышал.

И как тут помочь?  А черт его знает...

Можно пару слов про мое "понятие HANDLE и его отличие от HBITMAP"
Цитата
HANDLE - адрес на объект создаваемый в системе.....
Соответствует положению дел ?

А что говорит Петцольд по этому поводу? (небольшая подсказка HANDLE в MFC тоже самое что и в Win API, так что поняв, что это такое в Win API, разберётесь и с MFC)
« Последнее редактирование: 03-08-2015 08:07 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #34 : 03-08-2015 13:49 » 

Цитата
и наделяет их (объекты) операторами приведения к необходимому типу
Про операторы читал, про перегруженные тоже, про операторы приведения не слышал.
И как тут помочь?  А черт его знает...

Как оператор преобразования там вызывается? Он же вызывается от объекта - типа a(b). А в нашем случае
HBITMAP SetBitmap(HBITMAP hBitmap); тут из объекта скобки не вызываются.
« Последнее редактирование: 03-08-2015 14:19 от Boriska » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #35 : 03-08-2015 14:23 » 

Как оператор преобразования там вызывается? Он же вызывается от объекта - типа a(b). А в нашем случае
HBITMAP SetBitmap(HBITMAP hBitmap); тут из объекта скобки не вызываются.

Из какого объекта? Из CBitmap? Почему не вызываются? Вам же уже даже код показали, как это в данном случае работает.

далее у CBitmap есть:
Код: (C++)
        operator HBITMAP() const;
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #36 : 04-08-2015 12:56 » 

Цитата
далее у CBitmap есть:
Код: (C++)
        operator HBITMAP() const;
Джон я по литературе знаком с
operator+()
operator=()
operator++()
operator++(int)
operator()(int a, float b)
.....
для понимания того, что вы пытаетесь объяснить по теме, объясните пожалуйста, что за зверь operator HBITMAP() const;
Оператор мы же вызываем из объекта слева от оператора.
A+B - тут все понятно, из объкта A вызывается оператор+ ему передается B.
A*B аналогично
Это чет не понятная конструкция какая то получается "obHBITMAP"
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #37 : 04-08-2015 13:18 » 

Boriska, а Вы лентяй, батенька. Ага

Что значит "по литературе"? По какой литературе? Если в ней нет про операторы приведения типа?

Ок, давайте забудем про HBITMAP-ы.

Попытайтесь найти решение в след. ситуации.

Допустим у Вас есть объект, единственное поле данных которого есть целочисленный тип (int). Например

Код: (C++)
class CMyInt
{
public:
        CMyInt() { m_nMyInt = 0; }
        CMyInt(int nVal) { m_nMyInt = nVal; }
        CMyInt(const CMyInt& mi) { m_nMyInt = mi.m_nMyInt; }

private:
        int m_nMyInt;
};

Имеется набор неких ф-ций

Код: (C++)
void func1(CMyInt nVal){}

void func2(int nVal){}

void func3(double dVal){}

необходимо передать экземпляр объекта CMyInt в каждую из этих ф-ций

Код: (C++)
int main()
{
        CMyInt mi(12);

        func1(mi);
        func2(mi);  //<--- error C2664: 'func2' : cannot convert parameter 1 from 'CMyInt' to 'int'
        func3(mi);  //<--- error C2664: 'func3' : cannot convert parameter 1 from 'CMyInt' to 'double'

        return 0;
}

При вызове func1 всё в порядке, в двух остальных случаях не удаётся даже скомпилировать.

Как быть?

ps Подсказка - смотрите окошко Output в режиме Build в Студии. Если по каким-либо причинам его нет, или сообщение не покажется, то вот что "говорит" моя 2012-я в дополнение к этим ошибкам:
Цитата
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
« Последнее редактирование: 04-08-2015 13:25 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #38 : 05-08-2015 06:42 » 

Не уверен, что я лентяй. Скорее Шилдт отстой. Мой первый бук. Он написал,
есть operator#(), и привел примеры. Примера с преобразованием
типа нет, значит нет. Все, даже намеков, что может быть иначе нет.
Кстати все, что доступно почитать, или так скажем попадалось почитать
не выходит за эти рамки. (На полку худ. литературы.) А эта тема вынесена
в "Определенные пользователем преобразования" и не везде она есть.

Все. Пойду бороть битмап в окне.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #39 : 05-08-2015 09:03 » 

Не уверен, что я лентяй. Скорее Шилдт отстой.

Неа, отмазка не канает. Ограничиваться только одной книгой... А что насчёт Страуструпа? Всё-таки родитель С++. Кому как ни ему?
Если уж на то пошло, то самому разбраться? Совсем несложно.

Ладно, раз уж я сказал "А", буду говорить и "Б".

Итак, что такое преобразование типов? Т.н. cast? Это Вы знаете. Про перегрузку операторов тоже. Больше ничего не потребуется.
Оператор определяется ключевым словом и именем, которое по сути может быть любым. Компилятору только нужно его однозначно идентифицировать. По сути, оператор это ф-я. Например, можно определить след. равноправные по функциональности конструкции

Код: (C++)
CMyInt& operator+=(const CMyInt& mo)
{
   m_nMyInt += mo.m_nMyInt;
   return *this;
}

CMyInt& AddMyInt(const CMyInt& mo)
{
   m_nMyInt += mo.m_nMyInt;
   return *this;
}

и соответственно вызов
Код: (C++)
        CMyInt mi(12);
        CMyInt mi2(12);

        mi+=mi2;
     // или      
        mi.AddMyInt(mi2);

произведет одинаковые изменения объекта. Разница только в именах "ф-ций". Т.е. по идее можно было бы определить ф-ю и так

Код: (C++)
CMyInt& +=(const CMyInt& mo)
{
   m_nMyInt += mo.m_nMyInt;
   return *this;
}

и вызывать что-то типа

Код: (C++)
mi.+=(mi2);

Но к сожалению  (или к счастью?) "+=" уже зарезервировано в С++. Ключевое слово operator позволяет "обойти" это ограничение и переопределить (точнее перегрузить, вспомните про перегрузку ф-ций) существующие функции.

Для переопределения типа, тоже можно создать ф-цию. Для примера выше, это могут быть

Код: (C++)
int CastToInt() { return m_nMyInt; }
double CastToDouble() { return (double)m_nMyInt; }

соответственно вызов

Код: (C++)
func2(mi.CastToInt());
func3(mi.CastToDouble());

Но в этом случае, необходимо явно указывать нужную ф-ю при каждом конкретном обращении к объекту. Конечно, можно обойтись и одной ф-ей, возвращающей только int

Код: (C++)
func3(mi.CastToInt());

но эти применимо только к числовым операциям. Например с CString это не будет работать

Код: (C++)
void func4(CString st) {}
...
func4(mi.CastToInt());

да и при неблагоприятном выборе ф-ции компилятор будет возмущаться (допустим мы сделели только CastToDouble).

Код: (C++)
func2(mi.CastToDouble()); // -> warning C4244: 'argument' : conversion from 'double' to 'int', possible loss of data

Вот тут и приходит на помощь оператор приведения типа. Итак, ф-я у нас выглядит след образом

Код: (C++)
int CastToInt() { return m_nMyInt; }

Т.е. вызывающий ожидает возвращаемый объектом тип int. Те над объектом совершается некоторя операция, результатом которой является значение целого типа. Это можно записать след образом

Код: (C++)
operator int()  { return m_nMyInt; }

соответственно для double

Код: (C++)
operator double() { return (double)m_nMyInt; }

Код: (C++)
operator CString()
{
        CString stRet;
        stRet.Format(L"%d", m_nMyInt);
        return stRet;
}

etc.

Теперь можно смело вызывать любую ф-ю

Код: (C++)
func1(mi);
func2(mi);
func3(mi);
func4(mi);

Аналогично оператор класса CBitmap возвращает сохранённый в нём HBITMAP. Вот и всё.

Удачи. И... учите матчасть.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #40 : 06-08-2015 11:18 » 

Спсб за доп. разъяснения. Нашел у Липмана.
гл 15. Перегруженные операторы и определенные пользователем преобразования
    15.9. Определенные пользователем преобразования
Понял так. Если имеем допустим бинарную операцию над двумя разными объектами, сначала выполнится
оператор приведения типа, ( вернет бинарному оператору то, что там по правилу указано в операторе
приведения типа), а затем будет выполнен бинарный оператор.
(Липмана читал по пути на работу, но видать или не догнал или пропустил Улыбаюсь)



Добавлено через 47 минут и 21 секунду:
Да и по ходу освоения материала, решил его применить. И застрял.
У меня из базы Id объекта можно получить перегруженой функцией (по году, и по имени)
Код: (C++)
int GetCarId(CString);
int GetCarId(int);
Если я теперь сделаю в объекте два оператора
Код: (C++)
class Car{
public:
   operator CString () {return name;}
   operator int(){return year;}
private:
   CString name;
   int year;
}
то какая же функция будет вызвана?
Цитата
......
Car a(...params...);
db.GetCarId(a);
Пришлось
Код: (C++)
operator CString () {return name;}
убрать ввиду неоднозначности.

« Последнее редактирование: 06-08-2015 12:05 от lkote » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #41 : 06-08-2015 12:44 » 

Совершенно верно, именно в этом случае будет создана неопределённость, поскольку есть уже перегруженные ф-ции для обоих типов. Но это уже проблема архитектуры программы, а не языка C++.

Почему есть две ф-ции? Они ориентируются на доступные данные: есть либо год, либо имя?

Тогда лучше сделать ф-ю

Код: (C++)
int GetCarId(Car a);
//или
int GetCarId(Car* p); // если лень возиться с конструкторами копирования

которая сама найдёт нужные данные

Если же они возвращают данные ТОЛЬКО для года, или ТОЛЬКО для имени, то в этом случае лучше давать разные имена

Код: (C++)
int GetCarIdByName(CString);
int GetCarIdByYear(int);

Тогда можно оставить оператор приведения к CString и юзать

Код: (C++)
Car a(...params...);
db.GetCarIdByName(a);
//...
db.GetCarIdByYear(a);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #42 : 06-08-2015 21:22 » 

...
Код: (C++)
int GetCarId(CString);
int GetCarId(int);
Если я теперь сделаю в объекте два оператора
Код: (C++)
class Car{
public:
   operator CString () {return name;}
   operator int(){return year;}
private:
   CString name;
   int year;
}
...
Код: (C++)
db.GetCarId(a);
...
Пришлось
Код: (C++)
operator CString () {return name;}
убрать ввиду неоднозначности.

Указать явно:
Код: (C++)
db.GetCarId((int)a);
или:
Код: (C++)
db.GetCarId(int(a));

А чтобы исключить потенциальную ошибку, операторы преобразования сделать явными.

Но если нет особой нужды, то лучше явные методы. Только я бы сделал краткие:
Код: (C++)
class Car{
public:
   CString name() const { return _name; }
   int year() const { return _year; }
private:
   CString _name;
   int _year;
}
« Последнее редактирование: 06-08-2015 21:50 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #43 : 18-08-2015 19:16 » 

Привет

Поехали дальше. Окна динамически научили(спсб), менять размер и позицию - разобрался, битмапу в эти окна вставляю(спсб). Петцольда читаем  Улыбаюсь
Можно ли битмап не просто вставить, а растянуть(подогнать) по размеру окна?
А как быть с другими типами картинок ? Улыбаюсь Порылся. Есть CImage. Тудой грузим картинку, а потом пользуем CImage::operator HBITMAP  если надо вставить картинку на кнопку или еще куда ?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #44 : 24-08-2015 23:11 » 

Можно ли битмап не просто вставить, а растянуть(подогнать) по размеру окна?

См ф-ю BitBlt
 
Цитата
А как быть с другими типами картинок?

Других типов картинок не бывает, есть только различные алгоритмы сжатия графической информации для уменьшения размера файла, в котором эта информация хранится.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #45 : 25-08-2015 14:55 » new

Дискутировал тут на работе. Пришел к выводу на основании
Цитата
Других типов картинок не бывает,
, что картинки разные бывают, но отличаются на уровне файла, когда там воз и тележка доп. информации, а когда картинка
в винде, то она любая приведена к Bitmap.

Здесь я с логикой не пострадал ?
Цитата
Есть CImage. Тудой грузим картинку, а потом пользуем CImage::operator HBITMAP  если надо вставить картинку на кнопку или еще куда
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #46 : 26-08-2015 07:50 » 

Дискутировал тут на работе. Пришел к выводу ...

А можно было просто дочитать предложение до конца.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Boriska
Помогающий

ua
Offline Offline

« Ответ #47 : 26-08-2015 09:22 » 

Дак прочитал. И оно (предложение) поселило сомнение, что даже новомодный .net
умеет работать с другими типами картинок. Подумав
просто перефразировал твою мысль, вспомнив
Цитата
под Виндой другого Бога, кроме Win API, а MFC, .NET, ГТК, ОТК, ИТД и иже с ними лишь жалкие оболочки.
Иными словами хотел сказать "преобразуют к bmp и отдают винде (а там другого не бывает)."
« Последнее редактирование: 26-08-2015 10:22 от Boriska » Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 26-08-2015 14:39 » 

Не к bmp, а к Bitmap.
bmp, jpg... - форматы файлов, которые могут хранить некие сжатые или не сжатые данные. На основании расширения файла (и его заголовка) ему сопоставляется определённый алгоритм расшифровки, оформленный, как программный модуль - кодек - функция... Этот модуль преобразует содержимое файла в массив точек, который и есть Bitmap (и который от системы зависеть не будет - одинаков, как для Windows, так и для всего остального), плюс описательную структуру (которая у разных систем может отличаться).
Записан
Boriska
Помогающий

ua
Offline Offline

« Ответ #49 : 26-08-2015 14:52 » 

Цитата
Не к bmp, а к Bitmap.
Ну и я же про енто, ну наблал 3 символа вместо 6 Улыбаюсь

Добавлено через 2 дня, 14 часов, 54 минуты и 32 секунды:
Цитата
Можно ли битмап не просто вставить, а растянуть(подогнать) по размеру окна?
Цитата
См ф-ю BitBlt
Не могу понять как это сделать. Ну как в доке написано
Цитата
The BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.
Те по идее она копирует с одного ректангла в другой. По идее можно сделать CompatibleDC - оттуда как с ректангла в памяти скопировать скажем в ректангл кнопки. Но среди кодов операций нет операции растяжения.

Добавлено через 1 день, 14 часов, 42 минуты и 48 секунд:
Вот тут в Петцольде дошел до описаня контекста устройства (приведены атрибуты).
Один из атрибутов Strething mode - может через него, тем более, что название значения по умолчанию BLACKONWHITE я встречал когда читал документацию по BitBlt
« Последнее редактирование: 29-08-2015 05:46 от lkote » Записан
SI
Новенький

ru
Offline Offline

« Ответ #50 : 29-08-2015 23:14 » 

Цитата
Можно ли битмап не просто вставить, а растянуть(подогнать) по размеру окна?
[

 Посмотри функции:
 ::SetStretchBltMode(...)
 ::StretchBlt(...)
Записан
Boriska
Помогающий

ua
Offline Offline

« Ответ #51 : 27-01-2016 18:16 » 

С окном на окне разобрался. Сделал. Теперь хочется сделать по настоящему контрол, который бы висел
в тулбаре и его можно бы было перетаскивать на окно и обращаться в программе как к объекту. пожалуйста если
кто знает как это на mfc делается? на С# делал - там мастер есть, создать элемент управлени....
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines