首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Win32 API 對話框獲取輸入並在主窗口繪製直線:DC 獲取時機與重繪觸發問題

     編輯:程式設計綜合問答

代碼主要問題

  1. WM_PAINT 中重複獲取 DC:BeginPaint 已返回有效 HDC,隨後又調用 GetDC 導致資源洩漏/繪製異常。應直接使用 BeginPaint 返回的 hdc。
  2. 繪製時機錯誤:對話框關閉後修改全局坐標變量,但未觸發主窗口重繪。需調用 InvalidateRect(hwnd, NULL, TRUE) 通知系統重繪。
  3. 對話框數據獲取: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 最簡潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved