Tworzę okno dialogowe za pomocą CreateDialog
.DrawText za pomocą FONT i SetBkMode w oknach Dialog
w proc dialogowym robię jakiś rysunek tekstu w 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;
...
Teraz pytanie jest, robię to dobrze z czcionką, co oznacza, że jest to właściwy sposób, aby uzyskać czcionki uchwyt okna dialogowego przy użyciu SendMessage(hDlg, WM_GETFONT, 0, 0)
i przywrócenie go za pomocą SelectObject(dc, hfntPrev
)? Czy muszę przywrócić stary BkMode z bkmodePrev
przy użyciu SetBkMode(dc, bkmodePrev);
? czy zrobi to dla mnie EndPaint
?
P.S: Czy muszę zwolnić DC?
dziękuję David. jak zwykle twoje odpowiedzi są złote :) – kobik
EndPaint zniszczy kontekst urządzenia powodując, że tryb tła będzie ustawiony domyślnie (OPAQUE) na następną rundę. Nie ma potrzeby przywracania, tylko "klasa" i "prywatne" DC zachowują stan. –
Ponieważ przetwarza 'WM_PAINT' w oknie dialogowym, potrzebuje' SetWindowLongPtr (hDlg, DWLP_MSGRESYLT, (LONG_PTR) 0); 'po wywołaniu' EndPaint'.Dopiero wtedy może zwrócić "PRAWDA", a może źle? – AlwaysLearningNewStuff