Strona: [  << <   1 2   > >>  ]  z  2     
Autor Temat: Usuwanie właściwości kontrolki
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004
Usuwanie właściwości kontrolki

Witam

Czy da się usunąć za pomocą API jakąś właściwość kontrolki - chodzi mi o kontrolki standardowe?

Chciałem usunąć z kontrolki checkBox właściwość BackColor (chciałem żeby nie posiadała tła) ale nie na stałe tylko na czas działania programu.

Pozdrawiam.


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

27-10-2004 16:31
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Nie, nie da się usunąc właściwości kontrolek. A nawet, gdyby się dało, to niewiele by to pozytku przyniosło - straciłbyś jedynie kontrolę nad kontrolką i tyle . Usuniecie backcolor nic by nie dało, bo ta zmienna jedynie definiuje kolor tła. Natomiast żeby kontrolka nie miała "tła"... musiałaby nie mieć okna lub musiałbyś je "przyciąć" dokładnie do napisów. Sądzę, że łatwiej ci będzie, jeśli zmniejszysz checkboxa do rozmiarów samego pola z ptaszkiem (teho kwadraciku), a napis zrobisz labelem. On nie tworzy okna, więc może mieć efekt 'przezroczystego' tła.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

27-10-2004 19:28
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

A może jakaś funkcja która ustawia przeźroczyste tło kontrolki.

P.S. Tego labela nie da się wstawic przed TabStrip


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

27-10-2004 23:43
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

NIe, bo tło nie może być przezroczyste.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

28-10-2004 00:56
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No a jak wstawić OptionBoxa albo Labela przed kontrolkę TabStrip??

ZOrder nie działa


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

28-10-2004 12:38
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Możesz je umieścić w jakimś kontenerze, któy wyjdzie przed TabStripa - np. Picturebox.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

28-10-2004 15:19
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No właśnie umieszczam w kontrolce Frame ale nie da się z niej usunąć tła

Tak się zastanawiam jak jest realizowana właściwość BackStyle w kontrolce Label - tam można usunąć tło czyli musi być możliwość usunięcia tła za pomocą API ale jak ????

P.S. Próbowałem też z Shape bo ma właściwość BackStyle (można usunąć tło) ale on nie jest kontenerem i na dodatek nie da się jej wrzucić przed Tabstrip'a

Pozdrawiam

Spróbowałem jak mi mówiłeś z ChceckBoxem żeby dodać osobnego labela a co w przypadku OptionBox'a - on jest okrągły

Mam świadomość tego ze trzeba będzie to zmienić (o ile się da) w momencie gdy kontrolka jest rysowana. Jak ??

Pozdrawiam

[Post edytowany dnia 28-10-2004 15:40 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

28-10-2004 15:39
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Znalazłem ciekawą funkcję SetBkMode ale nie wiem jak jej używać tzn. wiem co i jak ale nie chce działać


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

28-10-2004 16:45
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Rzeczywiście z tym Pictureboxem to nie był też dobry pomysł.

2) Lebel, Shape i kilka innych tak naprawdę wogóle nie mają okien. Dlatego nie mają też tła. BackStyle tak naprawdę jest realizowane dopiero w momencie, gdy ma być nieprzezroczyste - wtedy program je dorysowuje. Czyli to obecność tła, a nie jego brak jest efektem działania tej właściwości. Nie znam dokładnie sposobu działania programu napisanego w VB, ale podejrzewam, ze Lebel, Shape i Image jedynie wyznaczaja dane, an podstawie których program potem rysuje te elementy na oknie, nie traktując ich już jako obiektów i używa do tego zwykłych funkcji GDi, gdy tymczasem Textbox, Pictre czy Button funkcjonują jako niezależne obiekty posiadajace okna i będące podoknami formy.

4) SetBkMode - ta funkcja dotyczy tła przy używaniu Brushów, Penów itd. Czyli podczas rysowania tymi obiektami. Nie ma nic wspólnego z tym rozumieniem słowa "tło", o które nam chodzi.

Ale po co ci tak wogóle usunięcie tła? Może tak do czegoś dojdziemy.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

28-10-2004 17:06
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Bo w XP Styles Tabstrip ma biale zakładki i na dodatek z Gradientem a zeby co na nich umieścić trzeba najpierw dodać do kontenera np. Frame i dopiero na TabStrip - Tyle że Frame ma tło i zasłania cały efekt gradientu.

Poza tym SetBkMode ma chyba dużo wspólnego z usuwaniem tła bo znalazłem kilka stron na których pokazano sample odnośnie usuwania tła formy i tam właśnie użyta jest ta funkcja (forma staje się przeźroczysta) - połączone jest to ze zmienną TRANSPARENT i WS_EX_TRANSPARENT.

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

29-10-2004 09:03
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
anonim




Typ: Nie zarejestrowany

Chcial bym przy okazji spytac widzialem kilka np. keygenów co forma miala taki fajny ksztalt. tzn np. koło. Jak zrobic takie cos?

29-10-2004 13:49
  
anonim




Typ: Nie zarejestrowany

Chcial bym przy okazji spytac widzialem kilka np. keygenów co forma miala taki fajny ksztalt. tzn np. koło. Jak zrobic takie cos?

29-10-2004 13:50
  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Zacznijmy od tego, że nie ma pojęcia "usuwać tło" w Windowsie. Nie ma wogóle pojęcia "tło" w takim znaczeniu, jak poruszane tutaj. Tam jest okno. Poprostu okno - obiekt, który ma kształt prostokąta i taki prostokącik jest rysowany na ekranie. Koniec. Tła nie ma.
Natomiast każde okno ma przypisane coś, co się zwie Device Context, w skrócie DC. DC służy do rysowania po nim samym, a właściwie po przypisanej do DC bitmapie. DC ma wiele zmiennych, jedną z nich jest kolor tła. Jest to kolor, który jest używany jako kolor tłą bitmapy(!), czyli mówiąc bardziej łopatologicznie - ten kolor, który jest użyty, gdy w danym punkcie nic nie jest narysowane. Zaznaczę tylko, że wartość tego koloru mieści się w przedziale [0x0, 0xFFFFFF] i zawiera wyłącznie wejścia "statyczne", nie ma tam natomiast elementów "aktywnych", jak przezroczysty, negacyjny, czy alpha-channel w różnych odmianach; tylko kolory od czarnego do białego włącznie.
Inną z właściwości DC jest background mixing mode. Żeby to zrozumieć najpierw wyjaśnijmy sobie, że w tym przypadku termin "tło" oznacza bitmapę, która jest "pod" aktualnie rysowanym obiektem, czyli ta, na której coś jest rysowane. Trzeba mieć też świadomośc tego, że w WinGDI, podczas rysowania tekstu, linii lub użycia brusha (pędzla, chociaż to niezbyt trafne tłumaczenie) rysuje właściwy element razem z otaczającym go prostokatem (tekst, brush) lub, w przypadku linii, razem z przerwami, gdy styl linii nie jest ustawiony na SOLID. Ten prostokąt i przerwy są także rysowane przy użyciu koloru tła bitmapy. A to oznacza, żę jeśli na bitmapie z białym jako kolorem tła narysujemy sobie czarny prostokącik 20x40px, a potem na nim narysujemy czarną literkę o wymiarach 20x40px, to niestety nie bedziemy mieli czarnego prostokacika, lecz czarną literkę na białym tle, bo prostokąt otaczający literę całkowicie przykryje poprzedni prostokąt. Jest jednak możliwość sprawienia, by wspomniane prostokąty i przerwy nie były rysowane. Służy temy właśnei BkMixingMode. Może przyjać dwie wartości - przezroczyste (Transparent) i nieprzezroczyste (Opaque /domyślne/). Jeśli będzie ustawiony na TRANSPARENT, to zostanie narysowany tylko sam element, podczas gdy tło wokół niego pozostanie nienaruszone. W GDI tą właściwość ustawiamy właśnie wspomnianą przez ciebie funkcją SetBkMode. I na tym skończę opowieść, nie będę sie zagłębiał w różne nietypowe aspekty jak peny tworzone funkcja CreatePenEx czy wartości niestatnadrodwe.
Jak widać - nie da się w ten sposób zrobić przezroczystego okna.
I tak naprawdę wogóle nie da się zrobić przeroczystego okna - można co najwyżej sprawić, by w danym punkcie było niewidoczne, ALE TO NIE JEST TO SAMO CO PRZEZROCZYSTOŚĆ - jego tam nie ma, a nie jest przezroczyste. Robi się to ustalając regiony dla danego okna.
Od tego co powiedziałem jest jeden wyjątek - w WinXP da się zrobić, by okno było półprzezroczyste, chyba nawet da się ustalić konkretną wartość przezroczystości. Jednak to nie rozwiąże naszego problemu, bo to wywołuje przezroczystość dla całego okna... a przecież musimy widzieć tekst...
Pozostają chyba tylko dwie możliwości - nieużywanie kontrolek lub użycie regionów.
---
Anonim: następnym razem umieć nowy temat na forum. A to, o co pytasz, robi się właśnie regionami.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-10-2004 14:40
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Do Anonima - wrzuć na Formę Shape a formę ustaw na niewidoczną.

Hmmm funkcja SetBKMode działa dla formy i staje się niwidoczna - widać pulpit a kontrolki umieszczone na nie nadal są widoczne.

Nic z tego nie rozumiem


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

29-10-2004 16:10
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Hmm.. pokaż mi kod, którego używasz.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-10-2004 16:36
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Option Explicit


Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const WS_EX_TRANSPARENT = &H20&
Private Const GWL_EXSTYLE = (-20)
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const SWP_FRAMECHANGED = &H20
Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Const Transparent = 1
Private Declare Function InvalidateRectLong Lib "user32" Alias "InvalidateRect" (ByVal hwnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long


Public Sub MakeTransparent(ByVal hwnd As Long)

Dim lExStyle As Long

lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE)
lExStyle = lExStyle Or WS_EX_TRANSPARENT

Call SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle)
Call SetBkMode(GetDC(hwnd), Transparent)
Call SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE + SWP_FRAMECHANGED)
Call InvalidateRectLong(hwnd, vbNull, True)

End Sub

Private Sub Command1_Click()
MakeTransparent (Me.hwnd)
End Sub




Wrzuć na formę Buttona


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

29-10-2004 18:39
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Działa, ale:
1) Za znikanie formy odpowiada ten fragment:
lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE)
lExStyle = lExStyle Or WS_EX_TRANSPARENT   

Call SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle

nie SetBkMode - możesz dać znak komentarza przed SetBkMode - zobaczysz, że nic się nie zmieni.

2) Tobie potrzebny jest sposób na usunięcie fragmentu okna option-box'a, a nie całego okienka łącznie z napisem i kółeczkiem .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-10-2004 19:31
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Chyba zrobię to za pomocą regionów bo innej możliwości nie widzę a szkoda.

Problem w tym że gdy np. usunę tło w OptionBox to wartość Value zmieni się tylko wtedy gdy kliknę we wnętrze kółka albo w piksel tworzacy tekst.

No można też usunąć całkowicie tekst i wstawić dodatkowego Labela (te mają właściwość BackStyle )

[Post edytowany dnia 29-10-2004 20:16 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

29-10-2004 20:15
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Ewentualnie możesz.. sam rysować tego option-boxa lub zrobić własnego TabStripa...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-10-2004 20:28
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Oryginalny Tabstrip mi pasuje takze ta opcja odpada


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

29-10-2004 23:58
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Wszystkich odpowiedzi: 21 :: Maxymalnie na stronę: 20
Strona: [  << <   1 2   > >>  ]  z  2