2010-02-16 86 views
3

這只是爲了'調試'的目的,所以我不想花很多時間在這方面,也不是很重要。該程序以png,jpg,svg等格式輸出數據 - 因此,這不是什麼大不了的事情,儘管在生成圖像時看到圖像會很好。此外,該程序將用於Linux服務器;但我會限制這個'功能'的Win版本。C++ Win32,用一個位圖顯示一個窗口的最簡單的方法

我也不想使用庫,除非它非常非常輕巧(我曾經使用CImg一段時間,但我對它的速度不是很滿意,所以我最終編寫了重要函數我自己和直接使用libjpeg和libpng)。

我有一個ARGB格式的圖像(32bpp),雖然轉換格式根本不會有問題。我想使用Win32,從代碼內部的函數(不知道hInstance等)創建一個窗口,並寫入位圖。希望快速簡單。

但我不知道win32api夠了。我已經看到,繪製(GDI)的唯一方法是通過HBITMAP對象...任何代碼片段或示例我都可以信賴?任何我可能忽略的考慮?或者 - 考慮到我的時間限制 - 我應該忘記它嗎?

謝謝!

回答

4

這裏最大的工作實際上是註冊窗口類並編寫一個最小化的窗口過程。但是,如果這只是調試代碼,那麼實際上可以跳過該部分。 (我會在稍後回來)。

如果你有一個HBITMAP,那麼你可以使用BitBltStretchBlt畫它,但如果你不已經有圖像作爲一個HBITMAP,然後StretchDIBits可能是一個更好的選擇,因爲你可以,如果你只使用它有一個指向位圖數據的指針。你必須傳遞一個源和目的矩形,一個BITMAPINFOHEADER和一個指向原始位圖數據的指針。像這樣的東西

SIZE sBmp = { 100, 200 }; 
LPBITMAPINFOHEADER pbi; // the bitmap header from the file, etc. 
LPVOID    pvBits; // the raw bitmap bits 

StretchDIBits (hdc, 0, 0, sBmp.cx, sBmp.cy, 
       0, 0, sBmp.cx, sBmp.cy, 
       pvBits, pbi, 
       DIB_RGB_COLORS, 
       SRCCOPY); 

所以接下來的部分是我如何獲得一個HDC繪製?對於Debug代碼,我經常直接畫到屏幕上。 HDC hdc = GetDC(NULL)將獲得一個可以繪製到屏幕上的DC,但存在安全問題,並且它在Windows Vista中與Aero不一樣,所以另一種方法是繪製到窗口上。如果你有一個可以直接繪製的窗口,那麼HDC hdc = GetDC(hwnd)就可以工作。

這樣做的好處是,您不必創建和顯示窗口,因此對代碼流的破壞性更小,對於調試特定問題很有幫助,但不是您可以離開的某種東西一直打開。

對於長期的解決方案,您可以創建一個對話框,並將該位圖繪圖調用放置在對話框的WM_PAINT或WM_ERASEBKGND消息處理程序中。但我不建議你展示一個對話框,它不應該用來做UI的內部深層代碼。顯示一個窗口,尤其是對話框窗口將會干擾應用程序中的正常消息流。如果您想使用此位圖查看器的對話框,那麼您希望該對話框窗口是用戶顯示的內容,並且如果它在那裏,則只需將其繪製即可。

如果您無法訪問HINSTANCE,仍然可以顯示對話框,這只是更多的工作。這是一個不同的問題。

+0

感謝您的回覆。確實,在Windows 7 aero中,如果我畫到屏幕上,它就會立即出現並消失。禁用uxsms會使它工作得更好,但我猜想我更喜歡在對話框中繪製它,所以我需要對不同問題的答案:D。 – huff 2010-02-16 01:36:45

+0

@huff:這應該是一個新問題。像「如何創建沒有資源的簡單對話框」。 – 2010-02-16 01:47:43

+0

我會那樣做的。我正在用'CreateIndirect'猜測我的出路,但仍然可以在這裏提出問題。 – huff 2010-02-16 01:52:21

1

關於你所需要的是一個設備上下文的句柄(HDC)。要顯示您的數據:

  1. CreateDibSection創建一個DIBSection。
  2. 將您的數據複製到由CreateDibSection返回的內存塊。
  3. 創建一個與目標DC兼容的DC。
  4. 將DIBSection選擇到您新創建的DC中。
  5. BitBlt(或StretchBlt)從DC到目標DC。
+0

感謝您的回覆! – huff 2010-02-16 01:37:05

相關問題