Törmäsin tuollaiseen "Love Hina desktop mascot":n ja sattui olemaan tylsä ilta, joten ajattelin tehdä oman vastaavan :)
Luo WinAPIa käyttäen ikkunan, piirtää siihen kuvan ja pitää tuon ikkunan aktiivisen ikkunan päällä. Ks. http://pp.kpnet.fi/blaze/temp/mascot.png
Käyttää layeröityä ikkunaa, joten vaatii Windows 2000:n tai uudemman.
Binääri: http://pp.kpnet.fi/blaze/temp/mascot.zip
Option Explicit
'Vakiot
'RegisterClass
Private Const CS_HREDRAW As Long = &H2&
Private Const CS_VREDRAW As Long = &H1&
'CreateWindow
Private Const WS_POPUP As Long = &H80000000
Private Const WS_VISIBLE As Long = &H10000000
'CreateWindowEx
Private Const WS_EX_LAYERED As Long = &H80000
Private Const WS_EX_TOOLWINDOW As Long = &H80&
Private Const WS_EX_TOPMOST As Long = &H8&
Private Const WS_EX_TRANSPARENT As Long = &H20&
'Viestit
Private Const WM_PAINT As Long = &HF&
'LoadImage
Private Const IMAGE_BITMAP As Long = 0&
Private Const LR_LOADFROMFILE As Long = &H10&
'SetLayeredWindowAttributes
Private Const LWA_COLORKEY As Long = &H1
'Tyypit
Private Type WNDCLASSEX
cbSize As Long
style As Long
lpfnWndProc As Long
cbClsExtra As Long
cbWndExtra As Long
hInstance As Long
hIcon As Long
hCursor As Long
hbrBackground As Long
lpszMenuName As String
lpszClassName As String
hIconSm As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type MSG
hwnd As Long
Message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type BITMAPFILEHEADER
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOhFileBits As Long
End Type
'Declaret
Private Declare Function RegisterClassEx Lib "user32.dll" Alias "RegisterClassExA" (ByRef pcWndClassEx As WNDCLASSEX) As Integer
Private Declare Function UnregisterClass Lib "user32.dll" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long
Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function MoveWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, ByRef lpRect As RECT) As Long
Private Declare Function GetMessage Lib "user32.dll" Alias "GetMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Private Declare Function TranslateMessage Lib "user32.dll" (ByRef lpMsg As MSG) As Long
Private Declare Function DispatchMessage Lib "user32.dll" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Long
Private Declare Function LoadImage Lib "user32.dll" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
'Muuttujat
Dim BitmapWidth As Long 'Bittikartan leveys
Dim BitmapHeight As Long 'Bittikartan korkeus
Dim BitmapFile As String 'Bittikartan tiedostonimi (& polku)
Dim MascotWindowHandle As Long 'Kahva luotuun ikkunaan
Dim MascotWindowDC As Long 'Ikkunan device context
Dim BitmapHandle As Long 'Kahva bittikarttaan
Dim MemoryDC As Long 'Device context bittikartalle
Dim WindowLocation As RECT 'Aktiivisen ikkunan sijainti
Private Sub Main()
Dim Message As MSG
Dim FileHeader As BITMAPFILEHEADER
Dim InfoHeader As BITMAPINFOHEADER
'Asetetaan bittikartan polku
BitmapFile = App.Path & "\suzuna.bmp"
'Luetaan bittikartan headerit, joista saadaan selville sen koko
Open BitmapFile For Binary Access Read As #1
Get #1, , FileHeader
Get #1, , InfoHeader
Close #1
BitmapWidth = InfoHeader.biWidth
BitmapHeight = InfoHeader.biHeight
'Yritetään rekisteröidä ikkunan luokka
If Not RegisterWindowClass Then
MsgBox "Failed to register window class", vbCritical
Terminate
End If
'Yritetään luoda ikkuna
If Not CreateMascotWindow Then
MsgBox "Failed to create the window", vbCritical
Terminate
End If
'Tehdään magentasta (255, 0, 255) läpinäkyvä väri
Call SetLayeredWindowAttributes(MascotWindowHandle, RGB(255, 0, 255), 255&, LWA_COLORKEY)
'Otetaan selville vastaluodun ikkunan device context
MascotWindowDC = GetWindowDC(MascotWindowHandle)
'Yritetään ladata bittikartta
If Not LoadBitmap Then
MsgBox "Failed to load " & BitmapFile, vbCritical
Terminate
End If
'Luodaan muistiin device context, johon bittikartta voidaan valita
MemoryDC = CreateCompatibleDC(ByVal 0&)
If SelectObject(MemoryDC, BitmapHandle) = 0 Then
MsgBox "Failed to select bitmap to memory DC", vbCritical
Terminate
End If
'Luodaan ajastin
Call SetTimer(MascotWindowHandle, 1&, 75&, AddressOf TimerProc)
'Message looppi pyörii niin kauan, kuin aiemmin luotu ikkuna on olemassa (=koko ohjelman päälläolon ajan)
Do While 0 <> GetMessage(Message, 0&, 0&, 0&)
Call TranslateMessage(Message)
Call DispatchMessage(Message)
DoEvents
Loop
End
End Sub
'Tuhoaa kaikken muistissa olevan tavaran ja sulkee ohjelman
Private Sub Terminate()
'Tuhotaan muistissa oleva DC
Call DeleteDC(MemoryDC)
'Tuhotaan bittikartta
Call DeleteObject(BitmapHandle)
'Tuhotaan ajastin
Call KillTimer(MascotWindowHandle, 1&)
'Tuhotaan ikkuna
Call DestroyWindow(MascotWindowHandle)
'Poistetaan ikkunaluokan rekisteröinti
Call UnregisterClass("mascotwindow", App.hInstance)
'Lopetetaan ohjelma
End
End Sub
'Rekisteröi luokan "mascotwindow"
Private Function RegisterWindowClass() As Boolean
Dim ClsDescriptor As WNDCLASSEX
'Täytetään structi
With ClsDescriptor
.cbSize = Len(ClsDescriptor)
.style = CS_HREDRAW + CS_VREDRAW
.hInstance = App.hInstance
'VB ei hyväksy tähän suoraan tuota AddressOfia, vaan se pitää kierrättää funktion kautta
.lpfnWndProc = ReturnParam(AddressOf WindowProc)
.lpszClassName = "mascotwindow"
End With
'Suoritetaan rekisteröinti ja palautetaan true tai false
RegisterWindowClass = (RegisterClassEx(ClsDescriptor) <> 0&)
End Function
'Luo ikkunan, jossa "maskotti" näytetään
Private Function CreateMascotWindow() As Boolean
'Luodaan layeroitu, reunaton, otsikkopalkiton, läpinäkyvä ikkuna luokkaa "mascotwindow"
'Kooksi laitetaan bittikartan koko ja ikkuna asetetaan piiloon ruudun ulkopuolelle
MascotWindowHandle = CreateWindowEx(WS_EX_LAYERED Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST Or WS_EX_TRANSPARENT, "mascotwindow", "Mascot", WS_VISIBLE Or WS_POPUP, -BitmapWidth, -BitmapHeight, BitmapWidth, BitmapHeight, 0&, 0&, App.hInstance, ByVal 0&)
'Palautetaan true tai false
CreateMascotWindow = (MascotWindowHandle <> 0&)
End Function
'Lataa bittikartan muistiin
Private Function LoadBitmap() As Boolean
BitmapHandle = LoadImage(ByVal 0&, BitmapFile, IMAGE_BITMAP, BitmapWidth, BitmapHeight, LR_LOADFROMFILE)
LoadBitmap = (BitmapHandle <> 0&)
End Function
'Palauttaa parametriksi annetun arvon. Käytetään ohittamaan VB:n bugi (ks. yllä)
Private Function ReturnParam(Param As Long) As Long
ReturnParam = Param
End Function
'WindowProc -callback funktio
'Windows kutsuu tätä aina, kun ikkunallemme tapahtuu jotain oleellista
Public Function WindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'Otetaan selvää, minkä viestin Windows lähetti
Select Case wMsg
Case WM_PAINT
'WM_PAINT käskee ikkunaa (uudelleen)piirtämään itsensä, joten teemme työtä käskettyä ja piirrämme bittikartan ikkunaan
Call BitBlt(MascotWindowDC, 0&, 0&, BitmapWidth, BitmapHeight, MemoryDC, 0&, 0&, vbSrcCopy)
End Select
'Jotta kaikkia viestejä ei tarvitse itse käsitellä, ohjaamme käsittelyn oletusikkunaproseduurille
WindowProc = DefWindowProc(ByVal hwnd, ByVal wMsg, ByVal wParam, ByVal lParam)
End Function
'TimerProc callback-funktio
'Sub Mainissa luomamme ajastin kutsuu tätä 75 millisekunnin välein
Public Function TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long) As Long
Dim CursorLocation As POINTAPI
'Katsotaan, onko hiiren oikeaa nappia painettu viime kerran jälkeen
If GetAsyncKeyState(vbKeyRButton) <> 0& Then
'Jos on, niin katsomme, onko kursori ikkunamme kohdalla, ja mikäli näin on, kysymme, haluaako käyttäjä lopettaa ohjelman
Call GetCursorPos(CursorLocation)
If CursorLocation.x > WindowLocation.Left + CLng(0.9 * (WindowLocation.Right - WindowLocation.Left - BitmapWidth)) _
And CursorLocation.x < WindowLocation.Left + CLng(0.9 * (WindowLocation.Right - WindowLocation.Left - BitmapWidth)) + BitmapWidth _
And CursorLocation.y > WindowLocation.Top - BitmapHeight _
And CursorLocation.y < WindowLocation.Top Then
If MsgBox("Wanna quit?", vbQuestion + vbYesNo) = vbYes Then Terminate
End If
End If
'Otetaan selville aktiivisen ikkunan paikka
Call GetWindowRect(GetForegroundWindow, WindowLocation)
'Siirretään maskotti-ikkunamme istumaan tuon aktiivisen ikkunan päälle
Call MoveWindow(MascotWindowHandle, WindowLocation.Left + CLng(0.9 * (WindowLocation.Right - WindowLocation.Left - BitmapWidth)), WindowLocation.Top - BitmapHeight, BitmapWidth, BitmapHeight, True)
End FunctionOvela on, heti hurahti wario maskotiksi :)
Ihan toimiva.
Toki aika tärkeä olisi tarkistaa että ohjelmia ei ole päällä kuin yksi kerrallaan. Itselläni kun ei sattunut olemaan ensin yhtään ikkunaa auki ja sitten painelin sitä exeä että nooh eikös se aukea. Olisi myös ihan kätevä jos ohjelman saisi jollain muullakin sammutettu kuin pakottamallla.
lainaus:
Toki aika tärkeä olisi tarkistaa että ohjelmia ei ole päällä kuin yksi kerrallaan.
Tuo olis muuten pätevä ominaisuus. Vois lisätä. Ellen nyt ihan väärin muista, niin täällä taisi olla tuohon oikein vinkkikin.
lainaus:
jos ohjelman saisi jollain muullakin sammutettu kuin pakottamallla.
Hiiren kakkosnappia siinä sen kuvan päällä. Kun jaksais, niin kehittelis jotain dokumentaatiota :)
Oon nähnyt sellaisia lammas -maskotteja, jotka kävelee ja syö ruohoo jne. ja sitten kun ottaa ikkunan pois alta niin se tippuu alapalkin tai toisen ikkunan päälle jne. ja se ei oo vain kiinnityksissä siihen yhteen ikkunaan.
Sellaisen kun väännät niin WAUUUUU!!!
Tuo oli hieman tylsä, mutta ihan OK.
tässä on linkki aderiden kertomaan lampaaseeen : http://website.lineone.net/~terrirob/games/
noita on kiva pistää monta ja kattoo ku ne riehuu... :)
onko love hina jotain hentaita
taitaa olla, latasin jonkun pätkän dc++lla heh
lainaus:
onko love hina jotain hentaita
Nimi ainakin kuulostaa vähän...
Aika turha ja rasittava juttu toi maskotti.
BlueByte, ei ole hentaita vaan animea... animen ja hentain ero on se, että hentai on k18 jos ymmärrät ;)
Ainakaan katsomani jaksot love hinasta eivät sitä sisältäneet.
mist sait ton esheepin se on tietääkseni sharevaree vai muistanko väärin
mist sait ton esheepin se on tietääkseni sharevaree vai muistanko väärin
eSheep toimii <win2000 ssakin joten voisiko joku tehdä sellaisen jutun? (siis joka toimisi myös susikasissa)
Ainoa, mikä tuossa 2k+:n vaatii on tuo SetLayeredWindowAttributes. Kehitä joku oma systeemi, jolla saat epäsäännöllisiä/läpinäkyviä/kivoja ikkunoita, käytä vaikka SetWindowRgn:ää, ja loppu toimii ihan samalla tavalla.
Ihan kiva, luulis kyllä että vähän vähempikin koodi riittäisi mutta ei kai sitten...
Ihan kiva...
Taas yks todiste, että XP on susi... ...Sain XP:n jumiin kun mätin niitä lampaita tarpeeks, ja meni kiintolevy formatointiin...
lainaus:
eSheep toimii <win2000 ssakin joten voisiko joku tehdä sellaisen jutun? (siis joka toimisi myös susikasissa)
toimii xp:ssäkin...
Minne toi pitäis niinku kopioida?
Moduuliin, Formiin, ei toimi kyllä mitenkään!
Moduuliin, ja projektin asetuksista Startup Objektiksi "Sub Main".
Mulla valittaa:
Failed to load C:/program files/Microsoft Visual Basic/suzuna.bmp
Mitä pitäis tehä ,kun laitoin koodin moduuliin ja määritin startup objektiksi: Sub Main?
suhteellisen pitkä
ja valle: tallenna jonnekin ja laita suzuna.bmp samaan kansioon, ei kai sinulla ole Visual Basicin kansiossa mitään bittikarttoja?
Ihan hauska koodi.
Muuten, jos haluutte jonku toisen kuvan, nii ladatkaa vaa toi mascot.zip ja sit poistakaa suzana.bmp ja laittakaa sinne kuva minkä haluutte ja nimeks suzana :D:D
( vinkki niille jotka ei jaksa koodaa omaa )
Tämä ei toimi... (win 98), mutta eSheep toimii!
gamehouse, voisit varmasti lukea noi jutut mitä alussa selostettiin.
Blaze kirjoitti:
Käyttää layeröityä ikkunaa, joten vaatii Windows 2000:n tai uudemman.
Tais olla aika tylsää ku tommosta väsäsit :) Kuitenkin todella hieno luomus
Aihe on jo aika vanha, joten et voi enää vastata siihen.