mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-09 08:15:09 +03:00
Native window decorations: when window is initially shown, fill background with window background color (instead of white), which avoids flickering in dark themes (issue #339)
This commit is contained in:
@@ -87,6 +87,7 @@ FlatWndProc::FlatWndProc() {
|
||||
hwnd = NULL;
|
||||
defaultWndProc = NULL;
|
||||
wmSizeWParam = -1;
|
||||
background = NULL;
|
||||
}
|
||||
|
||||
HWND FlatWndProc::install( JNIEnv *env, jobject obj, jobject window ) {
|
||||
@@ -135,6 +136,8 @@ void FlatWndProc::uninstall( JNIEnv *env, jobject obj, HWND hwnd ) {
|
||||
|
||||
// cleanup
|
||||
env->DeleteGlobalRef( fwp->obj );
|
||||
if( fwp->background != NULL )
|
||||
::DeleteObject( fwp->background );
|
||||
delete fwp;
|
||||
}
|
||||
|
||||
@@ -182,14 +185,16 @@ void FlatWndProc::updateFrame( HWND hwnd, int state ) {
|
||||
}
|
||||
|
||||
void FlatWndProc::setWindowBackground( HWND hwnd, int r, int g, int b ) {
|
||||
FlatWndProc* fwp = (FlatWndProc*) hwndMap->get( hwnd );
|
||||
if( fwp == NULL )
|
||||
return;
|
||||
|
||||
// delete old background brush
|
||||
HBRUSH oldBrush = (HBRUSH) ::GetClassLongPtr( hwnd, GCLP_HBRBACKGROUND );
|
||||
if( oldBrush != NULL )
|
||||
::DeleteObject( oldBrush );
|
||||
if( fwp->background != NULL )
|
||||
::DeleteObject( fwp->background );
|
||||
|
||||
// create new background brush
|
||||
HBRUSH brush = ::CreateSolidBrush( RGB( r, g, b ) );
|
||||
::SetClassLongPtr( hwnd, GCLP_HBRBACKGROUND, (LONG_PTR) brush );
|
||||
fwp->background = ::CreateSolidBrush( RGB( r, g, b ) );
|
||||
}
|
||||
|
||||
LRESULT CALLBACK FlatWndProc::StaticWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
|
||||
@@ -224,12 +229,16 @@ LRESULT CALLBACK FlatWndProc::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, L
|
||||
wParam = wmSizeWParam;
|
||||
break;
|
||||
|
||||
case WM_ERASEBKGND:
|
||||
return WmEraseBkgnd( hwnd, uMsg, wParam, lParam );
|
||||
|
||||
case WM_DESTROY:
|
||||
return WmDestroy( hwnd, uMsg, wParam, lParam );
|
||||
}
|
||||
|
||||
return ::CallWindowProc( defaultWndProc, hwnd, uMsg, wParam, lParam );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle WM_DESTROY
|
||||
*
|
||||
@@ -243,6 +252,8 @@ LRESULT FlatWndProc::WmDestroy( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lPara
|
||||
|
||||
// cleanup
|
||||
getEnv()->DeleteGlobalRef( obj );
|
||||
if( background != NULL )
|
||||
::DeleteObject( background );
|
||||
hwndMap->remove( hwnd );
|
||||
delete this;
|
||||
|
||||
@@ -250,6 +261,23 @@ LRESULT FlatWndProc::WmDestroy( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lPara
|
||||
return ::CallWindowProc( defaultWndProc2, hwnd, uMsg, wParam, lParam );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle WM_ERASEBKGND
|
||||
*
|
||||
* https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-erasebkgnd
|
||||
*/
|
||||
LRESULT FlatWndProc::WmEraseBkgnd( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam ) {
|
||||
if( background == NULL )
|
||||
return FALSE;
|
||||
|
||||
// fill background
|
||||
HDC hdc = (HDC) wParam;
|
||||
RECT rect;
|
||||
::GetClientRect( hwnd, &rect );
|
||||
::FillRect( hdc, &rect, background );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle WM_NCCALCSIZE
|
||||
*
|
||||
|
||||
@@ -42,6 +42,7 @@ private:
|
||||
HWND hwnd;
|
||||
WNDPROC defaultWndProc;
|
||||
int wmSizeWParam;
|
||||
HBRUSH background;
|
||||
|
||||
FlatWndProc();
|
||||
static void initIDs( JNIEnv *env, jobject obj );
|
||||
@@ -49,6 +50,7 @@ private:
|
||||
static LRESULT CALLBACK StaticWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
||||
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
||||
LRESULT WmDestroy( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam );
|
||||
LRESULT WmEraseBkgnd( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam );
|
||||
LRESULT WmNcCalcSize( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam );
|
||||
LRESULT WmNcHitTest( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user