代碼主要問題
- WM_PAINT 中重複獲取 DC:
BeginPaint 已返回有效 HDC,隨後又調用 GetDC 導致資源洩漏/繪製異常。應直接使用 BeginPaint 返回的 hdc。
- 繪製時機錯誤:對話框關閉後修改全局坐標變量,但未觸發主窗口重繪。需調用
InvalidateRect(hwnd, NULL, TRUE) 通知系統重繪。
- 對話框數據獲取:
GetDlgItem 返回控件句柄,但未用於 GetWindowText;應直接用 GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE) 獲取整數。
修正要點
// WndProc WM_PAINT
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 直接使用 hdc 繪製
MoveToEx(hdc, x1, y1, NULL);
LineTo(hdc, x2, y2);
EndPaint(hwnd, &ps);
return 0;
}
// AboutDlgProc IDOK
case IDOK:
x1 = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE);
y1 = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, FALSE);
x2 = GetDlgItemInt(hDlg, IDC_EDIT3, NULL, FALSE);
y2 = GetDlgItemInt(hDlg, IDC_EDIT4, NULL, FALSE);
InvalidateRect(GetParent(hDlg), NULL, TRUE); // 觸發父窗口重繪
EndDialog(hDlg, TRUE);
return TRUE;
總結
- 繪圖只在
WM_PAINT 中使用 BeginPaint/EndPaint 返回的 DC。
- 數據變更後必須
InvalidateRect 觸發重繪。
- 對話框獲取整數用
GetDlgItemInt 最簡潔。