屏幕截屏的框框实现不理想,请大佬改改

8608074 5天前 248

这是主界面;

import win.ui;
import win;
import winex;
/*DSG{{*/
mainForm = win.form(text="截屏小工具 by 张灯结彩";right=500;bottom=300;bgcolor=0xC0DCC0)
mainForm.add(
button={cls="button";text="单击目标控件截屏";left=44;top=184;right=159;bottom=221;z=1};
picturebox={cls="picturebox";left=194;top=25;right=406;bottom=185;ah=1;autosize=1;aw=1;border=1;z=5};
static={cls="static";left=45;top=24;right=160;bottom=52;border=1;notify=1;transparent=1;z=2};
static2={cls="static";left=45;top=74;right=159;bottom=104;border=1;transparent=1;z=3};
static3={cls="static";left=44;top=127;right=158;bottom=157;border=1;transparent=1;z=4}
)
/*}}*/

var aa = mainForm.loadForm("\dlg\aaa.aardio");
var rcc =::RECT();
aa.modifyStyleEx(,0x00FF0000)
aa.show(3)
rcc=win.getRect(aa.hwnd,true)//获取初始全屏矩形区域
aa.show(false)


mainForm.button.oncommand = function(id,event){	
	aa.setRect(rcc);	//恢复初始大小
	aa.show(3)
    mainForm.show(false);
};


import win.dlg.message;
var msgDlg = win.dlg.message(mainForm); 

import gdip.snap;
//接收一个自定义消息
mainForm.wndproc = function(hwnd,message,wParam,lParam){ 
	if(message==0x801){
		var x,y = win.getMessagePos(lParam);
		
    	mainForm.static3.text = "屏幕坐标" ++ tostring(x) ++ ", " ++ tostring(y);
    	var 子窗口=winex.fromPointReal(x,y,0);//获取子窗口/控件句柄
    	
    	aa.autoResize = false;
    	var rc =win.getRect(子窗口,true)  //获取子窗口区域
		aa.setRect(rc);	
		aa.show();
		
    	mainForm.static.text='子窗口句柄:'+tostring(子窗口);
		mainForm.static2.text='父窗口句柄:'+tostring(::User32.GetAncestor(子窗口, 2/*_GA_ROOT*/));//顶层父窗口句柄
		//弹出是否截屏选择
		if( msgDlg.ask("是否截屏?")  ){
				//对rc截屏并展示
			win.delay(100);
		  	// 截取指定区域屏幕图像
			aa.show(false); 
			var bitmap = gdip.snap(,rc);
			if(bitmap){		
    			// 显示截图
    			mainForm.picturebox.image=bitmap;
    			// 复制到剪贴板
   		    	import win.clip.bitmap;
    			win.clip.bitmap.write(bitmap);
			}
			else {
    			msgDlg.err("截图失败");
			}
       		mainForm.show();
	  		
	    }
	    else {
	    aa.show(false);
	    mainForm.show();
	    }
	    	
	}
    
};


mainForm.show();
return win.loopMessage();

这是弹窗aaa

import win.ui;
/*DSG{{*/
var aa = win.form(text="aardio form";right=757;bottom=467;bgcolor=0xF0CAA6;border="none";exmode="toolwindow";hide=true;mode="popup";title=false)
aa.add(
borderBottom={cls="static";left=0;top=462;right=1;bottom=463;bgcolor=0xFF;edge=1;z=4};
borderLeft={cls="static";left=0;top=0;right=5;bottom=467;bgcolor=0xFF;edge=1;z=1};
borderRight={cls="static";left=752;top=0;right=753;bottom=467;bgcolor=0xFF;edge=1;z=3};
borderTop={cls="static";left=0;top=0;right=752;bottom=5;bgcolor=0xFF;edge=1;z=2}
)
/*}}*/

aa.onActivate = function(state,hwndOther,minimized){
	if(state){
		aa.transparent(80);	//半透明
		
   
	   
	}
} 

aa.onMouseDown  = function(wParam,lParam){
	aa.show(false);	
	//发一个自定义消息
	::User32.PostMessage(aa.parent.hwnd, 0x801, wParam,lParam ); // 发送自定义消息,lParam传递鼠标位置
}

aa.wndproc = function(hwnd,message,wParam,lParam){ 
	if(message==0x5){
		var width = lParam & 0xFFFF;  // 获取新宽度
        var height = (lParam >> 16) & 0xFFFF; // 获取新高度

        // 更新边框控件位置
        // 更新边框控件(保留5像素边框)
        aa.borderTop.right = width;
        aa.borderBottom.right = width;
        aa.borderBottom.top = height - 5;
        aa.borderLeft.bottom = height;
        aa.borderRight.left = width - 5;
        aa.borderRight.bottom = height;

	}
}	
win.loopMessage();

现在用四个静态控件当边框用,请大佬改一改能不能用简单的方法实现?用gdip、plus没搞成功。

最新回复 (10)
  • 瞌睡蟲子 5天前
    0 2

    不是有现成的么,mouse.screenArea 

    //截屏选区
    import gdip.snap;
    import mouse.screenArea;
    var screenArea = mouse.screenArea();
    screenArea.onSelectionChanged = function(rc){
    
        var bmp = gdip.snap.file("/test.jpg",screenArea.hwnd,rc);
        owner.close();
    
        raw.explore("/test.jpg");
    }
    screenArea.doModal();


  • 光庆 4天前
    1 3
    https://aardio.online/thread-595.htm
  • zpzlj178 4天前
    0 4
    光庆 https://aardio.online/thread-595.htm
    范例的是自由截屏,我现在要控件截屏。 大佬,我就是想知道,在aaa中为什么用gdip画边框不行,怎么随窗口变化?
  • 光庆 4天前
    0 5
    zpzlj178 范例的是自由截屏,我现在要控件截屏。 大佬,我就是想知道,在aaa中为什么用gdip画边框不行,怎么随窗口变化?
    有现成的库,直接用就行,没必要自己再造轮子吧。至于在aaa中用gdip画边框不行,这个不是很清楚,目前gdip绘图基本上没发现什么问题,不知道你的问题是怎么产生的。
  • 8608074 4天前
    0 6

    学习嘛!奇怪了,那个框框总是画不出来,应该放哪里呢?

      import gdip;
         //创建画板
    	var graphics = gdip.graphics( aa )  
    	
    	//创建画笔,画笔pen只能画一个轮廓(画线) 
    	var pen = gdip.pen( 0xFFFF0000, 5, 2/*_GdipUnitPixel*/ );
    
    
    aa.onActivate = function(state,hwndOther,minimized){
    	if(state){
    		aa.transparent(80);	//半透明
    		var rc=aa.getRect();   
    	   graphics.drawRectangle( pen, 0, 0,rc.right,rc.bottom);
    	}
    } 
    
    aa.onMouseDown  = function(wParam,lParam){
    	aa.show(false);	
    	//发一个自定义消息
    	::User32.PostMessage(aa.parent.hwnd, 0x801, wParam,lParam ); // 发送自定义消息,lParam传递鼠标位置
    }
    aa.onDrawBackgroundEnd = function(hdc,rc){
        //graphics.drawRectangle( pen, 0, 0,width, height);
    }
    aa.onSize = function( width,height,wParam ) {	
    	  graphics.drawRectangle( pen, 0, 0,width,height);
    	    }
    aa.wndproc = function(hwnd,message,wParam,lParam){ 
    	if(message==0x5){
    		var width = lParam & 0xFFFF;  // 获取新宽度
            var height = (lParam >> 16) & 0xFFFF; // 获取新高度
    /**
            // 更新边框控件位置
            // 更新边框控件(保留5像素边框)
            aa.borderTop.right = width;
            aa.borderBottom.right = width;
            aa.borderBottom.top = height - 5;
            aa.borderLeft.bottom = height;
            aa.borderRight.left = width - 5;
            aa.borderRight.bottom = height;
    **/
        graphics.drawRectangle( pen, 0, 0,width, height);
    	}
    }	
    win.loopMessage();


  • 8608074 4天前
    0 7
    已经证在主窗口给aa画矩形可行,放aaa代码单元就是不行
  • 8608074 4天前
    0 8

    在主窗口中可以实现,但是

    var aa = mainForm.loadForm("\dlg\aaa.aardio");
    var rcc =::RECT();
    //aa.modifyStyleEx(,0x00FF0000)
    aa.show(3)
    //rcc=win.getRect(aa.hwnd,true)//获取初始全屏矩形区域
    aa.show(false)
    
    
    mainForm.button.oncommand = function(id,event){	
    	//aa.setRect(rcc);	//恢复初始大小
    	aa.show(3)
        mainForm.show(false);
    };
    
    
    import win.dlg.message;
    var msgDlg = win.dlg.message(mainForm); 
    
     import gdip.graphics;
     import gdip.pen;
     import gdip.snap;
     //创建画板
    var graphics = gdip.graphics( aa )  
    //创建画笔,画笔pen只能画一个轮廓(画线) 
    var pen = gdip.pen( 0xFFFF0000, 5, 2/*_GdipUnitPixel*/ );
    
    
    //接收一个自定义消息
    mainForm.wndproc = function(hwnd,message,wParam,lParam){ 
    	if(message==0x801){
    		var x,y = win.getMessagePos(lParam);
    		
        	mainForm.static3.text = "屏幕坐标" ++ tostring(x) ++ ", " ++ tostring(y);
        	var 子窗口=winex.fromPointReal(x,y,0);//获取子窗口/控件句柄
        	
        	//aa.autoResize = false;
        	var rc =win.getRect(子窗口,true)  //获取子窗口区域
    		aa.setRect(rc);	
    		aa.show();
    		graphics.drawRectangle( pen, 0, 0,aa.width,aa.height);//加一个框框

    但是如果下面两行删除后,画的矩形只有半个,不知道为什么

    aa.show(3)
    //rcc=win.getRect(aa.hwnd,true)//获取初始全屏矩形区域
    aa.show(false)


  • 光庆 4天前
    0 9
    aa.wndproc = function(hwnd,message,wParam,lParam){ 
    	if message==0xF/*_WM_PAINT*/{
    		var hdc = ::GetDC(hwnd)
    		var gra =  gdip.graphics(hdc)
    		var pen = gdip.pen( 0xFF0000FF, 5, 2/*_GdipUnitPixel*/ );
    		gra.drawRectangle(pen,10,10,aa.width-20,aa.height-20)
    		gra.delete()
    		pen.delete()
    		::ReleaseDC(hwnd,hdc)
    	}
    }


    上传的附件:
  • zpzlj178 3天前
    0 10
    大佬,可行,但 ::ReleaseDC(hwnd,hdc)报错
  • 光庆 3天前
    0 11
    zpzlj178 大佬,可行,但 ::ReleaseDC(hwnd,hdc)报错

    将getwindowdc改用getdc试试,参考上面的代码,我改了一下,你复制就行

返回
发新帖