Tôi đang tạo Hộp thoại bằng cách sử dụng CreateDialog
.DrawText sử dụng FONT và SetBkMode trong cửa sổ Hộp thoại
trong proc thoại tôi làm một số bản vẽ của văn bản trong 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;
...
Bây giờ câu hỏi là, tôi làm việc đó đúng với phông chữ, có nghĩa là, đây là cách chính xác để có được phông chữ xử lý hộp thoại bằng cách sử dụng SendMessage(hDlg, WM_GETFONT, 0, 0)
và khôi phục bằng SelectObject(dc, hfntPrev
)? Tôi có cần khôi phục mã BkMode cũ của bkmodePrev
bằng cách sử dụng SetBkMode(dc, bkmodePrev);
không? hoặc sẽ EndPaint
làm điều đó cho tôi?
P.S: Tôi có cần giải phóng DC không?
cảm ơn David. như bình thường câu trả lời của bạn là vàng :) – kobik
EndPaint sẽ phá hủy bối cảnh thiết bị khiến chế độ nền được mặc định (OPAQUE) cho vòng thời gian tiếp theo. Không cần phải khôi phục lại, chỉ các DC 'lớp' và 'riêng tư' duy trì trạng thái. –
Vì anh ta đang xử lý 'WM_PAINT'in một hộp thoại, anh ta cần 'SetWindowLongPtr (hDlg, DWLP_MSGRESYLT, (LONG_PTR) 0);' sau khi 'EndPaint' gọi.Chỉ sau đó anh mới có thể trả lại 'TRUE' hoặc có thể tôi đã sai? – AlwaysLearningNewStuff