| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Как установить Transparent для Static? |
| Автор: maq 22.1.2006, 14:55 |
| Как установить свойство Transparent для Static? Property Window не помогло. |
| Автор: Dreamer_0x01 22.1.2006, 15:10 |
| А если получить указатель на СStatic и сделать ModifyStyle() и ModifyStyleEx() ? |
| Автор: maq 31.1.2006, 21:05 |
| Вся проблема в том, что я не могу создать эту переменную - указатель на СStatic. "Cannot add member variable to a control with ID IDC_STATIC" Почему? |
| Автор: sfdev 1.2.2006, 00:10 | ||||
Можно попробовать сделать наследника от CStatic, в котором обрабатывать WM_PAINT, а там написать SetBkMode(TRANSPARENT) и рисовать нужный текст. А потом засабкласить твой статик в диалоге.
FROM MSDN: NOTE: Adding a static control in the Visual C++ 6.0 and Visual C++ .NET designers generates a default ID of IDC_STATIC for the control. The Dialog Editor does not permit you to associate a member variable with a control with the ID of IDC_STATIC. Change the ID of the static control in the Properties window to an ID that is defined by your application so that you can add a member variable of type CStatic to the dialog class. |
| Автор: maq 1.2.2006, 19:39 |
| Так создал переменную для CStatic - m_static1. Но вот в OnPaint m_static1.ModifyStyleEx(NULL, WS_EX_TRANSPARENT) возвращает 1. Но никакого эффекта. Неужели нельзя как-то иначе (без субклассинга), с использованием переменной CStatic задать эффект TRANSPARENT? |
| Автор: maq 7.2.2006, 09:40 |
| Перефразирую вопрос: субклассировать и т.д. - это можно. Но в смогу ли я в DesignTime на CDialog увидеть CStatic? Очевидно, что нет. Если я не могу видеть CStatic в DesignTime, то я бы просто использовал бы TextOut, задав координаты. Вопрос в том чтобы в DesignTime видеть расположение CStatic на CDialog. А TRANSPARENT можно задать в коде. Интересно, а как это делается на VB 6? Ведь там в DesignTime элементу управления Label (CStatic) уже на форме можно задать свойство TRANSPARENT и оно работает! |
| Автор: Coocky 7.2.2006, 15:34 | ||
| IDC_STATIC==0 Всегда Поменяй ID и будет тебе счастье CWnd*static=GetDlgItem(IDC_STATIC1) Добавлено @ 15:36
Помогло, помогло..Ты просто не знаешь, что ты хочешь..Какой ,ты думаешь эффект получить? |
| Автор: maq 8.2.2006, 09:18 | ||
ID для CStatic я поменял (например, IDC_STATIC_1), переменную создал. Не могу просто убрать задний фон у CStatic (т.е. убрать фон у прямоугольника CStatic-а), так чтобы виден был текст CStatic, а между буквами видно, скажем, окно (например, CDialog), на котором оно находится. Это я и называю TRANSPARENT BACKGROUND. Вот этот эффект я и хочу получить (как в VB 6). |
| Автор: Coocky 8.2.2006, 12:23 | ||
| Не получится.... Нужно самому делать руцями..
Читаем мануал- "WS_EX_TRANPARENT это означает создать прозрачное окно, а именно-любые окна ТОГО же уровня,накрываемые этим окном, ПОЛУЧАТ сообщения WM_PAINT в ПЕРВУЮ ОЧЕРЕДЬ-тем самым создавая эффект прозрачности А тебе нужно руками рисовать |
| Автор: maq 8.2.2006, 13:27 | ||||
Это я и пытался сделать с самого начала... типа (пишу по-памяти):
но опять ничего. (Хотя в VB 6 этот вариант отлично работает! правда для окна пробовал) Потом пытался скопировать фон под CStatic с помощью BltBit из DC окна в DC CStatic. Тоже ничего. |
| Автор: Coocky 8.2.2006, 13:42 |
| Что тебе конкретно нужно сделать? Сделать цветной текст на цветном фоне диалога? |
| Автор: maq 8.2.2006, 16:46 |
| Обычный текст на градиентном фоне окна. Фон окну я дал, а фон CStatic мешает |
| Автор: Aveic 10.2.2006, 21:28 | ||
я конечно знаю, что все это тема уже надоела, но может maq лучше сделать так. Зачем тебе создавать целый элемент CStatic, в котором ты просто хочешь отобразить текст в фиксированной позиции. Может просто заместить в твоем диалоге функциюю OnPaint() и там в нем нарисовать текст, установим перед этим прозрачность. А?
А... Я незнаю, мож я неправ |
| Автор: Coocky 13.2.2006, 10:49 | ||
| Дык надо проавильный тип статика использовать. В твоем случае подойдет только статитческий текст. Просто в методе ОnPaint() твоего статика нужно отрисовывать с dc.SetBkMode(TRANSPARENT);
|
| Автор: maq 13.2.2006, 21:33 | ||
Coocky,
, т.е. создать класс производный от CStatic и использовать его? Ты это имел ввиду? |
| Автор: Coocky 14.2.2006, 12:09 |
| Дело в том, что статиков-3 вида. Один из них-статический текст. Кидаешь этот элемент на диалог...Даешь ему ID- к примеру MyStatic. Далее делаешь, как я писал-свой класс, производный от CStatic- CMySuperStatic ,ну и рисуешь в нем в OnPaint-код тебе дал.. Затем включаешь описание заголовка своего статика в класс диалога. Обьявляешь переменую в хедере класса диалога CMySuperStatic stat; Затем в void ТвойДиалог::DoDataExchange(CDataExchange* pDX) пишешь DDX_Control(pDX,MyStatiс, stat); Все -работаешь, как с обьектом. При изменении текста, можешь делать stat.SetWindowText("Hello"); stat.Invalidate(); |
| Автор: maq 14.2.2006, 18:55 | ||
Coocky, не понял, какие 3 вида. Я использовал контрол "Static Text" из тулбокса (VS .NET 2005) |
| Автор: Coocky 15.2.2006, 10:46 |
| Правильно.. Еще есть GroupBox, Picture Control |
| Автор: maq 16.2.2006, 00:05 |
| Coocky, а если я допустим создам класс производный от CStatic смогу ли я разместить (и видеть) его на диалоговом окне в DesignTime? |
| Автор: Coocky 16.2.2006, 10:26 |
| Извини, но я незнаю, что такое DesignTime |
| Автор: maq 16.2.2006, 11:21 |
| DesignTime (стадия разработки, дизайна) - т.е. когда ты просматриваешь проект, можешь добавить или удалить контролы и т.д. Короче, если проект не запущен (т.е. не нажата кнопка "Run"!) RunTime (стадия запуска) - т.е. когда ты запустил проект (т.е. после того как нажата кнопка "Run"!) |
| Автор: Coocky 16.2.2006, 13:40 | ||||||
Буду знать
Ну давно уже написал |
| Автор: maq 16.2.2006, 13:54 |
| Но если я создам свой класс CMyStatic, и кину "CStatic" контрол на диалаговое окно, то у меня в коде это, естественно, будет класс CStatic, а не CMyStatic. Верно? |
| Автор: Coocky 16.2.2006, 14:24 | ||||
|
| Автор: maq 19.2.2006, 15:03 |
| Coocky, спасибо! Все получилось... |