[英]WinAPI: Can't completely get rid of window frame
我想在整個窗口上繪制一個應用程序。 我為此使用GDI +。 由於我不需要邊框,因此我使用SetWindowLong函數將其禁用,擺脫了任何樣式使其具有框架,如下所示:
SetWindowLong(hwnd, GWL_STYLE, 0);
只要我不嘗試自己在該窗口上實際繪畫某些東西,它就可以正常工作。 我嘗試處理WM_PAINT
消息, WM_ERASEBKGND
消息,甚至是WM_NCPAINT
(盡管處理不多),但是由於某種原因,總會殘留一些邊框,或者至少看起來像這樣。 像這樣:
如您所見,有一個黑色矩形,在其底部和右側均帶有某種框架。 邊框似乎沒有在此處完全繪制,盡管根本不應該繪制邊框。 此處的圖像只是一個空白的黑色位圖,但問題與普通圖片相同。 對於我嘗試處理的所有消息,它看起來都不盡相同,但是結果卻幾乎是相同的-最終會畫出一些額外的垃圾,好像無論如何畫出該死的框架都很累。
這是我處理消息的方式:
case WM_ERASEBKGND:
{
drawer->DrawImage(image, 0, 0, width, height);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hwnd, & ps );
drawer->DrawImage(image, 0, 0, width, height);
EndPaint(hwnd, &ps);
return 0;
}
drawer
變量是指向Gdiplus::Graphics
類對象的指針, image
是指向Gdiplus::Bitmap
對象的指針。 我確實相信這些對象是有效的,因為從文件加載的正常圖片可以正確顯示(該死的幀除外)。
如果啟用啟用繪圖窗口框架的樣式,則效果很好,但是我不想這樣做。 我雖然沒有想法,但真的不知道該怎么辦。 永遠不要編碼熬夜的win32應用程序。
編輯:顯然問題出在畢竟drawer
變量中。 我認為一次創建一個Gdiplus::Graphics
對象並將其與窗口句柄相關聯將是一個好主意。 但是由於某種原因,它看上去並沒有在需要時從關聯的窗口中獲取新的設備上下文(適當的是,它只獲取了一次,然后就再也不用擔心了)。 因此,每當我想在窗戶上畫一些東西而垃圾都消失了時,我嘗試創建一個新對象!
無論如何,感謝所有發表評論並嘗試提供幫助的人,對此我深表感謝。
如果您自己處理背景畫,則需要從WM_ERASEBKGND
處理程序返回1
。 像這樣:
return 1L; // if in window procedure
要么
return (INT_PTR)TRUE; // if in dialog box procedure
我也不喜歡您刪除邊框的方式。 試試這個吧 。
在我看來,您需要啟動屏幕,但我還沒有這樣做。 仍然這篇MSDN文章可能正是您所需要的。
如果全部失敗,這里還有一些可以幫助您的事項:
http://www.codeproject.com/Articles/15523/Own-thread-Win-splash-screen
http://www.codeproject.com/Articles/7658/CSplash-A-Splash-Window-Class
http://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_introduction.html
希望這會有所幫助。 順祝商祺!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.