TN024: risorse e messaggi definiti da MFC
Nota
La seguente nota tecnica non è stata aggiornata da quando è stata inclusa per la prima volta nella documentazione online. Di conseguenza, alcune procedure e argomenti potrebbero essere non aggiornati o errati. Per le informazioni più recenti, è consigliabile cercare l'argomento di interesse nell'indice della documentazione online.
Questa nota descrive i messaggi di Windows interni e i formati di risorse usati da MFC. Queste informazioni illustrano l'implementazione del framework e consentono di eseguire il debug dell'applicazione. Per l'avventura, anche se tutte queste informazioni sono ufficialmente non supportate, è possibile usare alcune di queste informazioni per le implementazioni avanzate.
Questa nota contiene i dettagli dell'implementazione privata MFC; tutti i contenuti sono soggetti a modifiche in futuro. I messaggi di Windows privati MFC hanno un significato nell'ambito di un'unica applicazione, ma cambieranno in futuro in modo da contenere messaggi a livello di sistema.
L'intervallo di messaggi e tipi di risorse di Windows privati MFC si trova nell'intervallo riservato di "sistema" messo da parte da Microsoft Windows. Attualmente non vengono usati tutti i numeri negli intervalli e, in futuro, potrebbero essere usati nuovi numeri nell'intervallo. I numeri attualmente utilizzati possono essere modificati.
I messaggi di Windows privati MFC si trovano nell'intervallo 0x360-0x37F>.
I tipi di risorse private MFC si trovano nell'intervallo 0xF0-0xFF>.
Messaggi di Windows privati MFC
Questi messaggi di Windows vengono usati al posto di funzioni virtuali C++ in cui è necessario un accoppiamento relativamente libero tra gli oggetti finestra e dove una funzione virtuale C++ non sarebbe appropriata.
Questi messaggi privati di Windows e le strutture di parametri associate vengono dichiarati nell'intestazione privata MFC 'AFXPRIV. H'. Si avvisa che qualsiasi codice che include questa intestazione potrebbe basarsi su un comportamento non documentato e probabilmente si interromperà nelle versioni future di MFC.
Nel raro caso in cui sia necessario gestire uno di questi messaggi, è consigliabile usare la macro della mappa dei messaggi ON_MESSAGE e gestire il messaggio nel formato LRESULT/WPARAM/LPARAM generico.
WM_QUERYAFXWNDPROC
Questo messaggio viene inviato a una finestra che viene creata. Questo viene inviato molto presto nel processo di creazione come metodo per determinare se WndProc è AfxWndProc. AfxWndProc restituisce 1.
Parametri e valore restituito | Descrizione |
---|---|
wParam | Non usato |
lParam | Non usato |
restituisce | 1 se elaborato da AfxWndProc |
WM_SIZEPARENT
Questo messaggio viene inviato da una finestra cornice ai relativi elementi figlio immediati durante il ridimensionamento (CFrameWnd::OnSize
chiamate CFrameWnd::RecalcLayout
che chiama CWnd::RepositionBars
) per riposizionare le barre di controllo intorno al lato del frame. La struttura AFX_SIZEPARENTPARAMS contiene il rettangolo client corrente disponibile dell'elemento padre e una piattaforma HDWP (che può essere NULL) con cui chiamare DeferWindowPos
per ridurre al minimo la riproduzione.
Parametri e valore restituito | Descrizione |
---|---|
wParam | Non usato |
lParam | Indirizzo di una struttura AFX_SIZEPARENTPARAMS |
restituisce | Non usato (0) |
Ignorando il messaggio viene indicato che la finestra non partecipa al layout.
WM_edizione Standard TMESSAGESTRING
Questo messaggio viene inviato a una finestra cornice per chiedere di aggiornare la riga del messaggio nella barra di stato. È possibile specificare un ID stringa o un LPCSTR (ma non entrambi).
Parametri e valore restituito | Descrizione |
---|---|
wParam | ID stringa (o zero) |
lParam | LPCSTR per la stringa (o NULL) |
restituisce | Non usato (0) |
WM_IDLEUPDATECMDUI
Questo messaggio viene inviato in tempo di inattività per implementare l'aggiornamento inattiva dei gestori dell'interfaccia utente di update-command. Se la finestra (in genere una barra di controllo) gestisce il messaggio, crea un CCmdUI
oggetto (o un oggetto di una classe derivata) e chiama CCmdUI::DoUpdate
ognuno degli "elementi" nella finestra. Verrà a sua volta verificata la presenza di un gestore ON_UPDATE_COMMAND_UI per gli oggetti nella catena del gestore dei comandi.
Parametri e valore restituito | Descrizione |
---|---|
wParam | BOOL bDisableIfNoHandler |
lParam | Non usato (0) |
restituisce | Non usato (0) |
bDisableIfNoHandler è diverso da zero per disabilitare l'oggetto dell'interfaccia utente se non è presente né un ON_UPDATE_COMMAND_UI né un gestore ON_COMMAND.
WM_EXITHELPMODE
Questo messaggio viene inviato a un CFrameWnd
oggetto che per uscire dalla modalità guida sensibile al contesto. La ricezione di questo messaggio termina il ciclo modale avviato da CFrameWnd::OnContextHelp
.
Parametro e valore restituito | Descrizione |
---|---|
wParam | Non usato (0) |
lParam | Non usato (0) |
restituisce | Non usato |
WM_INITIALUPDATE
Questo messaggio viene inviato dal modello di documento a tutti i discendenti di una finestra cornice quando è sicuro per eseguire l'aggiornamento iniziale. Esegue il mapping a una chiamata a CView::OnInitialUpdate
, ma può essere usato in altre CWnd
classi derivate per l'aggiornamento di un'altra operazione.
Parametri e valore restituito | Descrizione |
---|---|
wParam | Non usato (0) |
lParam | Non usato (0) |
restituisce | Non usato (0) |
WM_RECALCPARENT
Questo messaggio viene inviato da una visualizzazione alla relativa finestra padre (ottenuta tramite GetParent
) per forzare un ricalcolo del layout (in genere, l'elemento padre chiamerà RecalcLayout
). Questa operazione viene usata nelle applicazioni server OLE in cui è necessario che il frame cresca di dimensioni man mano che le dimensioni totali della vista aumentano.
Se la finestra padre elabora questo messaggio, restituisce TRUE e riempie il RECT passato in lParam con le nuove dimensioni dell'area client. Viene usato in CScrollView
per gestire correttamente le barre di scorrimento (posizionare quindi all'esterno della finestra quando vengono aggiunte) quando un oggetto server è attivato sul posto.
Parametri e valore restituito | Descrizione |
---|---|
wParam | Non usato (0) |
lParam | LPRECT rectClient, può essere NULL |
restituisce | TRUE se viene restituito un nuovo rettangolo client, FAL edizione Standard in caso contrario |
WM_SIZECHILD
Questo messaggio viene inviato dalla COleResizeBar
finestra del proprietario (tramite GetOwner
) quando l'utente ridimensiona la barra di ridimensionamento con gli handle di ridimensionamento. COleIPFrameWnd
risponde a questo messaggio tentando di riposizionare la finestra cornice come richiesto dall'utente.
Il nuovo rettangolo, specificato nelle coordinate client rispetto alla finestra cornice che contiene la barra di ridimensionamento, punta a lParam.
Parametri e valore restituito | Descrizione |
---|---|
wParam | Non usato (0) |
lParam | LPRECT rectNew |
restituisce | Non usato (0) |
WM_DISABLEMODAL
Questo messaggio viene inviato a tutte le finestre popup di proprietà di una finestra cornice disattivata. La finestra cornice usa il risultato per determinare se disabilitare o meno la finestra popup.
È possibile usarlo per eseguire un'elaborazione speciale nella finestra popup quando il frame entra in uno stato modale o per impedire la disabilitazione di determinate finestre popup. Le descrizioni comando usano questo messaggio per distruggersi quando la finestra cornice entra in uno stato modale, ad esempio.
Parametri e valore restituito | Descrizione |
---|---|
wParam | Non usato (0) |
lParam | Non usato (0) |
restituisce | Non-zero per NON disabilitare la finestra, 0 indica che la finestra verrà disabilitata |
WM_FLOATSTATUS
Questo messaggio viene inviato a tutte le finestre popup di proprietà di una finestra cornice quando il frame viene attivato o disattivato da un'altra finestra cornice di primo livello. Viene usato dall'implementazione di MFS_SYNCACTIVE in CMiniFrameWnd
per mantenere sincronizzata l'attivazione di queste finestre popup con l'attivazione della finestra cornice di primo livello.
Parametri | Descrizione |
---|---|
wParam | Uno dei valori seguenti: FS_SHOW FS_HIDE FS_ACTIVATE FS_DEACTIVATE FS_ENABLEFS_DISABLE FS_SYNCACTIVE |
lParam | Non usato (0) |
Il valore restituito deve essere diverso da zero se FS_SYNCACTIVE è impostato e la finestra ne sincronizza l'attivazione con il frame padre. CMiniFrameWnd
restituisce un valore diverso da zero quando lo stile è impostato su MFS_SYNCACTIVE.
Per altre informazioni, vedere l'implementazione di CMiniFrameWnd
.
WM_ACTIVATETOPLEVEL
Questo messaggio viene inviato a una finestra di primo livello quando una finestra nel relativo "gruppo di primo livello" viene attivata o disattivata. Una finestra fa parte di un gruppo di primo livello se è una finestra di primo livello (nessun padre o proprietario) o è di proprietà di tale finestra. Questo messaggio è simile a quello usato per WM_ACTIVATEAPP, ma funziona in situazioni in cui le finestre appartenenti a processi diversi sono miste in una singola gerarchia di finestre (comune nelle applicazioni OLE).
WM_COMMANDHELP, WM_HELPHITTEST, WM_EXITHELPMODE
Questi messaggi vengono usati nell'implementazione della Guida sensibile al contesto. Per altre informazioni, vedere la nota tecnica 28 .
Formati di risorse private MFC
Attualmente, MFC definisce due formati di risorse private: RT_TOOLBAR e RT_DLGINIT.
formato risorsa RT_TOOLBAR
La barra degli strumenti predefinita fornita da AppWizard si basa su una risorsa personalizzata RT_TOOLBAR introdotta in MFC 4.0. È possibile modificare questa risorsa usando l'editor della barra degli strumenti.
formato risorsa RT_DLGINIT
Un formato di risorsa privata MFC viene usato per archiviare informazioni aggiuntive sull'inizializzazione del dialogo. Sono incluse le stringhe iniziali archiviate in una casella combinata. Il formato di questa risorsa non è progettato per essere modificato manualmente, ma viene gestito da Visual C++.
Visual C++ e questa risorsa RT_DLGINIT non sono necessarie per usare le funzionalità correlate di MFC poiché esistono api alternative all'uso delle informazioni nella risorsa. L'uso di Visual C++ semplifica notevolmente la scrittura, la gestione e la conversione dell'applicazione a lungo termine.
La struttura di base di una risorsa RT_DLGINIT è la seguente:
+---------------+ \
| Control ID | UINT |
+---------------+ |
| Message # | UINT |
+---------------+ |
|length of data | DWORD |
+---------------+ | Repeated
| Data | Variable Length | for each control
| ... | and Format | and message
+---------------+ /
| 0 | BYTE
+---------------+
Una sezione ripetuta contiene l'ID di controllo a cui inviare il messaggio, il messaggio # a cui inviare (un normale messaggio di Windows) e la lunghezza variabile dei dati. Il messaggio di Windows viene inviato in un modulo:
SendDlgItemMessage(<Control ID>, <Message #>, 0, &<Data>);
Si tratta di un formato molto generale, che consente qualsiasi contenuto di dati e messaggi di Windows. L'editor di risorse di Visual C++ e MFC supportano solo un subset limitato di messaggi di Windows: CB_ADDSTRING per le scelte di elenco iniziali per le caselle combinate (i dati sono una stringa di testo).