【作图】在图片上直接敲入字符

原创 2004年06月15日 10:54:00

【作图】在图片上直接敲入字符

作者:enoloo

在论坛经常看到提出怎么在图片上直接敲入字符。今天又碰到一个,于是趁着月黑风高写了几个小程序。

第一个程序,效果图如下:

 效果图

 

第二个程序,效果如下:

 效果图

 

[说明]

第一个程序:
开始想到的。用半透明文本框(真是很不爽,搞了半天截图软件也不能截取透明窗口的像样图片 @_@)。没有用SDK,用USER32.dll的函数SetLayeredWindowAttributes。网上有很多这方面的介绍。主要是:
1, m_hDll = ::LoadLibrary(_T("USER32.dll"));


2, ::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);


3, if (m_hDll)
 {
  lpfnSetLayeredWindowAttributes pFn = NULL;
  pFn = (lpfnSetLayeredWindowAttributes)GetProcAddress(m_hDll, "SetLayeredWindowAttributes");
  if (pFn)
  {
   bRetValue = pFn(hWnd, crKey, bAlpha, dwFlags);
  } 
 }


4, if (m_hDll) ::FreeLibrary(m_hDll);
 m_hDll = NULL;

5, 有几个标志WS_EX_LAYERED等需要define一下。
#define WS_EX_LAYERED           0x00080000
#define LWA_COLORKEY            0x00000001
#define LWA_ALPHA               0x00000002

 

在某个窗体上随便写文字,还是老办法,鼠标点击的时候Create一个文本框(半透明),离开的时候把文本框中的文字写入窗口上文本框的那个位置,然后Destroy文本框。
窗口半透明之后,虽然能够看到窗口下面的东西,但是窗口里面所有的东西都半透明了,包括插入符,文字等等。所以,如果透明度很高的话,书写的文字是很难看清楚,所以,如果要实现完全透明的输入窗口并写东西,是很难控制的,因为找不到插入符在哪里。不过半透明的输入框也是挺有意思的。这个程序我没有深入写下去。

第二个程序:

功能:
1,鼠标点击窗体客户区的某个地方,产生一个插入符。
2,敲击键盘能过直接在窗体上写上字符,包括汉字,字母。因为是个测试程序,我只处理了等宽字体。
3,支持BackSpace消除字符,回车书写完毕。

因为写得比较匆忙,肯定有不少bug,我处理了一些。这算是抛砖引玉,大家有兴趣的话可以参考并完善。

程序代码(部分):
/*!
*
* 处理字符消息,并将字符写在窗体上
* /note 能处理中文,支持backspace编辑
* /bug 不支持HOME,END,LEFT,RIGHT等键,需要改进
* /bug 字符宽度需要改进,某些字体不受支持
* /author enoloo
* /date 2004-6-14 /first edition
*/
void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 // TODO: Add your message handler code here and/or call default
 if(!m_bShow)
 {
  CWnd::OnChar(nChar,nRepCnt,nFlags);
  return;
 }

 static char sTmp[3] = "";
 static BOOL bTmp = FALSE;
 CClientDC dc(this);
 dc.SetBkMode(TRANSPARENT);
 
 CRect rtTmp;
 
 if(nChar == VK_RETURN)  
 {
  m_bShow = false;
  ::HideCaret(this->GetSafeHwnd());
 }
 else if(nChar == VK_BACK)
 {
  if(m_nPos > 0)
  {
  
   --m_nPos;
   if(!bChinese)
   {
    rtTmp.left = m_xPos + m_nPos*m_xChar;
    rtTmp.top = m_yPos;
    rtTmp.right = m_xPos + m_strText.GetLength()*m_xChar;
    rtTmp.bottom = m_yPos + m_yChar;
    InvalidateRect( &rtTmp );
    ::SetCaretPos((m_xPos + m_nPos*m_xChar), m_yPos);
   
   }
   else
   {
    rtTmp.left = m_xPos + m_nPos*m_xChar*2;
    rtTmp.top = m_yPos;
    rtTmp.right = m_xPos + m_strText.GetLength()*m_xChar*2;
    rtTmp.bottom = m_yPos + m_yChar;
    InvalidateRect( &rtTmp );
    ::SetCaretPos((m_xPos + m_nPos*m_xChar*2), m_yPos);
   }
   m_strText.Delete(m_nPos);

  }
 }
 else  // 正常的字符码
 { 
  CString strTmp;
  
  if(nChar > 127 && bTmp)
  {
   sTmp[1] = nChar;
   sTmp[2] = 0;
   bChinese = true;
   bTmp = false;
  }
  else if(nChar > 127 && !bTmp)
  {
   sTmp[0] = nChar;
   bTmp = true;
   CWnd::OnChar(nChar,nRepCnt,nFlags);
   return;
  }
  else
  {
   bChinese = false;
   sTmp[0] = nChar;
   sTmp[1] = 0;
  }
  strTmp = sTmp;
  if(!bChinese)
  {
   dc.TextOut((m_xPos + m_nPos*m_xChar + 2), m_yPos, strTmp);
   ++m_nPos;
   ::SetCaretPos((m_xPos + m_nPos*m_xChar), m_yPos);
   
  }
  else
  {
   dc.TextOut((m_xPos + m_nPos*m_xChar*2 + 2), m_yPos, strTmp);
   
   ++m_nPos;
   ::SetCaretPos((m_xPos + m_nPos*m_xChar*2), m_yPos);
  }
  m_strText += strTmp;
  
  CWnd::OnChar(nChar, nRepCnt, nFlags);
  return;
 }

 CWnd ::OnChar(nChar, nRepCnt, nFlags);
}

我的免费空间正在升级,所以暂时没有空间摆上工程代码。空间好了,我会贴出来的。

 

 

 

 


 

一些你不知道的好玩的有趣的linux命令 Linux终端下的ASCII艺术

你知道吗?其实在linux 终端下也是可以玩一些简单的ASCII字符动画.每次提起linux 都觉得害怕,因为那些命令太古板太严肃了.嘿嘿,从现在开始,貌似有点乐趣了哦.当你敲代码敲累了,你可以玩玩这...
  • u010257002
  • u010257002
  • 2014年10月09日 13:08
  • 1918

图片文件,图片文件流和BASE64加密字符串之间的转换,以及图片的BASE64加密字符串再jsp上如何显示

*本事例主要讲了如下几点:  * 1:将图片转换为BASE64加密字符串.  * 2:将图片流转换为BASE64加密字符串.  * 3:将BASE64加密字符串转换为图片.  * 4:在jsp...
  • sidongxue2
  • sidongxue2
  • 2015年01月23日 00:33
  • 6679

用base64编码的字符串形式上传图片,并实时更新上传的进度条

刚做完项目里的上传图片并回调进度的需求,可谓一波三折,我就从我的开发过程中先后尝试的不同方法来总结下吧。先说下我们的需求:用base64编码上传图片,并实时更新上传的进度条。第一阶段: 由于我们项目...
  • u013168615
  • u013168615
  • 2015年12月24日 17:07
  • 4564

描述在浏览器中敲入一个网址并按下回车后所发生的事情

描述在浏览器中敲入一个网址并按下回车后所发生的事情(尽量详细) 答:浏览器输入网址之后,首先 步骤1:需要查找域名的IP地址,DNS查找过程如下: (1)浏览器缓存 – 浏览器的缓存DNS记录一...
  • hyg0811
  • hyg0811
  • 2013年09月25日 20:24
  • 2362

在浏览器中敲入一个网址并按下回车后。。。

今天看了一篇
  • wanyuteng
  • wanyuteng
  • 2014年06月22日 18:42
  • 574

从键盘敲入一系列字母,将其存储到文件中,

  • 2011年04月21日 16:18
  • 2KB
  • 下载

键盘敲入一个数并输出1~这个数的所有素数

  • 2014年06月16日 11:16
  • 418KB
  • 下载

最近的工作记录:键盘敲入的Linux Shell命令,哈哈

2023  sudo /home/cteng/ProgramFiles/Android/sdk/platform-tools/adb kill-server  2024  sudo /home/ct...
  • cteng
  • cteng
  • 2014年12月19日 13:35
  • 1154

在浏览器输入栏敲入一个网址,之后发生了那些变化?

整个查找过程是这样的: (1)根据目的地址,得到目的网络号,如果处在同一个内网,则可以直接发送。 (2)如果不是,则查询路由表,找到一个路由。 (3)如果找不到明确的路由,此时在路由表中还会有**默认...
  • u012942818
  • u012942818
  • 2015年09月09日 14:29
  • 1238

笔试题目---描述在浏览器中敲入一个网址并按下回车后所发生的事情

转自http://blog.csdn.net/hackbuteer1/article/details/11263443 答:浏览器输入网址之后,首先 步骤1:需要查找域名的IP地址,DNS查找过程...
  • cuijiyue
  • cuijiyue
  • 2013年09月08日 22:23
  • 1156
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【作图】在图片上直接敲入字符
举报原因:
原因补充:

(最多只允许输入30个字)