Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата

Как установить свойство Transparent для Static?

Property Window не помогло.

Можно попробовать сделать наследника от CStatic, в котором обрабатывать WM_PAINT, а там написать SetBkMode(TRANSPARENT) и рисовать нужный текст. А потом засабкласить твой статик в диалоге.

Цитата

Вся проблема в том, что я не могу создать эту переменную - указатель на СStatic.

"Cannot add member variable to a control with ID IDC_STATIC"

Почему?


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 и оно работает!

Автор: AlexPro 7.2.2006, 11:31
Цитата(maq @ 7.2.2006, 09:40 Найти цитируемый пост)

Но в смогу ли я в DesignTime на CDialog увидеть CStatic? Очевидно, что нет

Почему нет? Кидаешь Static Text на свой диалог, меняешь его ID на что-нибуть вразумительное (т.к. через IDC_STATIC ты не сможешь пользоваться им в программе), кликаешь по элементу правой кнопкой - выбираешь Add Variable - и используешь как тебе понравится. Последний пункт необязательный - можно получить доступ через GetDlgItem, но так удобнее. Или я чего недопонимаю?

Автор: Coocky 7.2.2006, 15:34
Цитата(maq @ 31.1.2006, 21:05 Найти цитируемый пост)

"Cannot add member variable to a control with ID IDC_STATIC

smile
IDC_STATIC==0 Всегда
Поменяй ID и будет тебе счастье smile
CWnd*static=GetDlgItem(IDC_STATIC1)
Добавлено @ 15:36
Цитата(maq @ 22.1.2006, 14:55 Найти цитируемый пост)

Как установить свойство Transparent для Static?

Property Window не помогло.

Помогло, помогло..Ты просто не знаешь, что ты хочешь..Какой ,ты думаешь эффект получить? smile

Автор: maq 8.2.2006, 09:18
Цитата

Поменяй ID и будет тебе счастье

ID для CStatic я поменял (например, IDC_STATIC_1), переменную создал.

Не могу просто убрать задний фон у CStatic (т.е. убрать фон у прямоугольника CStatic-а), так чтобы виден был текст CStatic, а между буквами видно, скажем, окно (например, CDialog), на котором оно находится. Это я и называю TRANSPARENT BACKGROUND.

Вот этот эффект я и хочу получить (как в VB 6).

Автор: Coocky 8.2.2006, 12:23
Не получится.... smile
Нужно самому делать руцями..
Цитата(maq @ 8.2.2006, 09:18 Найти цитируемый пост)

Не могу просто убрать задний фон у CStatic (т.е. убрать фон у прямоугольника CStatic-а), так чтобы виден был текст CStatic, а между буквами видно, скажем, окно (например, CDialog), на котором оно находится. Это я и называю TRANSPARENT BACKGROUND.

Читаем мануал-
"WS_EX_TRANPARENT это означает создать прозрачное окно, а именно-любые окна ТОГО же уровня,накрываемые этим окном, ПОЛУЧАТ сообщения WM_PAINT в ПЕРВУЮ ОЧЕРЕДЬ-тем самым создавая эффект прозрачности smile " Понял?
А тебе нужно руками рисовать smile Никто за тебя ничего отсекать не будет. У тебя фон нестандартный внизу? Правильно, Ты долже сам создать.

Автор: maq 8.2.2006, 13:27
Цитата

А тебе нужно руками рисовать  Никто за тебя ничего отсекать не будет. У тебя фон нестандартный внизу? Правильно, Ты долже сам создать.

Это я и пытался сделать с самого начала... типа (пишу по-памяти):

Код

//CStatic text  = ""
//pDC = указатель на DC CStatic
//m_static = переменная CStatic
//pDC->SetBkMode(TRANSPARENT);

pDC->BeginPath();
pDC->TextOut(_T("Text Label"));
pDC->EndPath();
HRGN hRgn = PathToRegion(m_static.m_hWnd, pDC->m_hdc);
::SetWindowRgn(m_static.m_hWnd, hRgn);


но опять ничего. (Хотя в 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() и там в нем нарисовать текст, установим перед этим прозрачность. А?
Код

CMyDialog::OnPaint()
{
//.....
dc.SetBkMode(TRANSPARENT);
dc.TexOut(100,100,"Hello,world!");
}

А...
Я незнаю, мож я неправ

Автор: Coocky 13.2.2006, 10:49
Цитата(maq @ 8.2.2006, 16:46 Найти цитируемый пост)
Фон окну я дал, а фон CStatic мешает

Дык надо проавильный тип статика использовать. В твоем случае подойдет только статитческий текст.
Просто в методе ОnPaint() твоего статика нужно отрисовывать с dc.SetBkMode(TRANSPARENT);
Код

CMyStatic::OnPaint()
{
//.....
CString text;
GetWindowText(text);
dc.SetBkMode(TRANSPARENT);
dc.TexOut(5,5,&text);
}




Автор: 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
Цитата
Дело в том, что статиков-3 вида.

Coocky, не понял, какие 3 вида.
Я использовал контрол "Static Text" из тулбокса (VS .NET 2005)

Автор: Coocky 15.2.2006, 10:46
Цитата(maq @ 14.2.2006, 18:55 Найти цитируемый пост)
Я использовал контрол "Static Text" из тулбокса

Правильно..
Еще есть GroupBox, Picture Control

Автор: maq 16.2.2006, 00:05
Coocky, а если я допустим создам класс производный от CStatic смогу ли я разместить (и видеть) его на диалоговом окне в DesignTime?

Автор: Coocky 16.2.2006, 10:26
Цитата(maq @ 16.2.2006, 00:05 Найти цитируемый пост)
его на диалоговом окне в DesignTime?

Извини, но я незнаю, что такое DesignTime

Автор: maq 16.2.2006, 11:21
DesignTime (стадия разработки, дизайна) - т.е. когда ты просматриваешь проект, можешь добавить или удалить контролы и т.д. Короче, если проект не запущен (т.е. не нажата кнопка "Run"!)

RunTime (стадия запуска) - т.е. когда ты запустил проект (т.е. после того как нажата кнопка "Run"!)

Автор: Coocky 16.2.2006, 13:40
Цитата(maq @ 16.2.2006, 11:21 Найти цитируемый пост)
DesignTime (стадия разработки, дизайна) - т.е. когда ты просматриваешь проект, можешь добавить или удалить контролы и т.д. Короче, если проект не запущен (т.е. не нажата кнопка "Run"!)

RunTime (стадия запуска) - т.е. когда ты запустил проект (т.е. после того как нажата кнопка "Run"!)

smile
Буду знать smile

Цитата(maq @ 16.2.2006, 00:05 Найти цитируемый пост)
Coocky, а если я допустим создам класс производный от CStatic смогу ли я разместить (и видеть) его на диалоговом окне в DesignTime?


Цитата(Coocky @ 14.2.2006, 12:09 Найти цитируемый пост)
  Кидаешь этот элемент на диалог...Даешь ему ID- к примеру MyStatic.
Далее делаешь, как я писал-свой класс, производный от CStatic-
CMySuperStatic ,ну и рисуешь в нем в OnPaint-код тебе дал..
Затем включаешь описание заголовка своего статика в класс диалога.
Обьявляешь переменую в хедере класса диалога CMySuperStatic stat;
Затем в void ТвойДиалог::DoDataExchange(CDataExchange* pDX) пишешь

DDX_Control(pDX,MyStatiс, stat);
Все -работаешь, как с обьектом.
При изменении текста, можешь делать
stat.SetWindowText("Hello");
stat.Invalidate();

Ну давно уже написал smile

Автор: maq 16.2.2006, 13:54
Но если я создам свой класс CMyStatic, и кину "CStatic" контрол на диалаговое окно, то у меня в коде это, естественно, будет класс CStatic, а не CMyStatic. Верно?

Автор: Coocky 16.2.2006, 14:24
Цитата(maq @ 16.2.2006, 13:54 Найти цитируемый пост)
Но если я создам свой класс CMyStatic, и кину "CStatic" контрол на диалаговое окно, то у меня в коде это, естественно, будет класс CStatic, а не CMyStatic. Верно?

smile
Цитата

Затем включаешь описание заголовка своего статика в класс диалога.
Обьявляешь переменую в хедере класса диалога CMySuperStatic stat;
Затем в void ТвойДиалог::DoDataExchange(CDataExchange* pDX) пишешь

DDX_Control(pDX,MyStatiс, stat);



Автор: maq 19.2.2006, 15:03
Coocky, спасибо!
Все получилось...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)