Войти

Показать полную графическую версию : Прозрачный STATIC текст


Maksim V
17-07-2007, 23:49
Здраствуйте. Привожу сразу все исходные данные.

program test;

{$R test.res}

uses
Windows,
Messages,
ShellAPI;

const
MAIN_DIALOG = 101;
ABOUT_DIALOG = 102;
MAIN_ABOUT = 104;
ABOUT_CLOSE = 105;
var
Inst,
HWND : integer;

procedure AboutDlgInit;
begin
end;

function AboutDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
begin
Result := 0;
case uMsg of
WM_COMMAND : begin
if wParam = ABOUT_CLOSE then EndDialog(hWin,0);
if wParam = WM_COMMAND then EndDialog(hWin,0);
end;
WM_INITDIALOG : begin
AboutDlgInit;
end;
WM_DESTROY : begin
EndDialog(hWin,0);
end;
WM_CLOSE : begin
EndDialog(hWin,0);
end;
end;
end;

procedure MainDlgInit;
begin
end;

function MainDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
begin
case uMsg of
WM_COMMAND : begin
if wParam = MAIN_ABOUT then DialogBoxParam(Inst, PChar(ABOUT_DIALOG), hWin, @AboutDlgProc, 0);
if wParam = WM_COMMAND then EndDialog(hWin,0);
end;
WM_DESTROY : begin
EndDialog(hWin,0);
end;
WM_CLOSE : begin
EndDialog(hWin,0);
end;
end;
end;

begin
Inst := hInstance; DialogBoxParam(Inst, PChar(MAIN_DIALOG), 0, @MainDlgProc, 0);
end.

Вопрос: Как можно в Эбаут диалоге создать статичесий текст с прозрачным фоном? Желательно при наведении на этот текст, цвет текста становился синим цветом и курсор менялся на ладонь с указывающим пальцем - хочу сделать гиперссылку. Знаю что надо использовать функцию CreateWindowsEx, но как правильно? Напишите сразу полный текст исходника, если вас не затруднит.

DillerInc
18-07-2007, 00:21
статичесий текст с прозрачным фоном?
...это как интересно??Можно конкретнее??

Например,можно скомпилировать такой ресурс:

AboutBox DIALOGEX 15, 15, 130, 75
STYLE WS_VISIBLE + WS_POPUP + WS_CAPTION
CAPTION "About SDInterruptionEx..."
FONT 11, "Times new roman"

BEGIN
LTEXT "SafeDisc Interruption Extended" -1, 5, 12, 130, 8
LTEXT "Coded in TASM32" -1, 5, 24, 130, 8
LTEXT " by DillerInc" -1, 25, 36, 130, 8
DEFPUSHBUTTON "OK" IDOK, 44, 55, 40, 12, WS_GROUP + BS_VCENTER + BS_CENTER
END
...вот вам и статический текст в окне "About".

Maksim V
18-07-2007, 01:09
Тут проблема упирается в прозрачный фон. То есть если я наложу ресурс static на картинку в диалоге, то от статика будет поле, которое мне не нужно. Тупо нужен прозрачный фон. Примеров в инете мало и в основном предлагают как-то юзать transparent. Только куда его тут использовать?

DillerInc
18-07-2007, 02:02
Maksim V
Ну,скомпилируйте ресурс и посмотрите.Разве в скрипте где-то упоминается про static??
Иначе я не понимаю,о чём идёт речь.

Maksim V
18-07-2007, 03:11
вообщем статический текст расположен на рисунке. но фон текста не прозрачный. из-за этого видно след на битмапе. что можно придумать?

DillerInc
18-07-2007, 22:00
Maksim V
Попробуй разместить свой статический текст не в ресурсе,а создать его с помощью функции CreateWindowEx во время обработки сообщения WM_INITDIALOG.Первым параметром функции тогда должен быть WS_EX_TRANSPARENT.

Maksim V
19-07-2007, 04:00
Подправьте пожалуйста мой исходник. Мне все таки так будет яснее (я все таки начинающий и мне легче когда на примере показано решение).

unick-soft
30-07-2009, 20:09
Ври как раз статья на эту тему.
Как сделать static с прозрачным фоном (http://unick-soft.ru/Articles.cgi?id=12)

Admiral
19-11-2009, 03:35
Доброго времени суток.
Для иллюстрации проблемы, привожу скрин, одного демонстрационного приложения, запущенного под Windows 7.
http://s51.radikal.ru/i133/0911/f4/47cb4558a9c8.png
С элементами управления Static проблему удалось победить (как под WinХР, так и под Win7), благодаря коду по ссылке из поста 8.
В программе MultiBoot (http://soft.oszone.net/program/9336/MultiBoot/) код сделал немного универсальным, проверяю класс элемента управления,
case WM_CTLCOLORSTATIC:
{
wchar_t Class[80]=L"";
GetClassName((HWND)lParam, Class, 80);
if ((lstrcmp(Class, L"Static")==0))// | (lstrcmp(Class, L"Button")==0))
{
//if (((HWND)lParam != ProhWnd[3]) & ((HWND)lParam != ProhWnd[14]) & ((HWND)lParam != ProhWnd[17]) & ((HWND)lParam != ProhWnd[20]) & ((HWND)lParam != ProhWnd[24]) & ((HWND)lParam != ProhWnd[28]) & ((HWND)lParam != ProhWnd[31]))//Исключаем ГрупБоксы
//{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
//}
}
}
break;
так как в случаи с HMENU в if получится слишком длинная строка.
Ищется решение для Статико-содержащих Чекбоксов (а.к.а. Флажков, Галок), ГруппБоксов (элементов управления Групп).
Закомментированный код как раз и призван решать. В таком случаи: ЧекБокс под WinXP решается, а вот под Win Vista и выше продолжает отображаться с визуальным дефектом (сейчас, при закомментированном - на оборот. Желательно универсальное решения для обеих ОСей). ГрупБокс сильно буквально воспринимает прозрачность - показывает продолжения линии группы.
Для решения вопроса с ГруппБоксами, участник CodeProject, предлагает использовать свой класс
Transparent group box (http://www.codeproject.com/KB/miscctrl/tgroupbox.aspx)
А со стандартным разве никак не выйдет решить? Ведь фон в приложении стандартный, а не картинка как в случаи описанном на CodeProject.




© OSzone.net 2001-2012