webForumDet fria alternativet

uppdrag åt wF:s VB-programmerare

15 svar · 693 visningar · startad av Nexus86

Nexus86Medlem sedan okt. 20023 030 inlägg
#1

Har gjort en kontroll som lägger till en ikon nere i systrayen. Vill att ni testar den av bara faan (ursäkta om jag svär ;)). Testa med allt möjligt. Håller på med dokumentationen nu. Som en bonus kan jag redan nu meddela att så fort dokumentationen är klar och kontrollen färdigtestad (beräknat datum: 1/7-03) så släpper jag koden till allmänheten. :)

Undrar ni över något eller hittar en bugg så säg till.

/r Ni kan även testa med andra ActiveX-stödjande språk. :)

/r2 Ni behöver inte testa den andra kontrollen vid namn TextXPStyle men ni får om ni vill. :)

Nexus86Medlem sedan okt. 20023 030 inlägg
#2

Dokumentationen är lite halvt klar. Ni kan se det som är klart här. Har iaf kommit så långt att allt som absolut behövs för att använda kontrollen står ganska klart och tydligt. :)

http://www.johanskold.host.sk/programmering/TrayIcon/Documentation/index.htm

Nexus86Medlem sedan okt. 20023 030 inlägg
#3

Kom på att det inte är särskilt mycket att komma med med bara en systray-kontroll. Därför skriver jag även ett citat ur dokumentationen jag håller på med (på engelska). :)

dokumentationen skrev:

Why use TrayIcon in addition to other controls?

In short, since the TrayIcon control is the best available! It has been tested for months and it has got plenty of easily used functions. Such as displaying balloon popups with different styles, receiving clicks from that balloon, support for Taskbar Creation Notification created by Microsoft which makes your icon visible at all times. Even if explorer.exe crashes! It also is multi operating system compatible. Many programmers forget that the structure of the type called NOTIFYICONDATA used for displaying the icon in the systray is defined different on each Windows version which means of course that the size of this structure differs from Windows to Windows. If size is wrong the icon may not display. So you should use this control not only for it's functionallity, but also for it's stability, easyness and security that guarantees that it will work on every single computer with Windows installed. And because it is Open Source every single programmer may change the code to fit his or her needs.

OBS: Observera att vid släppningsdatumet kommer det att vara flera månader. ;)

/r Funderar även på att göra en C++-klass av den. Men det blir inom en viss framtid. :)

nikoMedlem sedan juni 20022 599 inlägg
#4

Nu skulle jag väl ljuga om jag sa att jag hårdtestat men två saker:

1. Jag får inte ballongeventsen att funka (Win2k server). Stöds de bara på XP?
2. Kontrollen går inte att instansiera i MFC/C++. Felmeddelande:

Run-time error '-2147467262 (80004002)':

System Error &H80004002 (-2147467262). No such interface supported

Din gamla version från den här tråden funkar dock (TextXPStyle i den nya funkar också). Skumt .. (Väntar på källkoden.)

I övrigt funkade allt. AutoUpdate-property är väldigt användbar och dokumentationen var sällsynt tjusig och välskriven.

PS. Kontrollerna saknar en "About-property" i IDE:n, jag vet hur man gör det. DS.

Nexus86Medlem sedan okt. 20023 030 inlägg
#5

niko skrev:

PS. Kontrollerna saknar en "About-property" i IDE:n, jag vet hur man gör det. DS.

Sjung ut broder! :e Som sagt så har jag ju inte jobbat med kontroller förut. :)

1. Med ballongeventsen antar jag att du vet vad du pratar om och därför bara menar att eventsen inte fungerar men att du får fram en ballong. :) Det ska fungera på Shell 5.0+. D.v.s (lite krångligt för att göra det så svårförståerligt som möjligt ;))
Windows>=Win2k
Windows≠Win9x
Ska testa imorron på en annan maskin (om jag hittar någon med Win2k) och ska hitta rätt message! Jag har iaf lyckats få igång dom i både XP och Windows Server 2003 så det är inga problem. Men som sagt, ska testa 2000.

2. Tror jag vet varför också. Har sparat ikonen som en IPictureDisp och sådana är antagligen inte supportade i MFC/C++. Kan göra som jag gjorde i förra versionen, sparade ikonen som en Long istället och hade bara handlet men då måste man sätta ikonen i koden istället för i property viewern. Vilket är bäst tycker du? Stöd för C++ eller stöd för att ställa ikonen i property viewern?

r/

niko skrev:

TextXPStyle i den nya funkar också

' :o I WINDOWS 2000? Vääänta lite nu. Du kanske menar att den fungerar i C++ men inte att funktionerna fungerade (vilket dom inte ska göra)?

nikoMedlem sedan juni 20022 599 inlägg
#6

Sjung ut broder!

OK. Inte så himla svårt egentligen. Du lägger till en ny Public Sub, går upp i Tools->Procedure Attributes, väljer din sub i listan, trycker Advanced och anger AboutBox som ProcedureId. Och vips - Du har en Aboutproperty.

Har sparat ikonen som en IPictureDisp och sådana är antagligen inte supportade i MFC/C++.

OK. Det låter rimligt.

Vilket är bäst tycker du? Stöd för C++ eller stöd för att ställa ikonen i property viewern?

Vet inte, faktiskt. Det är ju rätt smidigt att kunna browsa fram ikonen, men det kanske går att lösa på nåt sätt i C++ (kan för lite).

Du kanske menar att den fungerar i C++ men inte att funktionerna fungerade

Ja, precis. Jag menade att den gick att placera på en dialogruta utan felmeddelandet ovan.

Nexus86Medlem sedan okt. 20023 030 inlägg
#7

niko skrev:

OK. Inte så himla svårt egentligen. Du lägger till en ny Public Sub, går upp i Tools->Procedure Attributes, väljer din sub i listan, trycker Advanced och anger AboutBox som ProcedureId. Och vips - Du har en Aboutproperty.

Man tackar! Fast det får räcka med en MsgBox där. Det är redan mycket kod att kommentera i dokumentationen. :)

niko skrev:

men det kanske går att lösa på nåt sätt i C++

Kan i-och-för-sig fråga i C++-forumet. Kanske någon som har en lösning där.

niko skrev:

Ja, precis. Jag menade att den gick att placera på en dialogruta utan felmeddelandet ovan.

*pust* Blev det mindre jobb för mig. Eftersom att funktionerna egentligen bara ska fungera på XP så hade jag haft ett himla jobb med att hitta vilket service pack som behövdes. :)

Nexus86Medlem sedan okt. 20023 030 inlägg
#8

Nu har jag testat lite på en Virtuell PC med Windows 2000 Professional och kommit fram till följande:

  • Windows 2000 har inga kryssrutor i sina ballongpopuper
  • Windows 2000 har inga events för ballongerna (Obs: HAR inga och inte att dom bara inte fungerar)
  • Hittade ett nytt event medan jag testade som jag genast ska lägga till: MouseMove :)
Nexus86Medlem sedan okt. 20023 030 inlägg
#9

Nu provade jag med att byta ut IPictureDisp mot en Long men det går iallafall inte. :l Samma fel fortfarande. Såg även att MFC skapade en CPicture-klass som motsvarar IPictureDisp när jag drog in kontrollen. Så det var inte det. Kan det vara UserControl.Parent som inte fungerar som det ska i MFC? Det kanske bara går i VB? Har ingen aning. niko, du som har koden, tror du att du kan komma på något annat som kan göra det felet?

nikoMedlem sedan juni 20022 599 inlägg
#10

Nej, jag kom till exakt samma slutsats som du: Det är UserControl.Parent som är problemet. Man kan ju misstänka att det har med late-binding att göra eftersom kontrollen inte vet vad den kommer att hamna på.

Fast du borde hyfsat enkelt kunna trixa dig runt med Windows-API:er: UserControl.Parent.hwnd är ju lätt fixat med GetParent och UserControl.Parent.Caption med GetParent+GetWindowText.

UserControl.Parent.Icon är nog värre och det kan jag inte på rak arm, men du brukar ju vara rätt bra på att själv snoka reda på kod. (I värsta fall kan du ju bara lägga till en felhantering och helt enkelt låta defaulttilldelningen av ikonen fungera bara i VB-miljön)?

Nexus86Medlem sedan okt. 20023 030 inlägg
#11

Japp. Använde GetParent först innan jag såg att UserControl.Parent fanns. :)

Ikonen går väl alltid att få reda på med hjälp av en bakvänd CreateWindow eller nåt? Alltså som man gör med CreateWindow fast på något bakvänt sätt så man får handlet till ikonen. Det enda jobbiga då blir att omvandla handlet till en IPictureDisp. :l

I värsta fall-tillämningen kan man ju alltid ha som nödlösning.

Nexus86Medlem sedan okt. 20023 030 inlägg
#12

Har hittat kod till att få handlet till en ikon men vet inte hur jag ska göra om handlet till en IPIctureDisp. :l Några ideer?

http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=15005&lngWId=1

nikoMedlem sedan juni 20022 599 inlägg
#13

Hur är din tyska? Via lite snirklande över LoadIcon och OleCreatePictureIndirect så hamnade jag här. Det kan vara en återvändsgränd men på nåt sätt "känns" det lite rätt. Jag vet inte exakt hur IPicture förhåller sig till IPictureDisp, men på MSDN stod det så här:

A picture object is created with OleCreatePictureIndirect and supports both the IPicture and the IPictureDisp interfaces.

.. vad det nu exakt innebär ..?

(Du borde kunna köra direkt på IconToPicture utan att använda LoadIcon i exemplet eftersom du ju redan har handtaget.)

Nexus86Medlem sedan okt. 20023 030 inlägg
#14

Hur är din tyska?

Lite halvdassig. ;)

Tjae. Kan ju alltid testa litegranna. Lär ju ta ett tag att hitta rätt men det är det (nog ;)) värt om jag lyckas. :)

Nexus86Medlem sedan okt. 20023 030 inlägg
#15

niko skrev:

Jag vet inte exakt hur IPicture förhåller sig till IPictureDisp

Tjae. Skillnaderna är väl en sådär 7 funktioner/egenskaper men det viktiga är att IPicture och IPictureDisp är kompatibla med varandra.

Tack!

Nexus86Medlem sedan okt. 20023 030 inlägg
#16

Nu äntligen har jag kommit på att jag inte kan använda GetParent istället för UserControl.Parent. Om man använder det inom VB så blir handlet till fel fönster och inom MFC har jag inte testat. :l Det får bli som innan. Plus en specialversion som klarar MFC.

134 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)