簡體   English   中英

類似 MSPaint 的應用程序編寫。 如何正確地做 BitBlt?

[英]MSPaint-like app writing. How to do BitBlt right?

我現在正在使用 windows.h (GDI) 在 C++ 中編寫簡單的類似 mspaint 的程序。 對於我的程序,我只需要鋼筆工具。 所以,我需要將主窗口的圖片存儲在某個地方(例如,在內存 HDC 和 HBITMAP 中)以在 WM_PAINT 消息中繪制它。

  1. 當我第一次必須將窗口的 HDC 存儲到我的內存 HDC 和 HBITMAP 時? 我應該在什么消息中存儲窗口? 例如,我認為我們不能在 WM_CREATE 中做到這一點,因為我們還沒有窗口。

  2. PatBlt 和 BitBlt 有什么區別? 我應該為我的應用程序使用什么?

  3. 如何將窗口的 HDC 內容復制到我的內存 HDC 和位圖? 我正在嘗試做這樣的事情:

     LPRECT lpRect; GetClientRect(hwnd, lpRect); width = lpRect->right - lpRect->left; height = lpRect->bottom - lpRect->top; HDC hDC = GetDC(hwnd); memoryDC = CreateCompatibleDC(hDC); memoryBitmap = CreateCompatibleBitmap(hDC, width, height); SelectObject(memoryDC, memoryBitmap); PatBlt(memoryDC, 0, 0, width, height, PATCOPY); ReleaseDC(hwnd, hDC);

但這不起作用:程序崩潰。

  1. 之后如何在 WM_PAINT 中恢復窗口?

  2. 如何用白色清除我的窗戶?

1:我建議您盡可能晚地延遲加載屏幕外畫布。 如果您在 WM_PAINT 中需要它並且您還沒有創建它,那么創建它。 如果您在有人開始繪圖時需要它,請創建它。 如果它在您需要時存在,請使用它。

2:PatBlt 使用設備上下文的當前畫筆填充位圖的一個區域。 畫筆定義了圖案,這就是它被稱為 PatBlt 的原因。 BitBlt 將數據從源位圖復制到目標位圖。 當您想將圖像從屏幕外位圖移動到幀緩沖區時,您將使用 BitBlt。

3:GetClientRect 的 lpRect 參數是一個輸出參數。 這意味着您必須提供內存。 在這種情況下,GetClientRect 試圖將矩形寫入空指針並導致崩潰。

RECT clientRect;
GetClientRect(hwnd, &clientRect);
width = clientRect.right - clientRect.left;
height = clientRect.bottom - clientRect.top;

WM_PAINT:似乎是創建內存 hdc 的最佳位置。 你可以做這樣的事情

WM_PAINT:
if (!first_paint) { ...code first_paint = true; ...更多代碼中斷;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM