Sto creando una finestra di dialogo utilizzando CreateDialog
.DrawText utilizzando FONT e SetBkMode in Windows Dialog
nella finestra di proc faccio un po 'il disegno di testo in WM_PAINT
:
function DialogProc(hDlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
...
case Msg of
WM_PAINT:
begin
dc := BeginPaint(hDlg, ps);
bkmodePrev := SetBkMode(dc, TRANSPARENT);
hfnt := SendMessage(hDlg, WM_GETFONT, 0, 0);
hfntPrev := SelectObject(dc, hfnt);
DrawTextW(dc, 'Text', -1, R, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
SelectObject(dc, hfntPrev);
// SetBkMode(dc, bkmodePrev); // do I need this?
EndPaint(hDlg, ps);
Result := True;
end;
end;
...
Ora la domanda è, sto facendo bene con il tipo di carattere, il che significa che, è questo il modo corretto per ottenere il tipo di carattere gestire una finestra di dialogo usando SendMessage(hDlg, WM_GETFONT, 0, 0)
e ripristinandola con SelectObject(dc, hfntPrev
)? Devo ripristinare il vecchio BkMode da bkmodePrev
usando SetBkMode(dc, bkmodePrev);
? o lo faranno EndPaint
per me?
P.S: devo rilasciare la DC?
grazie David. come al solito le tue risposte sono d'oro :) – kobik
EndPaint distruggerà il contesto del dispositivo causando il default della modalità di sfondo (OPAQUE) per la prossima volta. Non è necessario eseguire il ripristino, solo i controller di dominio "classe" e "privato" mantengono lo stato. –
Poiché sta elaborando 'WM_PAINT' in una finestra di dialogo, ha bisogno di' SetWindowLongPtr (hDlg, DWLP_MSGRESYLT, (LONG_PTR) 0); 'dopo la chiamata' EndPaint'.Solo allora può restituire "VERO" o forse ho sbagliato? – AlwaysLearningNewStuff