Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora la solita BMP

Ecco il codice per far caricare questa stramaledetta BMP:
Const SRCCOPY = &HCC0020 '(DWORD) dest = source
Private Type POINTAPI
    X As Integer
    Y As Integer
End Type
Private Type BITMAP
    bmType As Integer
    bmWidth As Integer
    bmHeight As Integer
    bmWidthBytes As Integer
    bmPlanes As String * 1
    bmBitsPixel As String * 1
    bmBits As Long
End Type
Private Type WNDCLASS
    style As Integer
    lpfnWndProc As Long 'Note: address of function here
    cbClsExtra As Integer
    cbWndExtra As Integer
    hInstance As Integer
    hIcon As Integer
    hCursor As Integer
    hbrBackground As Integer
    lpszMenuName As Long    'Resource ID or far pointer to name
    lpszClassName As Long   'Far pointer to name
End Type
Private Declare Function BitBlt% Lib "GDI32" (ByVal hDestDC%, ByVal X%,
ByVal Y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal
YSrc%, ByVal dwRop&)
Private Declare Function CreateCompatibleDC% Lib "GDI32" (ByVal hdc%)
Private Declare Function GetObjectAPI% Lib "GDI32" Alias "GetObjectA" (ByVal
hObject%, ByVal ncount%, ByVal lpObject&)
Private Declare Function SelectObject% Lib "GDI32" (ByVal hdc%, ByVal
hObject%)
Private Declare Function SetMapMode% Lib "GDI32" (ByVal hdc%, ByVal
nMapMode%)
Private Declare Function DPtoLP% Lib "GDI32" (ByVal hdc%, lpPoints As
POINTAPI, ByVal ncount%)
Private Declare Function DeleteDC% Lib "GDI32" (ByVal hdc%)
Private Declare Function GetMapMode% Lib "GDI32" (ByVal hdc%)
Private Declare Function SizeofResource% Lib "Kernel32" (ByVal hInstance%,
ByVal hResInfo%)
Private Declare Function GetDC% Lib "User32" (ByVal hwnd%)
Private Declare Function LoadBitmap% Lib "User32" Alias "LoadBitmapA" (ByVal
hInstance%, ByVal lpBitmapName As Any)
Private Declare Function LoadBitmapBystring% Lib "User32" Alias
"LoadBitmapA" (ByVal hInstance%, ByVal lpBitmapName$)
Private Sub Command1_Click()
Dim hwnd As Integer
    Dim r As Integer
    Dim hObject As Integer
    Dim hdcMem As Integer
    Dim hdc As Integer
    Dim hInst As Integer
    Dim Poub As Integer
    Dim bm As BITMAP
    Dim ncount As Integer
    Dim ptSize As POINTAPI
    Dim ptOrg As POINTAPI
    hdc = GetDC%(hwnd)
    hdcMem = CreateCompatibleDC%(hdc)
    'r% = hdcMem
    'MsgBox "le hdc est :" & r%, ebOKonly, "titre"
    hInst = 1
    'hObject% = 2
    'hObject% = LoadBitmapBystring%(hInst, "c:\windows\gattino.bmp")
    hObject% = LoadBitmap%(hInst, "c:\windows\gattino.bmp")
    'r% = hInst
    'MsgBox hObject%
    'MsgBox "le hinst est :" & r%, ebOKonly, "titre"
    'r% = hObject%
    'MsgBox "le hobject est :" & r%, ebOKonly, "titre"
    Poub = SelectObject%(hdcMem, hObject%)
    Poub = SetMapMode%(hdcMem, GetMapMode(hdc))
    Poub = GetObjectAPI%(hObject%, 19, hObject%)
    'ptSize.X = bm.bmWidth
    ' ptSize.Y = bm.bmHeight
    ptSize.X = 450
    ptSize.Y = 400
    'r% = ptSize.X
    'MsgBox "le ptSize est :" & r%, ebOKonly, "titre"
    Poub = DPtoLP%(hdc, ptSize, 1)
    ptOrg.X = 150
    ptOrg.Y = 160
    Poub = DPtoLP%(hdcMem, ptOrg, 1)
    Poub = BitBlt%(hdc, 110, 110, ptSize.X, ptSize.Y, hdcMem, ptOrg.X,
ptOrg.Y, SRCCOPY)
    Poub = DeleteDC%(hdcMem)
End Sub
purtroppo non funziona...e non so perche'...qualcuno me la sa correggere e
far funzionare (lo scopo era quello di ottenere una immagine BMP non
utilizzando la solita interfaccia VB....nel mio caso ho a disposizione un
solo ambientino di sviluppo (powerVB) integrato in un particolare software).
Grazie a tutti.

Provala con VB. Se con VB funziona (dubito... le dichiarazioni continui a
farle come integer) vuol dire che con l'ambiente di sviluppo che usi non
puoi usare la stessa sintassi del VB.
Fabio Guerrazzi

dunque, ho provato a dare un occhio al tuo codice... e devo dire che è un
bel casino... non prendertela...  di errori ce ne sono molti, vediamone
alcuni:
1) il progetto sembrerebbe essere fatto per girare sotto win32 con VB4-32 o
VB5 oppure VB6; in questi casi ricordati che tutti gli 'int' del C vanno
implementati come 'Long' dal lato VB (e quindi anche tutti gli eventuali %
vanno trasformati in &)
2) non hai impostato alcun valore in 'hwnd'.... se hwnd vale 0 Windows ti
restituisce l'handle della finestra del desktop... col risultato che rischi
di andare a sporcare in giro (shell permettendo...) invece che disegnare
finestra dell'applicazione
3) idem per la variabile 'hinst' che dovrebbe essere impostata con l'handle
della istanza attuale del programma (in altre parole App.hInstance)
4) LoadBitmap è una funzione che carica una bitmap che fa parte delle
risorse del programma (o di Windows) e non è in grado di caricare una bitmap
da file; per tale scopo esiste la funzione LoadImage
5) l'utilizzo di GetDC è ok, ma allo stesso tempo inutile: ogni form VB (e
anche ogni picturebox) mette a disposizione il suo HDC come proprietà
6) attenzione alla chiamata a GetObjectAPI: è una vera fortuna (si fa per
dire...) che a qual punto il programma trovasse un hObject non valido; in
caso contrario avresti molto probabilmente ottenuto un bel "GP Fault" o
qualcosa di simile; il terzo parametro di tale funzione è un puntatore ad
un'area di memoria... invece nel codice viene passato il valore di un intero
(che se venisse interpretato come un indirizzo ... creerebbe sicuramente
qualche scompenso a Windows)
non ho poi ben capito che cosa volevi ottenere con le varie chiamate a
SetMapMode (che per quanto ne so in questo caso dovrebbe essere anche
inutile... ma non ci metterei la mano sul fuoco) e DPtoLP... boh? al limite
postami un altro msg per ulteriori chiarimenti
come vedi le inesattezze erano molte e non da poco conto; cmq su con la
vita... sbagliando si impara
eccoti cmq un codice che funziona (a patto di avere il file
C:\Windows\Bosco.bmp...), dagli un occhio:
'---------------------------------------------------------------
Option Explicit
Private Const IMAGE_BITMAP As Long = 0
Private Const LR_LOADFROMFILE As Long = &H10
Private Const SRCCOPY As Long = &HCC0020
Private Type BITMAP
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type
Private Declare Function LoadImage Lib "user32" 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 GetObject Lib "gdi32" Alias "GetObjectA" _
    (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" _
    (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" _
    (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" _
    (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 DeleteDC Lib "gdi32" _
    (ByVal hdc As Long) As Long
Private Sub Form_Paint()
    Const strBitmap As String = "C:\Windows\Bosco.bmp"
    Dim hBitmap As Long
    Dim bm As BITMAP
    Dim hdcTarget As Long
    Dim hdcMem As Long
    Dim hOld As Long
    hBitmap = LoadImage(App.hInstance, strBitmap, _
        IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
    GetObject hBitmap, Len(bm), bm
    hdcTarget = Me.hdc
    hdcMem = CreateCompatibleDC(hdcTarget)
    hOld = SelectObject(hdcMem, hBitmap)
    BitBlt hdcTarget, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY
    SelectObject hdcMem, hOld
    DeleteDC hdcMem
End Sub
'---------------------------------------------------------------
un ultima cosa prima di chiudere: invece di impazzire dietro un mare di API
prova il seguente codice in VB
'---------------------------------------------------------------
Option Explicit
Private m_pic As StdPicture
Private Sub Form_Load()
    Const strBitmap As String = "C:\Windows\Bosco.bmp"
    Set m_pic = LoadPicture(strBitmap)
End Sub
Private Sub Form_Paint()
    Me.PaintPicture m_pic, 0, 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Set m_pic = Nothing
End Sub
'---------------------------------------------------------------
fa esattamente la stessa cosa con un decimo di righe di codice (e non è
nemmeno molto più lento...)
ciao
