La finestra padre di un pulsante dal proprietario in genere risponde ai messaggi di almeno tre per il pulsante: WM_INITDIALOG, WM_COMMANDe WM_DRAWITEM. Non è necessario elaborare il messaggio WM_MEASUREITEM per i pulsanti creati dal proprietario.
Quando si deve dipingere un pulsante creati dal proprietario, il sistema invia un messaggio WM_DRAWITEM cui lParam punta a una struttura DRAWITEMSTRUCT finestra padre. Utilizzare questa struttura con tutti i controlli creati dal proprietario per fornire l'applicazione con le informazioni che richiede a dipingere il controllo. I membri di itemAction e itemState della struttura DRAWITEMSTRUCT definiscono come dipingere un pulsante creati dal proprietario.
Nell'esempio seguente viene illustrato come elaborare i messaggi WM_COMMAND, WM_DRAWITEM e WM_INITDIALOG per pulsanti creati dal proprietario. In questo esempio viene illustrato come disegnare una delle due immagini bitmap per un controllo, dipende se il controllo è selezionato. Si avrebbe in genere utilizza il parametro wParam del messaggio WM_DRAWITEM per identificare il controllo; in questo esempio si presuppone un solo controllo.
BOOL CALLBACK OwnDrawProc(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hdcMem;
LPDRAWITEMSTRUCT lpdis;
switch (message)
{
case WM_INITDIALOG:
// hinst, hbm1 and hbm2 are defined globally.
hbm1 = LoadBitmap((HANDLE) hinst, "OwnBit1");
hbm2 = LoadBitmap((HANDLE) hinst, "OwnBit2");
return TRUE;
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT) lParam;
hdcMem = CreateCompatibleDC(lpdis->hDC);
if (lpdis->itemState & ODS_SELECTED) // if selected
SelectObject(hdcMem, hbm2);
else
SelectObject(hdcMem, hbm1);
// Destination
StretchBlt(
lpdis->hDC, // destination DC
lpdis->rcItem.left, // x upper left
lpdis->rcItem.top, // y upper left
// The next two lines specify the width and
// height.
lpdis->rcItem.right - lpdis->rcItem.left,
lpdis->rcItem.bottom - lpdis->rcItem.top,
hdcMem, // source device context
0, 0, // x and y upper left
32, // source bitmap width
32, // source bitmap height
SRCCOPY); // raster operation
DeleteDC(hdcMem);
return TRUE;
case WM_COMMAND:
if (wParam == IDOK
|| wParam == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return TRUE;
}
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_OWNERDRAW:
// application-defined processing
break;
}
}
break;
case WM_DESTROY:
DeleteObject(hbm1); // delete bitmaps
DeleteObject(hbm2);
break;
}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}
Rimedio: Inserire il CD-ROM CD di MSDN Library.