C++ sexnarod journal ;

niktuba
7/27/2006, 12:40:49 AM
(GregZ @ 13.07.2006 - время: 10:07)Не там ищешь. Вывести вертикальный текст способна любая из приведенных тобой функций.
Они выводят текст определенным шрифтом. Все что тебе надо - создать его вертикальным.
Обрати внимание на четвертый параметр (orientation) функции CreateFont. Он позволяет задавать угол отклонения базовой линии выводимых символом от оси абсцисс.
Замечательно! Все получилось. Правда, всякие там TextOut(...) вертикальный текст выравнивают с загибонами, но если покумекать, то все встает на место:
image

Я только вот чего не понял - чистит ли 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.
Спасибо, так мне сердце и подсказывало rolleyes.gif
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);
}
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;

Для чего это нужно, не знаю.
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 к Ворду, которые позволяют подсвечивать все ключевые слова и выделять
// зеленым комментарии?
DELETED
8/4/2006, 9:01:44 PM
https://www.codeproject.com/com/wordhighlight.asp
niktuba
8/4/2006, 10:52:17 PM
(JeyLo @ 04.08.2006 - время: 17:01)https://www.codeproject.com/com/wordhighlight.asp
Замечательно, спасибо!
image
niktuba
9/7/2006, 7:33:19 PM
(S)-Народ!
Есть ли в Visual С++ 6.0 функция типа LineTo, которая позволяла бы рисовать линию только в пределах известного прямоугольника - например заданной области построения линейного графика?
Заранее спасибо за любые комментарии.

image
DELETED
9/7/2006, 8:55:08 PM
Follow the CreateRectRgn & SelectClipRgn wink.gif. Прямых функций нет.
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) {....}

Об'ясните, чем это стандарту не нравится? (или это МС глюки?)
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, спасибо за внимание
tetro
9/12/2006, 10:52:50 PM
Отвечу здесь...
О существовании там временного объекта я не подумал.
А случай (в реальности, не кристалиизированый) - это деаллокаторы (облочки для delete, чтобы корректно удалять 1, 2, 3 и т.д. массивы).

Других осмысленных использований этого метода, без организации минного поля в коде я и сам не вижу.
-=PushPull=-
12/9/2006, 4:14:23 AM
GregZ, чего с указателями решили, и почему? аналогичный выбор надо сделать...

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