這裏最大的工作實際上是註冊窗口類並編寫一個最小化的窗口過程。但是,如果這只是調試代碼,那麼實際上可以跳過該部分。 (我會在稍後回來)。
如果你有一個HBITMAP,那麼你可以使用BitBlt或StretchBlt畫它,但如果你不已經有圖像作爲一個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,仍然可以顯示對話框,這只是更多的工作。這是一個不同的問題。
感謝您的回覆。確實,在Windows 7 aero中,如果我畫到屏幕上,它就會立即出現並消失。禁用uxsms會使它工作得更好,但我猜想我更喜歡在對話框中繪製它,所以我需要對不同問題的答案:D。 – huff 2010-02-16 01:36:45
@huff:這應該是一個新問題。像「如何創建沒有資源的簡單對話框」。 – 2010-02-16 01:47:43
我會那樣做的。我正在用'CreateIndirect'猜測我的出路,但仍然可以在這裏提出問題。 – huff 2010-02-16 01:52:21