Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Прозрачный STATIC текст (http://forum.oszone.net/showthread.php?t=87182)

Maksim V 17-07-2007 23:49 614961

Прозрачный STATIC текст
 
Здраствуйте. Привожу сразу все исходные данные.

Код:

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 614966

Цитата:

Цитата Maksim V
статичесий текст с прозрачным фоном?

...это как интересно??Можно конкретнее??

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

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 614978

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

DillerInc 18-07-2007 02:02 614988

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

Maksim V 18-07-2007 03:11 614996

Вложений: 1
вообщем статический текст расположен на рисунке. но фон текста не прозрачный. из-за этого видно след на битмапе. что можно придумать?

DillerInc 18-07-2007 22:00 615529

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

Maksim V 19-07-2007 04:00 615630

Подправьте пожалуйста мой исходник. Мне все таки так будет яснее (я все таки начинающий и мне легче когда на примере показано решение).

unick-soft 30-07-2009 20:09 1181795

Ври как раз статья на эту тему.
Как сделать static с прозрачным фоном

Admiral 19-11-2009 03:35 1274136

Доброго времени суток.
Для иллюстрации проблемы, привожу скрин, одного демонстрационного приложения, запущенного под Windows 7.

С элементами управления Static проблему удалось победить (как под WinХР, так и под Win7), благодаря коду по ссылке из поста 8.
В программе 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
А со стандартным разве никак не выйдет решить? Ведь фон в приложении стандартный, а не картинка как в случаи описанном на CodeProject.


Время: 15:37.

Время: 15:37.
© OSzone.net 2001-