Newsgroup: it.comp.lang.visual-basic
Titolo: [BS] Barra tipo Office o MDI "globale"?

Bene, come vi annunciavo nella precedente proposta di brainstorming,
sto ristrutturando tutti i miei applicativi in vista della
distribuzione come "unico" pacchetto di grosse dimensioni che si
appoggia su un database centrale. Ho quasi terminato di prendere le
decisioni sulle tabelle del database e oggi pomeriggio dovrei crearle
per metterci dentro i primi dati.
Questo pacchetto sara', appunto, composto di vari applicativi, che,
durante il setup, potranno essere o meno installati, a seconda dei
posti di lavoro e di quel che dovranno fare gli utenti. Analogamente
ad un utente che potrebbe installare Word ma non Access, un mio utente
potrebbe installare il programma per gli ordini a fornitori ma non gli
applicativi per i libretti uso e manutenzione.
La mia idea sarebbe, per essere comodo a chiamarli, di preparare una
barra di lancio in stile simile a quella di Office.
Per sapere cosa e' installato nel sistema, leggo un po' di chiavi nel
registro e disegno runtime tanti pulsanti quanti me ne servono per
assegnarne uno ad ogni applicativo.
Le caption dei pulsanti le leggo sempre dal registro.
Le icone per i pulsanti, pensavo di includerle nei singoli eseguibili
degli applicativi. Pero' e' possibile estrarre un'icona da un
eseguibile ed usarla per un pulsante? Ho imparato, grazie a voi, come
si includono delle icone in un eseguibile --con un file di risorse-- e
ho capito --ed usato-- il modo di usarle per associarle ad
un'estensione registrata. Pero' posso estrarle da un eseguibile per
metterle su un pulsante?
O, in alternativa, vi vengono in mente idee piu' furbe per gestire la
cosa?
Al solito, vi ringrazio in anticipo.
Capisco che siano domande non molto impegnative e/o poco interessanti,
ma almeno non sono le solite cose :)
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD

metterle su un pulsante?
Altroche'.
Ti allego una classe della versione vb del mio IconThief, 
che "ruba" le icone agli eseguibili.
Il programma completo mostrava tutte le icone di contenute in un qualsiasi file
che venisse trascinato sopra la sua finestra e permetteva di trascinare fuori
le icone desiderate producendo un nuovo file .ico.
Vediti i parametri di ExtractIcon, perche' probabilmente a te
interessa estrarre solo la prima, mentre il programma le carpiva tutte.
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "CIconThief"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
'// shared members
Private mTotalIcons As Long
Private mFilename As String
'// API calls
Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" ( _
                        ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
Private Declare Function DrawIcon Lib "user32" ( _
                        ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long
'// ======================================================
Public Property Get TotalIcons() As Long
  TotalIcons = mTotalIcons
End Property
Public Function ExtractFrom(ByVal a_FileName As String) As Boolean
  mFilename = a_FileName
  mTotalIcons = ExtractIcon(App.hInstance, a_FileName, -1)
  ExtractFrom = (mTotalIcons > 0)
End Function
Public Function Draw(ByVal a_hdcDest As Long, ByVal a_PixelX As Long, ByVal a_PixelY As Long, ByVal a_IconIndex As Long) As Boolean
  Dim mi_hIcon As Long
  If a_hdcDest Then
    If a_IconIndex > -1 Then
      If a_IconIndex < mTotalIcons Then
        mi_hIcon = ExtractIcon(App.hInstance, mFilename, a_IconIndex)
        If mi_hIcon Then
          If DrawIcon(a_hdcDest, a_PixelX, a_PixelY, mi_hIcon) Then
            Draw = True
          End If
          Call DestroyIcon(mi_hIcon)
        End If
      End If
    End If
  End If
End Function
hth
Ciao
Aldo

Altroche'.
Grazie di tutto quanto. Ora taglio e incollo il tuo codice e domani lo
provo --per stanotte basta programmare... ho gia' speso 4 ore a
sistemare i roaming profiles dei miei utenti in nt...--


Non ho capito dove sarebbe il BrainStorming?
A dire la verita', il brainstorming stava nel fatto che avevo trovato
altre 2 alternative alla barra tipo Office, ma poi mi sono reso conto
che questa era la migliore e ho tagliato il resto del post, ma ho
dimenticato di modificare il subject. Scusatemi :)
