明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2392|回复: 5

该死的Unicode

[复制链接]
发表于 2007-5-15 16:47:00 | 显示全部楼层 |阅读模式

请教如何将一 ads_real类型实数转化为ACHAR*类型,以便在图形中输出。

例如,我要在图形中插入“壁厚Xmm”说明语句。其中X为ads_real型实数的值。请教高手如何实现。

说明:俺的程序没有基于MFC,CString类不能用。

发表于 2007-5-15 17:33:00 | 显示全部楼层

acutprintf(_T("壁厚%lfmm"),X);

是不是?

 楼主| 发表于 2007-5-15 18:25:00 | 显示全部楼层

 多谢,如果要acedAlert()函数,或者用acdbText的setTextString函数呢

发表于 2007-5-16 01:55:00 | 显示全部楼层

extern "C" int

acedAlert(

const ACHAR * str);

strMessage to display (maximum of 132 characters with the 133rd slot reserved as the end-of-string character)

__________________________________________________________

Acad::ErrorStatus

setTextString(

const ACHAR* unnamed);

unnamedInput null-terminated text string (256 byte max)

__________________________________________________________

两个应该和上面那个一样。只要加个_T("")就行了吧。

我也是菜鸟,自己想的,呵呵。

 楼主| 发表于 2007-5-16 10:29:00 | 显示全部楼层
“MultiByteToWideChar和WideCharToMultiByte用法详解”
2006-12-27 14:50
//========================================================================
//TITLE:
//    MultiByteToWideChar和WideCharToMultiByte用法详解
//AUTHOR:
//    norains
//DATE:
//    Thursday  25-December -2006
//Environment:
//  EVC4.0 + Standard SDK
//========================================================================
  在本文开始之处,先简要地说一下何为短字符和宽字符.
  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.
  
  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.
  好吧,那就让我们开始吧.
  
  这个是我们需要转化的宽字符串:  
  wchar_t wText[20] = {L"宽字符转换实例!OK!"};
  
  我们需要知道转化后的短字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2短字符的数组,并且事实上将运行得非常轻松愉快.但假如宽字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以宽字符的个数的两倍作为短字符数组下标的声明绝对不是一个好主意.
  所幸,我们能够确知所需要的数组空间.
  我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:
  DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, wText, -1, NULL, 0);
  
  接下来,我们只需要分配响应的数组空间:
  char *psText;
  psText = new char[dwNum];
  if(!psText)
  {
   delete []psText;
  }
  
  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
  MultiByteToWideChar (CP_ACP, 0, psText, -1, wText, dwSize);
  
  最后,使用完毕当然要记得释放占用的内存:
  delete []psText;
  
 
  同理,多个短字符转为宽字符的代码如下:  
  char sText[20] = {L"宽字符转换实例!OK!"};
  DWORD dwNum = WideCharToMultiByte (CP_ACP, 0, sText, -1, NULL, 0);
  wchar_t *pwText;
  pwText = new wchar_t[dwNum];
  if(!psText)
  {
   delete []psText;
  }
  WideCharToMultiByte (CP_ACP, 0, pwText, -1, sText, dwSize);
  delete []pwText;
  
   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
   WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:
     
  //-------------------------------------------------------------------------------------
  //Description:
  // This function maps a character string to a wide-character (Unicode) string
  //
  //Parameters:
  // lpcszStr: [in] ointer to the character string to be converted 
  // lpwszStr: [out] ointer to a buffer that receives the translated string. 
  // dwSize: [in] Size of the buffer
  //
  //Return Values:
  // TRUE: Succeed
  // FALSE: Failed
  // 
  //Example:
  // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
  //---------------------------------------------------------------------------------------
  BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
  {
    // Get the required size of the buffer that receives the Unicode 
    // string. 
    DWORD dwMinSize;
    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
  
    if(dwSize < dwMinSize)
    {
     return FALSE;
    }
  
    
    // Convert headers from ASCII to Unicode.
    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  
    return TRUE;
  }
  
  //-------------------------------------------------------------------------------------
  //Description:
  // This function maps a wide-character string to a new character string
  //
  //Parameters:
  // lpcwszStr: [in] ointer to the character string to be converted 
  // lpszStr: [out] ointer to a buffer that receives the translated string. 
  // dwSize: [in] Size of the buffer
  //
  //Return Values:
  // TRUE: Succeed
  // FALSE: Failed
  // 
  //Example:
  // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
  //---------------------------------------------------------------------------------------
  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
  {
   DWORD dwMinSize;
   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
   if(dwSize < dwMinSize)
   {
    return FALSE;
   }
   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
   return TRUE;
  }
  
  
  使用方法也很简单,示例如下:
  wchar_t wText[10] = {L"函数示例"};
  char sText[20]= {0};
  WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
  MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));
  
  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.
发表于 2007-5-17 11:44:00 | 显示全部楼层

将实数转化为字符的方法用标准的C语言函数,sprintf(sTemp,"%0.2f",val);

然后在需要输入文字的地方用sTemp代替即可.

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 19:24 , Processed in 0.181543 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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