求助,我想制作一个没有标题栏,可以拖拽,可以缩放的窗口未能实现

小小杨 1月前 481

 import win.ui;
import gdi;

// 创建主窗口
var mainForm = win.form(text="最小边框窗口";right=600;bottom=400;border="none")

// 保留可调整大小的功能,但移除默认边框
mainForm.modifyStyle(0x800000/*WS_BORDER*/,0x40000/*WS_THICKFRAME*/)

// 禁用DWM边框
::Dwmapi := ..raw.loadDll("Dwmapi.dll");
::Dwmapi.DwmSetWindowAttribute(mainForm.hwnd, 2/*DWMWA_NCRENDERING_POLICY*/, {int value = 1}, 4);

// 最小化非客户区
var margins = {int left=1;int right=1;int top=1;int bottom=1}
::Dwmapi.DwmExtendFrameIntoClientArea(mainForm.hwnd, margins);

// 设置窗口区域为整个窗口
mainForm.onMouseDown = function(wParam,lParam){
    mainForm.hitCaption()
}

// 绘制函数
mainForm.onPaint = function(hdc) {
    var rc = mainForm.getClientRect();
    
    // 填充白色背景
    ::Gdi32.FillRect(hdc, rc, ::Gdi32.GetStockObject(0/*WHITE_BRUSH*/));
    
    // 绘制1像素黑色边框
    var hPen = ::Gdi32.CreatePen(0/*PS_SOLID*/, 1, 0/*BLACK*/);
    var hOldPen = ::Gdi32.SelectObject(hdc, hPen);
    
    ::Gdi32.MoveToEx(hdc, 0, 0, null);
    ::Gdi32.LineTo(hdc, rc.right-1, 0);
    ::Gdi32.LineTo(hdc, rc.right-1, rc.bottom-1);
    ::Gdi32.LineTo(hdc, 0, rc.bottom-1);
    ::Gdi32.LineTo(hdc, 0, 0);
    
    ::Gdi32.SelectObject(hdc, hOldPen);
    ::Gdi32.DeleteObject(hPen);
}

// 创建关闭按钮
var closeButton = mainForm.add(
    button={cls="button";text="X";left=560;top=10;width=30;height=30}
)
closeButton.oncommand = function(id,event){
    mainForm.close()
}

// 处理窗口大小改变
mainForm.onSize = function(flags,cx,cy){
    mainForm.redraw();
}

// 显示窗口
mainForm.show();

// 运行消息循环
win.loopMessage();

这是我用 claude3.5生成的代码,经过几次反复要求它修改代码,它都无法实现没有边框,没有标题栏、可缩放的窗口。这段代码的生成的窗体,有一个灰色的边框我始终无法解决。我希望代码能够为我生成一个可以拖拽,可以缩放,可以自定义标题栏,窄边框甚至无边框,并且点击标题栏,可以移动窗体。我编写这个窗口本意是想做一个模仿 QQ 一样可以吸附隐藏的小软件,吸附隐藏的功能只实现了一小半。有哪位大佬能够帮助一下吗?

上传的附件:
最新回复 (7)
  • 小光芒 1月前
    0 2
    最简单的 导入 win.ui.simplewindows
  • 阿甘 1月前
    1 3
    import win.ui;
    import win.region.hole;
    /*DSG{{*/
    var winform = win.form(text="aardio form";right=304;bottom=297;border="none";exmode="none";mode="popup")
    winform.add()
    /*}}*/
    
    import win.ui.simpleWindow;
    win.ui.simpleWindow(winform);
    win.ui.simpleWindow(winform,,0,0,0);
    
    winform.onMouseDown  = function(wParam,lParam){
    	winform.hitCaption();	
    }
    
    winform.show();
    win.loopMessage();

    窗口有边框有阴影,simpleWindow.aardio:..win.ui.shadow( this.targetForm,70,9 ); 

  • 小小杨 1月前
    0 4
    非常感谢大佬们的热心帮助。这个网站好像没有私信功能。方便提供邮箱进行讨教学习吗?
  • nanyi 1月前
    0 5

  • 阿甘 1月前
    0 6
    小小杨 非常感谢大佬们的热心帮助。这个网站好像没有私信功能。方便提供邮箱进行讨教学习吗?

    推一手我的网站(很少更新 但常看消息):https://aarbbs.com

  • 小小杨 1月前
    0 7
    好的,谢谢。已经收藏学习。
  • zrone 1月前
    0 8
    阿甘 import win.ui; import win.region.hole; /*DSG{{*/ var winform  ...
    感谢,学习到了
返回