Update README.md
Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
parent
a49a134f24
commit
91b4b676d1
28
README.md
28
README.md
|
@ -2,11 +2,16 @@
|
|||
|
||||
## Features
|
||||
|
||||
- Frameless but have frame shadow.
|
||||
- Drag and resize.
|
||||
- High DPI scaling.
|
||||
- Frameless but have frame shadow (especially on Windows).
|
||||
- Draggable and resizeable.
|
||||
- Automatically high DPI scaling.
|
||||
- Multi-monitor support (different resolution and DPI).
|
||||
- Windows platform: act like a normal window, such as have animations when minimizing and maximizing, support tile windows, etc ...
|
||||
- Have animations when minimizing and maximizing (Windows).
|
||||
- Tiled/Stack windows by DWM (Windows).
|
||||
- Won't cover the task bar when maximized (Windows).
|
||||
- Won't block the auto-hide task bar when maximized (Windows).
|
||||
- No flickers when resizing (Windows).
|
||||
- Load all APIs at run-time, no need to link to any system libraries directly (Windows).
|
||||
|
||||
## Usage
|
||||
|
||||
|
@ -86,10 +91,10 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
Notes
|
||||
|
||||
- The `setFramelessWindows`/`addFramelessWindow` function must not be called after the widget is shown. However, for QWindows, it must be called after they are shown.
|
||||
- The `setFramelessWindows`/`addFramelessWindow` function must not be called after the widget is shown. However, for `QWindow`, it must be called after they are shown.
|
||||
- I use `startSystemMove` and `startSystemResize` which are only available since Qt 5.15 for moving and resizing frameless windows on UNIX platforms, so if your Qt version is below that, you can't compile this code. I'm sorry for it but using the two functions is the easiest way to achieve this.
|
||||
- Any widgets (or Qt Quick elements) in the titlebar area will not be resposible because the mouse events are intercepted. Try if `setIgnoreAreas` and `setDraggableAreas` can help.
|
||||
- Only top level windows can be frameless. Applying this code to child windows or widgets will result in unexpected behavior.
|
||||
- Any widgets (or Qt Quick elements) in the titlebar or resize area will not respond to any mouse events because they are intercepted by my code. If you want to add somewhere or something to the ignore list, try change the window data's `ignoreAreas`, `draggableAreas`, `ignoreObjects` and `draggableObjects`.
|
||||
- Only top level windows can be frameless. Applying this code to child windows or widgets or even something that is not a window will result in unexpected behavior. Don't try to do this!
|
||||
- If you want to use your own border width, border height, titlebar height or maximum/minimum window size, just use the original numbers, no need to scale them according to DPI, this code will do the scaling automatically.
|
||||
|
||||
## Supported Platforms
|
||||
|
@ -99,15 +104,14 @@ Notes
|
|||
|
||||
## Notes for Windows developers
|
||||
|
||||
- The `FramelessHelper` class is just a simple wrapper of the `WinNativeEventFilter` class, you can use the latter directly instead if you encounter with some strange problems.
|
||||
- **As you may have found, if you use this code, the resize areas will be inside the frameless window, however, a normal Win32 window can be resized outside of it.** Here is the reason: the `WS_THICKFRAME` window style will cause a window has three transparent areas beside the window's left, right and bottom edge. Their width/height is 8px if the window is not scaled. In most cases, they are totally invisible. It's DWM's responsibility to draw and control them. They exist to let the user resize the window, visually outside of it. They are in the window area, but not the client area, so they are in the non-client area actually. But we have turned the whole window area into client area in `WM_NCCALCSIZE`, so the three transparent resize areas also become a part of the client area and thus they become visible. When we resize the window, it looks like we are resizing inside of it, however, that's because the transparent resize areas are visible now, we ARE resizing outside of the window actually. But I don't know how to make them become transparent again without breaking the frame shadow drawn by DWM. If you really want to solve it, you can try to embed your window into a larger transparent window and draw the frame shadow yourself.
|
||||
- If you are using `WinNativeEventFilter` directly, don't forget to call `FramelessHelper::updateQtFrame` everytime after you make a widget or window become frameless, it will make the new frame margins work correctly if `setGeometry` or `frameGeometry` is called.
|
||||
- The `FramelessHelper` class is just a simple wrapper of the `WinNativeEventFilter` class and the former is mainly designed to work on UNIX platforms. So if you are developing Windows applications, you should use the latter instead.
|
||||
- **As you may have found, if you use this code, the resize areas will be inside the frameless window, however, a normal Win32 window can be resized outside of it.** Here is the reason: the `WS_THICKFRAME` window style will cause a window has three transparent areas beside the window's left, right and bottom edge. Their width/height is 8px if the window is not scaled. In most cases, they are totally invisible. It's DWM's responsibility to draw and control them. They exist to let the user resize the window, visually outside of it. They are in the window area, but not the client area, so they are in the non-client area actually. But we have turned the whole window area into client area in `WM_NCCALCSIZE`, so the three transparent resize areas also become a part of the client area and thus they become visible. When we resize the window, it looks like we are resizing inside of it, however, that's because the transparent resize areas are visible now, we ARE resizing outside of the window actually. But I don't know how to make them become transparent again without breaking the frame shadow drawn by DWM. If you really want to solve it, you can try to embed your window into a larger transparent window and draw the frame shadow yourself. [See the discussions here](https://github.com/wangwenx190/framelesshelper/issues/3) for more detailed information.
|
||||
- Don't change the window flags (for example, enable the Qt::FramelessWindowHint flag) because it will break the functionality of this code. I'll get rid of the window frame (including the titlebar of course) in Win32 native events.
|
||||
- All traditional Win32 APIs are replaced by their DPI-aware ones, if there is one.
|
||||
- Start from Windows 10, normal windows usually have a one pixel width border line, I don't add it because not everyone like it. You can draw one manually if you really need it.
|
||||
- Starting from Windows 10, normal windows usually have a one pixel width border line. After many times of trying, I still can't preserve it if I want to remove the window frame. I don't know how to solve this currently. If you really need it, you have to draw one manually by yourself. [See the discussions here](https://github.com/wangwenx190/framelesshelper/issues/3) for more detailed information.
|
||||
- The frame shadow will get lost if the window is totally transparent. It can't be solved unless you draw the frame shadow manually.
|
||||
- On Windows 7, if you disabled the Windows Aero, the frame shadow will be disabled as well because it's DWM's resposibility to draw the frame shadow.
|
||||
- The border width (8 if not scaled), border height (8 if not scaled) and titlebar height (30 if not scaled) are acquired by Win32 APIs and are the same with other standard windows, and thus you should not modify them.
|
||||
- The border width (8 if not scaled), border height (8 if not scaled) and titlebar height (30 if not scaled) are acquired by Win32 APIs and are the same with other standard windows, and thus you should not modify them. Only modify them when you really have a good reason to do so.
|
||||
- You can also copy all the code to `[virtual protected] bool QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)` or `[virtual protected] bool QWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)`, it's the same with install a native event filter to the application.
|
||||
|
||||
## References for Windows developers
|
||||
|
|
Loading…
Reference in New Issue