C++ sexnarod journal ;
niktuba
Специалист
7/27/2006, 12:40:49 AM
(GregZ @ 13.07.2006 - время: 10:07)Не там ищешь. Вывести вертикальный текст способна любая из приведенных тобой функций.
Они выводят текст определенным шрифтом. Все что тебе надо - создать его вертикальным.
Обрати внимание на четвертый параметр (orientation) функции CreateFont. Он позволяет задавать угол отклонения базовой линии выводимых символом от оси абсцисс.
Замечательно! Все получилось. Правда, всякие там TextOut(...) вертикальный текст выравнивают с загибонами, но если покумекать, то все встает на место:
Я только вот чего не понял - чистит ли GDI'шный Device Context за собой созданные графические объекты или нет? В MFC используются классы с конструкторами/деструкторами, и там все понятнее. А в GDI - handles, и все более туманно.
Иными словами, в программе
BOOL CEChart::fbDrawChart(RECT* aPrcChart, HDC ahDC)
{
HBRUSH h_ChartBrush = CreateSolidBrush(RGB(250, 250, 100));
HBRUSH h_DefBrush = (HBRUSH__ *)SelectObject(ahDC, h_ChartBrush);
FillRect(ahDC, aPrcChart, h_ChartBrush);
// Is it sufficient
SelectObject(ahDC, h_DefBrush);
// or we need DeleteObject(SelectObject(ahDC, h_DefBrush));
// to clear the space allocated by h_ChartBrush ?
return TRUE;
} // BOOL CEChart::fbDrawChart(RECT* aPrcChart, HDC ahDC)
Они выводят текст определенным шрифтом. Все что тебе надо - создать его вертикальным.
Обрати внимание на четвертый параметр (orientation) функции CreateFont. Он позволяет задавать угол отклонения базовой линии выводимых символом от оси абсцисс.
Замечательно! Все получилось. Правда, всякие там TextOut(...) вертикальный текст выравнивают с загибонами, но если покумекать, то все встает на место:
Я только вот чего не понял - чистит ли GDI'шный Device Context за собой созданные графические объекты или нет? В MFC используются классы с конструкторами/деструкторами, и там все понятнее. А в GDI - handles, и все более туманно.
Иными словами, в программе
BOOL CEChart::fbDrawChart(RECT* aPrcChart, HDC ahDC)
{
HBRUSH h_ChartBrush = CreateSolidBrush(RGB(250, 250, 100));
HBRUSH h_DefBrush = (HBRUSH__ *)SelectObject(ahDC, h_ChartBrush);
FillRect(ahDC, aPrcChart, h_ChartBrush);
// Is it sufficient
SelectObject(ahDC, h_DefBrush);
// or we need DeleteObject(SelectObject(ahDC, h_DefBrush));
// to clear the space allocated by h_ChartBrush ?
return TRUE;
} // BOOL CEChart::fbDrawChart(RECT* aPrcChart, HDC ahDC)
DELETED
Акула пера
7/27/2006, 6:01:32 PM
Чистить за собой обязательно, т.е. всегда надо звать DeleteObject.
niktuba
Специалист
7/27/2006, 6:13:14 PM
(JeyLo @ 27.07.2006 - время: 14:01) Чистить за собой обязательно, т.е. всегда надо звать DeleteObject.
Спасибо, так мне сердце и подсказывало
Спасибо, так мне сердце и подсказывало
DELETED
Акула пера
8/2/2006, 7:02:13 PM
Кто скажет, что делает эта функция без всяких там условных переходов? :)))
inline int h3(int m,int y) {
return 28+!!(m-2)*2+!(y%4)*!(m-2)+m/8*(1-m%2)+(1-m/8)*(m%2);
}
inline int h3(int m,int y) {
return 28+!!(m-2)*2+!(y%4)*!(m-2)+m/8*(1-m%2)+(1-m/8)*(m%2);
}
DELETED
Акула пера
8/2/2006, 7:52:12 PM
(JeyLo @ 02.08.2006 - время: 15:02)Кто скажет, что делает эта функция без всяких там условных переходов? :)))
inline int h3(int m,int y) {
return 28+!!(m-2)*2+!(y%4)*!(m-2)+m/8*(1-m%2)+(1-m/8)*(m%2);
}
Скажем тоже само что и
CODE inline int h3(int m)
{
return 30+m*(1-m%2)+(1-m)*(m%2);
}
А без +30 (для положительных m) просто превращает все нечетные m в -(m-1). Вот такой же код с использованием тернарного оператора:
CODE return m % 2 ? -(m - 1) : m;
Для чего это нужно, не знаю.
inline int h3(int m,int y) {
return 28+!!(m-2)*2+!(y%4)*!(m-2)+m/8*(1-m%2)+(1-m/8)*(m%2);
}
Скажем тоже само что и
CODE inline int h3(int m)
{
return 30+m*(1-m%2)+(1-m)*(m%2);
}
А без +30 (для положительных m) просто превращает все нечетные m в -(m-1). Вот такой же код с использованием тернарного оператора:
CODE return m % 2 ? -(m - 1) : m;
Для чего это нужно, не знаю.
DELETED
Акула пера
8/2/2006, 8:08:17 PM
Не туда думаешь.. :))
DELETED
Акула пера
8/4/2006, 6:12:54 PM
cout << h3 ( 2, 2006 ) будет 28, cout << h3 ( 2, 2000 ) будет 29, а cout << 30+2*(1-2%2)+(1-2)*(2%2) будет 32...
В смысле код - получение дней в месяце в году чистой математикой. Воооот... :)))
В смысле код - получение дней в месяце в году чистой математикой. Воооот... :)))
niktuba
Специалист
8/4/2006, 8:19:32 PM
Создавая программы на С++ мне часто приходится писать документацию, включающую три языка, рисунки и исходный код. Поэтому никуда не деться, приходится для этого дела использовать MS Word. Для автоматического выделения синтаксиса (syntax highlighting) я приспособил ADX_Toys_2_WD
https://www.canadiancontent.net/tech/downlo..._Toys_2_WD.html. Но эта утилита довольно глупая, подсвечивает только базовые ключевые слова, а даже #include уже кишка тонка. Есть ли в природе макросы/add-in к Ворду, которые позволяют подсвечивать все ключевые слова и выделять
// зеленым комментарии?
https://www.canadiancontent.net/tech/downlo..._Toys_2_WD.html. Но эта утилита довольно глупая, подсвечивает только базовые ключевые слова, а даже #include уже кишка тонка. Есть ли в природе макросы/add-in к Ворду, которые позволяют подсвечивать все ключевые слова и выделять
// зеленым комментарии?
niktuba
Специалист
8/4/2006, 10:52:17 PM
(JeyLo @ 04.08.2006 - время: 17:01)https://www.codeproject.com/com/wordhighlight.asp
Замечательно, спасибо!
Замечательно, спасибо!
niktuba
Специалист
9/7/2006, 7:33:19 PM
(S)-Народ!
Есть ли в Visual С++ 6.0 функция типа LineTo, которая позволяла бы рисовать линию только в пределах известного прямоугольника - например заданной области построения линейного графика?
Заранее спасибо за любые комментарии.
Есть ли в Visual С++ 6.0 функция типа LineTo, которая позволяла бы рисовать линию только в пределах известного прямоугольника - например заданной области построения линейного графика?
Заранее спасибо за любые комментарии.
DELETED
Акула пера
9/7/2006, 8:55:08 PM
Follow the CreateRectRgn & SelectClipRgn . Прямых функций нет.
tetro
Специалист
9/10/2006, 6:12:43 PM
Наконец-то, на работе, начали переход на 2005 студию.
И тут такой вопрос.
Есть функция, скажем:
CODE void lala(const double * &p) {....}
Передается ей референс на массив (например чтобы можно было его удалить)
Есть 2 массива:
CODE
double *pD;
const double *pCD;
Раньше (в 2003) оба варианта
CODE
lala(pD);
lala(pCD);
Были законны, а теперь только второй. 2005 требует наличия функции:
CODE void lala(double * &p) {....}
Об'ясните, чем это стандарту не нравится? (или это МС глюки?)
И тут такой вопрос.
Есть функция, скажем:
CODE void lala(const double * &p) {....}
Передается ей референс на массив (например чтобы можно было его удалить)
Есть 2 массива:
CODE
double *pD;
const double *pCD;
Раньше (в 2003) оба варианта
CODE
lala(pD);
lala(pCD);
Были законны, а теперь только второй. 2005 требует наличия функции:
CODE void lala(double * &p) {....}
Об'ясните, чем это стандарту не нравится? (или это МС глюки?)
guest_from_the_past
Новичок
9/12/2006, 4:52:41 AM
(tetro @ 10.09.2006 - время: 14:12)Наконец-то, на работе, начали переход на 2005 студию.
И тут такой вопрос.
2005 студия абсолютна корректна. Если по-простому: стандарт запрещает сохранять (или передавать в функцию) ссылки на неконстантные временные объекты.
Т.е. (простой пример)
CODE
int& p = int(); // ошибка
const& p = int(); // правильно
2003 студия на этом примере отработает правильно, у нее глюк только со ссылками на указатель, но смысл уловить можно.
Откуда берется временный объект? Все просто. Поскольку функция lala у тебя одна, и только для const double*, компилятор перебирая возможные варианты преобразований создает временный объект const double* на основе double* и подставляет его в функцию. Повторю, подставляет _временный_объект_. А дальше облом - ссылку то ты получаешь неконстантную.
Добавив const перед ссылкой, можно решить проблему преобразований:
CODE void lala(const double * const&p) {....}
Но боюсь это не то, что тебе надо. Ибо исчезнет возможность изменения значения указателя. Собственно для этого ты его и передавал по ссылке.
Воспользуйся введением дополнительной функции:
CODE void lala(const double*& p) { p = 0; /* к примеру */ }
void lala(double*& p) { const double* tmp_p = p; lala(tmp_p); p = const_cast<double*>(tmp_p); }
Либо особенность оптимизации, которая потом выкидывает временный объект, что позволяет поступить так: (не очень хорошо)
CODE void lala(const double* const& p) { const double*& p1 = const_cast<const double*&>(p); p1 = 0; }
const_cast здесь совершенно корректен.
PS. я бы порекомендовал избавиться от функций изменяющих указатель, принимаемый в качестве аргумента
PPS. на вопросы телезрителей исключительно из уважения к tetro отвечал GregZ, спасибо за внимание
И тут такой вопрос.
2005 студия абсолютна корректна. Если по-простому: стандарт запрещает сохранять (или передавать в функцию) ссылки на неконстантные временные объекты.
Т.е. (простой пример)
CODE
int& p = int(); // ошибка
const& p = int(); // правильно
2003 студия на этом примере отработает правильно, у нее глюк только со ссылками на указатель, но смысл уловить можно.
Откуда берется временный объект? Все просто. Поскольку функция lala у тебя одна, и только для const double*, компилятор перебирая возможные варианты преобразований создает временный объект const double* на основе double* и подставляет его в функцию. Повторю, подставляет _временный_объект_. А дальше облом - ссылку то ты получаешь неконстантную.
Добавив const перед ссылкой, можно решить проблему преобразований:
CODE void lala(const double * const&p) {....}
Но боюсь это не то, что тебе надо. Ибо исчезнет возможность изменения значения указателя. Собственно для этого ты его и передавал по ссылке.
Воспользуйся введением дополнительной функции:
CODE void lala(const double*& p) { p = 0; /* к примеру */ }
void lala(double*& p) { const double* tmp_p = p; lala(tmp_p); p = const_cast<double*>(tmp_p); }
Либо особенность оптимизации, которая потом выкидывает временный объект, что позволяет поступить так: (не очень хорошо)
CODE void lala(const double* const& p) { const double*& p1 = const_cast<const double*&>(p); p1 = 0; }
const_cast здесь совершенно корректен.
PS. я бы порекомендовал избавиться от функций изменяющих указатель, принимаемый в качестве аргумента
PPS. на вопросы телезрителей исключительно из уважения к tetro отвечал GregZ, спасибо за внимание
tetro
Специалист
9/12/2006, 10:52:50 PM
Отвечу здесь...
О существовании там временного объекта я не подумал.
А случай (в реальности, не кристалиизированый) - это деаллокаторы (облочки для delete, чтобы корректно удалять 1, 2, 3 и т.д. массивы).
Других осмысленных использований этого метода, без организации минного поля в коде я и сам не вижу.
О существовании там временного объекта я не подумал.
А случай (в реальности, не кристалиизированый) - это деаллокаторы (облочки для delete, чтобы корректно удалять 1, 2, 3 и т.д. массивы).
Других осмысленных использований этого метода, без организации минного поля в коде я и сам не вижу.
-=PushPull=-
Новичок
12/9/2006, 4:14:23 AM
GregZ, чего с указателями решили, и почему? аналогичный выбор надо сделать...
на счет каста. изврат имхо. я не могу вспомнить ни одного случая, когда мне приходилось бы кастить от родителя к потомку на этапе компиляции. только наоборот.
на счет каста. изврат имхо. я не могу вспомнить ни одного случая, когда мне приходилось бы кастить от родителя к потомку на этапе компиляции. только наоборот.