Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Прозрачность формы-гаджета


Автор: manemale 27.03.20, 07:08
Решил сделать гаджет-песочные часы. Вставил на форму Image1, в нём Bitmap с изображением песочных часов. Те области часов, которые должны быть прозрачными, я залил красным цветом. Далее задал свойства формы:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    Form1->Color=255;
    Form1->TransparentColor=true;
    Form1->TransparentColorValue=255;
    }
    //---------------------------------------------------------------------------

Пока всё хорошо. Далее вставил найденный в Интернете код, позволяющий убрать системные кнопки окна, значок моего приложения в панеле задач, сделать так, чтобы моё окно не сворачивалсоь и его можно было перемещать левой мышкой:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    //---------------------------------------------------------------------------
    bool SetToDesktop() {
      HWND listViewhwnd = FindWindowA("Progman", NULL);
      if(listViewhwnd) {
        listViewhwnd = FindWindowExA(listViewhwnd, NULL, "SHELLDLL_DefView", NULL);
        if(listViewhwnd) {
          listViewhwnd = FindWindowExA(listViewhwnd, NULL, "SysListView32", NULL);
          if(listViewhwnd) {
            Form1->BorderStyle = bsNone;
            ::SetParent(Form1->Handle, listViewhwnd);
            return true;
          }
        }
      }
      return false;
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
      if(!SetToDesktop())ShowMessage("Ошибка SetToDesktop");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y)
    {
      long SC_DRAGMOVE = 0xF012;
      if(Button == mbLeft) {
      ReleaseCapture();
      SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
      }
    }
    //---------------------------------------------------------------------------

Теперь мой гаджет стал красным, прозрачность исчезла, т.е. свойство Form1->TransparentColor=true не работает. Тогда я задал свойство TransparentColor=true в инспекторе объектов в свойствах формы. При запуске приложения форму вообще перестало быть видно. Строка, из-за которой перестала работать прозрачность формы:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ::SetParent(Form1->Handle, listViewhwnd);

Язык C++Builder 2009. Операционная система Windows Vista. Какими мыслями поделитесь, в каком направлении мне рыть? Попробую в других операционных системах и других версиях C++Builder.

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