搜索
查看: 2929|回复: 2

请教DrawTextEx如何正确声明

[复制链接]

2

主题

13

帖子

221

积分

二级会员

Rank: 3Rank: 3

积分
221
发表于 2013-11-20 15:39:54 | 显示全部楼层 |阅读模式

  1. import win.ui;
  2. import gdi;
  3. /*DSG{{*/
  4. mainForm = ..win.form( parent=...;bottom=615;max=false;text="testidview";border="thin";right=590 )
  5. mainForm.add(
  6. picMain={ bottom=275;color=16777215;right=364;border=1;autosize=1;top=65;font=LOGFONT( name='宋体';h=-29 );z=1;left=36;transparent=1;cls="picturebox" };
  7. btnCreate={ bottom=507;right=502;left=403;text="重读";top=467;z=2;tabstop=1;cls="button" }
  8. )
  9. /*}}*/

  10. mainForm.btnCreate.oncommand = function(id,event){
  11.         readi();       
  12. }

  13. DrawTextEx = ::User32.api("DrawTextExA","int(pointer hdc,string lpStr,int nCount,struct& lpRect,int wFormat,struct& lpDrawTextParams)");

  14. readi = function(){

  15.     var rect1 = ::RECT();
  16.         rect1.top = 38;
  17.         rect1.bottom = rect1.top + 30;
  18.         rect1.left = 60;
  19.         rect1.right = rect1.left + 340;
  20.        
  21.         var hdc = ::GetDC(mainForm.picMain.hwnd);
  22.         ::SetBkMode(hdc, 0x1/*_TRANSPARENT*/);
  23.         ::SetTextColor(hdc, gdi.RGB( 0, 0, 0));       

  24.         DRAWTEXTPARAMS = class {
  25.                  INT cbSize;
  26.                  int iTabLength;
  27.                  int iLeftMargin;
  28.                  int iRightMargin;
  29.                  INT uiLengthDrawn;
  30.     }
  31.         dr=DRAWTEXTPARAMS();
  32.         var hi,pdr,pdr2=DrawTextEx(hdc,"aaaaaaaaaaaaaaaaaaaa6666677",-1,rect1,0x0|0x10|0x2000,dr);
  33.         import console
  34.         console.varDump(pdr,pdr2,dr);
  35.         execute("pause")
  36.         io.close();

  37.         ::DeleteObject(hFont);       
  38.         mainForm.picMain.update();   
  39.     ::ReleaseDC(mainForm.picMain.hwnd, hdc);       
  40. }
  41. mainForm.show()
  42. win.loopMessage()
复制代码

运行后 其中DrawTextEx不能显示字符串 也不能取得dr的数据
声明修改为
DrawTextEx = ::User32.api("DrawTextExA","int(pointer hdc,string lpStr,int nCount,struct& lpRect,int wFormat,pointer lpDrawTextParams)");

后运行 DrawTextEx(hdc,"aaaaaaaaaaaaaaaaaaaa",-1,rect1,0x0|0x10|0x2000,null); 可以显示出来  但无法得到dr数据
请问怎样正确声明 DrawTextEx 并取得 dr数据?
回复

使用道具 举报

5

主题

442

帖子

2420

积分

五级会员

Rank: 8Rank: 8

积分
2420
发表于 2013-11-20 17:14:22 | 显示全部楼层

你的API声明并没有错,而是使用方法错了。 cbSize 一定要指定 raw.sizeof(dr) 得出的长度 ,注意看正确的代码: [code][lang

你的API声明并没有错,而是使用方法错了。
cbSize 一定要指定 raw.sizeof(dr) 得出的长度 ,注意看正确的代码:
  1. import win.ui;
  2. /*DSG{{*/
  3. mainForm = ..win.form( parent=...;bottom=615;max=false;text="testidview";border="thin";right=590 )
  4. mainForm.add(
  5. picMain={ bottom=275;color=16777215;right=364;border=1;autosize=1;top=65;font=LOGFONT( name='宋体';h=-29 );transparent=1;left=36;z=1;cls="picturebox" };
  6. btnCreate={ bottom=507;text="重读";left=403;right=502;top=467;tabstop=1;z=2;cls="button" }
  7. )
  8. /*}}*/

  9. //结构体定义不要放到函数里面重复定义
  10. class DRAWTEXTPARAMS {
  11.     INT cbSize = 20; //必须指定此字段的值
  12.     int iTabLength;
  13.     int iLeftMargin;
  14.     int iRightMargin;
  15.     INT uiLengthDrawn;
  16. }
  17. DrawTextEx = ::User32.api("DrawTextExA"
  18.     ,"int(pointer hdc,string lpStr,int nCount,struct& lpRect,int wFormat,struct& lpDrawTextParams)");

  19. //非必要作为全局变量的前面加上 var 声明为局部变量
  20. var readi = function(){

  21.     var rect1 = ::RECT(38,60);
  22.     rect1.bottom = rect1.top + 30;
  23.     rect1.right = rect1.left + 340;

  24.     var hdc = ::GetDC(mainForm.picMain.hwnd);
  25.     ::SetBkMode(hdc, 0x1/*_TRANSPARENT*/);
  26.     ::SetTextColor(hdc, gdi.RGB( 0, 0, 0));
  27.    
  28.     var font = ::LOGFONT( name="宋体";point=12 )
  29.     ::SelectObject(hdc, font.createIndirect() );
  30.      
  31.     var dr = DRAWTEXTPARAMS(); //引用结构体参数不需要到返回值里取
  32.     var hi = DrawTextEx(hdc,"aaaaaaaaaaaaaaaaaaaa66666666677",-1,rect1,0x0|0x10|0x2000,dr);
  33.    
  34.     font.deleteIndirect();
  35.     mainForm.picMain.update();   
  36.    
  37.     ::ReleaseDC( mainForm.picMain.hwnd, hdc );       
  38. }

  39. mainForm.btnCreate.oncommand = function(id,event){
  40.     readi();       
  41. }


  42. mainForm.show()
  43. win.loopMessage();
复制代码


win.ui 程序是不需要import gdi 的,因为gdi是GUI程序默认加载的库
回复

使用道具 举报

2

主题

13

帖子

221

积分

二级会员

Rank: 3Rank: 3

积分
221
 楼主| 发表于 2013-11-20 20:00:16 | 显示全部楼层

谢谢神码! 辛苦了

谢谢神码! 辛苦了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2021-1-25 02:48 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表