改变按钮文本颜色

光庆 3月前 621

   

Code AardioLine:24复制
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
    • 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();
    Code AardioLine:28复制
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
    • 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)
    • 近我者赤 3月前
      0 2

      大佬无所不能

    • Mr_MAO 3月前
      0 3

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

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

      Code AardioLine:42复制
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.
    • 19.
    • 20.
    • 21.
    • 22.
    • 23.
    • 24.
    • 25.
    • 26.
    • 27.
    • 28.
    • 29.
    • 30.
    • 31.
    • 32.
    • 33.
    • 34.
    • 35.
    • 36.
    • 37.
    • 38.
    • 39.
    • 40.
    • 41.
    • 42.
      • 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格式,可以实现简单的背景透明)

      Code AardioLine:48复制
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.
    • 19.
    • 20.
    • 21.
    • 22.
    • 23.
    • 24.
    • 25.
    • 26.
    • 27.
    • 28.
    • 29.
    • 30.
    • 31.
    • 32.
    • 33.
    • 34.
    • 35.
    • 36.
    • 37.
    • 38.
    • 39.
    • 40.
    • 41.
    • 42.
    • 43.
    • 44.
    • 45.
    • 46.
    • 47.
    • 48.
      • 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 ...
      不错,厉害!
    返回