一, 开发 Windows 桌面应用的一些配置:(注意. cpp 文件里哪怕是注释都不能有中文, 否则会报错, 目前没有找到解决办法)
1. 调整屏幕的大小:
将 Windows/runner 里的 main.cpp 文件: Win32Window::Size size(1280, 720); 改成想要的值即可, 如 Win32Window::Size size(360, 640);
2. 启动后窗体居中:
这个步骤有点复杂, 也是改 Windows/runner 的 main.cpp 文件, 将这两个代码
- Win32Window
- ::Point
- origin
- (10, 10);
- Win32Window
- ::Size
- size
- (360, 640);
改成:
- UINT windowWidth = 360, windowHeight = 640;
- Win32Window::Size size(windowWidth, windowHeight);
- UINT scrWidth, scrHeight, xShaft, yShaft;
- scrWidth = GetSystemMetrics(SM_CXFULLSCREEN);
- scrHeight = GetSystemMetrics(SM_CYFULLSCREEN);
- xShaft = (scrWidth - windowWidth) / 2;
- yShaft = (scrHeight - windowHeight) / 2;
- // origin is used for set Windows location
- Win32Window::Point origin(xShaft, yShaft);
然后将 runner/win32_window.cpp 的 CreateWindow(..) 方法下面添加
- SetWindowPos
- (Windows, HWND_TOP,
- origin
- .
- x
- ,
- origin
- .
- y
- ,
- size
- .
- width
- , size.height, SWP_NOSIZE);
3. 将窗体改成 top 窗口 [类似截图 pin 在屏幕上的那种软件实现]
在 runner/win32_window.cpp 里的 CreateWindow(..) 方法下面添加一行代码:
SetWindowPos(Windows, HWND_TOPMOST, origin.x, origin.y, size.width, size.height, SWP_NOSIZE);[注意, 和上面的居中的是同一个代码, 只不过 HWND_TOP 改成 HWND_TOPMOST]
4. 修改应用的图标可以修改 runner/resources 的 app_icon.ico 文件, 注意改了后需要清理编译的临时文件 [而且图标是要符合格式的图标文件]
5. 创建一个不可显示的程序 [即后台程序, 但是又不是控制台程序] :
将 CreateWindow 里的 | WS_VISIBLE 去掉 [就是去掉 WS_VISIBLE] , 那么这个窗体程序就不显示了, 也就变成了 "后台程序"[不过似乎不实用]
6. 禁用最大化窗口按钮 [标题栏里的] (win32_window.cpp 文件)
注意, 在允许最大化窗体按钮的情况下, 双击标题栏会最大化窗口, 窗口可以拖动更改窗体大小, 点击最大化按钮会最大化窗体;
但是如果禁用了最大化按钮, 则双击标题栏不会最大化, 且也不能拖动窗体边缘来修改窗体大小, 禁用最大化按钮方式为修改 CreateWindow 的 WS_OVERLAPPEDWINDOW, 改为:
WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX
7. 如果要去掉标题栏, 则可以在 win32_window.cpp 里的 SetWindowLongPtr(..) 方法下面添加: SetWindowLong(Windows, GWL_STYLE, WS_OVERLAPPED);
8.dart 代码可以通过 io 的 exit(0); 来退出窗体程序;
9. 如果不禁用最大化按钮, 但是需要禁用双击标题栏最大化窗体, 可以修改 win32_window.cpp 文件里的 MessageHandler 的 switch 里添加 case 是 WM_NCLBUTTONDBLCLK: return 0; 来实现 "吃" 掉双击标题栏的事件;
10. 不禁用最大化按钮的前提下, 不能拖动窗口边缘来改变窗体大小, 可以在 win32_window.cpp 文件里的 MessageHandler 的 switch 里添加 case 是:
- case WM_NCHITTEST:
- LRESULT res = DefWindowProc(hwnd, message, wparam, lparam);
- if (res == HTCAPTION || (res>= HTLEFT && res < HTBORDER)) {
- return HTCLIENT;
- }
- break;
来实现;
[还可以吃掉点击最大化按钮的事件, 但是没有意义, 还不如直接禁用, 消息是 WS_SYSCOMMAND 然后再通过 wparam 判断是不是 SC_MAXIMIZE 来实现]
11. 待做: dart 里动态更新标题, 托盘功能;
来源: http://www.bubuko.com/infodetail-3800477.html