改变按钮文本颜色

光庆 6天前 273

   

import win.ui;
/*DSG{{*/
var winform = win.form(text="改变按钮颜色示例";right=279;bottom=239;composited=1)
winform.add(
button={cls="button";text="点这里1";left=16;top=104;right=261;bottom=159;font=LOGFONT(h=-14);z=1};
button2={cls="button";text="点这里2";left=16;top=168;right=261;bottom=223;font=LOGFONT(h=-14);z=3};
edit={cls="edit";text="Edit";left=16;top=16;right=264;bottom=96;edge=1;multiline=1;z=2}
)
/*}}*/
import raw.apiHook
raw.apiHook(
	"user32.dll",
	"DrawTextExW",
	"int(ptr,ptr,int,ptr,int,ptr)", 
	function(hdc,lpchText,cchText,rect,format,lpdtp){
		var str = ..string.fromUtf16(..raw.str(lpchText,true));
		if str="点这里1" ::Gdi32.SetTextColor(hdc,0x0000FF);
		elseif str="点这里2" ::Gdi32.SetTextColor(hdc,0xFF0000);
		owner.callApi(hdc,lpchText,cchText,rect,format,lpdtp); 
		return true;
	}
).install();
winform.show();
win.loopMessage();
import win.ui;
/*DSG{{*/
var winform = win.form(text="改变按钮颜色示例";right=279;bottom=239;composited=1)
winform.add(
button={cls="button";text="点这里1";left=16;top=104;right=261;bottom=159;font=LOGFONT(h=-14);z=1};
button2={cls="button";text="点这里2";left=16;top=168;right=261;bottom=223;font=LOGFONT(h=-14);z=3};
edit={cls="edit";text="Edit";left=16;top=16;right=264;bottom=96;edge=1;multiline=1;z=2}
)
/*}}*/
import raw.apiHook
raw.apiHook(
    "user32.dll",
    "DrawTextExW",
    "int(ptr,ptr,int,ptr,int,ptr)", 
    function(hdc,lpchText,cchText,rect,format,lpdtp){
        var str = ..string.fromUtf16(..raw.str(lpchText,true));
        if str="点这里1" ::Gdi32.SetTextColor(hdc,0x0000FF);
        elseif str="点这里2" ::Gdi32.SetTextColor(hdc,0xFF0000);
        var rc = ::RECT();
        ..raw.convert(rect,rc);
        rc.right-=100;
        gdi.fillRect(hdc,0x00FF00,rc);
        owner.callApi(hdc,lpchText,cchText,rect,format,lpdtp); 
        return true;
    }
).install();
winform.show();
win.loopMessage();


最新回复 (4)
  • 近我者赤 6天前
    0 2

    大佬无所不能

  • Mr_MAO 3天前
    0 3

     win32的按钮本来就不好修改,大佬提供了一种很简单的方法。
    记得以前有个编程场景,本来想模仿"迅雷"软件菜单中"退出"项文本颜色为红色的功能,奈何水平有限加之自绘太麻烦一直未实现成为一个小遗憾。

    现在,光大介绍的这种办法就可以很简单了,非常感谢!~

    import win.ui;
    var winform = win.form(text="改变menu文本颜色";right=500;bottom=300)
    
    import win.ui.menu; 
    import raw.apiHook;
    
    var hookTextcolor =  raw.apiHook(
        "user32.dll",
        "DrawTextExW",
        "int(ptr,ptr,int,ptr,int,ptr)", 
        function(hdc,lpchText,cchText,rect,format,lpdtp){
            var str = ..string.fromUtf16(..raw.str(lpchText,true));
            if(str=="退出") ::Gdi32.SetTextColor(hdc,0x0000FF);
    
            owner.callApi(hdc,lpchText,cchText,rect,format,lpdtp); 
            return true;
        }
    ).install();
    
    winform.wndproc = function(hwnd,message,wParam,lParam){
        select( message ) { 
            case 0x205/*_WM_RBUTTONUP*/{
                var x,y = win.getMessagePos(lParam);
                
                popmenu = win.ui.popmenu(winform) 
    			popmenu.add("最大化",function(){
                    winform.hitMax()
                })
                popmenu.add("最小化",function(){
                    winform.hitMin()
                })
                popmenu.add()
                popmenu.add("退出",function(){
                    winform.close()
                })
                popmenu.popup(x,y,false);
            }
        }
    }
    
    winform.show();
    win.loopMessage();



  • Mr_MAO 3天前
    0 4

    又试了一下,用光大这种方法,也可以方便的给按钮加图片。(png格式,可以实现简单的背景透明)

    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="给按钮加png图片";right=279;bottom=239;composited=1)
    winform.add(
    button={cls="button";text="点这里1";left=16;top=104;right=261;bottom=159;font=LOGFONT(h=-14);z=1};
    button2={cls="button";text="点这里2";left=16;top=168;right=261;bottom=223;font=LOGFONT(h=-14);z=3};
    edit={cls="edit";text="Edit";left=16;top=16;right=264;bottom=96;edge=1;multiline=1;z=2}
    )
    /*}}*/
    
    import inet.http;
    import gdip.bitmap;
    var bmp = gdip.bitmap("https://pnghq.com/wp-content/uploads/light-bulb-png-transparent-elements.png") //加载一张网络png图片
    var w , h = bmp.width , bmp.height;
    hbmp = bmp.copyHandle();
    
    import raw.apiHook;
    raw.apiHook(
        "user32.dll",
        "DrawTextExW",
        "int(ptr,ptr,int,ptr,int,ptr)", 
        function(hdc,lpchText,cchText,rect,format,lpdtp){
            ::Msimg32 := raw.loadDll( "Msimg32.dll" )
            var str = ..string.fromUtf16(..raw.str(lpchText,true));
            //按钮文字加颜色
            if(str=="点这里1") ::Gdi32.SetTextColor(hdc,0x0000FF);
            elseif(str=="点这里2") ::Gdi32.SetTextColor(hdc,0xFF0000);
            
            //按钮加图片
            if(str=="点这里1"){
            	var rc = ::RECT();
            	..raw.convert(rect,rc);
            	rc.setPos(100,30,40,40)
    
            	var x2,y2,w2,h2 = rc.xywh();
            	var hMemDc = ::CreateCompatibleDC(hdc); 
            	::SelectObject(hMemDc, hbmp); 
            	::Msimg32.TransparentBlt(hdc, x2,y2,w2,h2, hMemDc,0, 0, w, h, 0x808080/*透明色*/ ) //背景透明贴图
            	::DeleteDC(hMemDc); 
            }
            
            owner.callApi(hdc,lpchText,cchText,rect,format,lpdtp); 
            return true;
        }
    ).install();
    
    winform.show();
    win.loopMessage();




  • 光庆 3天前
    0 5
    Mr_MAO 又试了一下,用光大这种方法,也可以方便的给按钮加图片。(png格式,可以实现简单的背景透明)import win.ui; /*DSG{{*/ var winfo ...
    不错,厉害!
返回