簡體   English   中英

WinAPI:無法完全擺脫窗口框架

[英]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

實現C ++ Win32啟動畫面的最快方法

http://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_introduction.html

http://www.codeguru.com/cpp/wd/dislog/splashscreens/article.php/c5029/Adding-a-Splash-Screen-to-Your-Applications.htm

希望這會有所幫助。 順祝商祺!

暫無
暫無

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

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