博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用vc+如何添加特殊字符的控件(创世纪篇)
阅读量:6213 次
发布时间:2019-06-21

本文共 6247 字,大约阅读时间需要 20 分钟。

hot3.png

   一些特殊字符的输入,在office软件中有特殊字符对话框:图

在搜狗输入法中输入特殊字符:图

这些特殊字符的开发都可以使用vc+添加控件来插入那些特殊字符。

let'start.

使用VC+从 CStatic 派生一个新的类,我命名为 CStcImageFont,头文件如下.

 

#pragma once

// CStcImageFont
class CStcImageFont : public CStatic
{
    DECLARE_DYNAMIC(CStcImageFont)
public:
    CStcImageFont();
    virtual ~CStcImageFont();
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg 
void OnPaint();
private:
    CDC        *m_dcFont ;
    CBitmap *m_bmFont ;
    
int      m_iRowX ;
    
int      m_iRowY ;
    
int      m_iCurPos ;
    
//垂直滚动条
    CScrollBar*        m_pScrollBar;
    CStringList     m_strList ;
    CRect           m_rClient ;
    CString  m_strSelText ;
    
double     m_dXSpace ;
    
double     m_dYSpace ;
public:
    
void     SetRowXY(int iRowX , int iRowY ) ;
    
int      GetRowX( void ) ;        
    
int      GetRowY( void ) ;
    
void     SetCurPos(int iPos ) ;
    
int      GetCurPos(void ) ;
    
void     Init() ;
    CString  GetSelText(
void) ;
    
    afx_msg 
int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg 
void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg 
void OnLButtonDblClk(UINT nFlags, CPoint point);
    afx_msg UINT OnNcHitTest(CPoint point);
};

 

实现文件如下 CPP

 

// StcImageFont.cpp : 实现文件

//
#include "stdafx.h"
#include "TestImageSymbol.h"
#include "StcImageFont.h"
#include ".stcimagefont.h"
// CStcImageFont
IMPLEMENT_DYNAMIC(CStcImageFont, CStatic)
CStcImageFont::CStcImageFont()
{
    m_iRowX = 10 ;
    m_iRowY = 10 ;
    m_pScrollBar = NULL ;
    m_dcFont = NULL ;
    m_bmFont = NULL ;    
    m_iCurPos = 0 ;
    m_strSelText.Empty() ;
}
CStcImageFont::~CStcImageFont()
{
    
if ( m_pScrollBar != NULL ) 
    
{
        delete m_pScrollBar ;
    }
    
if ( m_dcFont != NULL )
    
{
        delete m_dcFont ;
    }
    
if ( m_bmFont!= NULL )
    
{
        delete m_bmFont ;
    }
}
void CStcImageFont::Init() 
{
    unsigned 
char ss[3];
    CString  TempStr;
    
for(int i = 161; i <= 254; i++) 
    
{
      
for(int j = 161; j <= 254; j++) 
      
{
            ss[0] = i;
            ss[1] = j;
            ss[2] = 0;
            TempStr.Format("%s",ss) ;
            
//滤掉无法显示的部分
            if( TempStr.IsEmpty() || TempStr == " " || TempStr == "  "  ) continue;
            
if( i == 162 && j >= 171 && j <= 176) continue;
            
if( i == 162 && j >= 227 && j <= 228) continue;
            
if( i == 162 && j >= 239 && j <= 240) continue;
            
if( i == 162 && j >= 253 && j <= 254) continue;
            
if( i == 164 && j >= 244 && j <= 254) continue;
            
if( i == 165 && j >= 247 && j <= 254) continue;
            
if( i == 166 && j >= 185 && j <= 254) continue;
            
if( i == 167 && j >= 194 && j <= 254) continue;
            
if( i == 168 && j >= 193 && j <= 196) continue;
            
if( i == 168 && j >= 234 && j <= 254) continue;
            
if( i == 169 && j >= 161 && j <= 163) continue;
            
if( i == 169 && j >= 240 && j <= 254) continue;
            
if( i > 169 && i < 176 ) continue;
            
if( i >= 248 ) continue;
            m_strList.AddTail(TempStr)  ;
        }
    } 
    
if(m_pScrollBar==NULL)
    
{
        m_pScrollBar=
new CScrollBar();
    }
    RECT rc;
    GetClientRect(&rc);
    m_rClient.CopyRect(&rc) ;
    rc.left=rc.right-18;
    m_pScrollBar->Create(SBS_VERT|WS_VISIBLE|WS_CHILD,rc,
this,1);
    SCROLLINFO si;
    si.cbSize=sizeof(SCROLLINFO);
    si.fMask=SIF_POS|SIF_RANGE|SIF_TRACKPOS;
    si.nMax=m_strList.GetCount()/(m_iRowX*m_iRowY ) ;
    si.nMin=0;
    si.nPos=0;
    si.nTrackPos=0;
    si.nPage=0;
    m_pScrollBar->SetScrollInfo(&si);
    m_dXSpace =(
double)( (double)(m_rClient.Width() - 18 ) / (double)m_iRowX ) ;
    m_dYSpace =(
double)( (double)m_rClient.Height() / (double)m_iRowY );

CPaintDC dc(
this
);
    m_dcFont = 
new
 CDC() ;
    m_bmFont = 
new
 CBitmap() ;
    m_bmFont->CreateCompatibleBitmap(&dc,m_rClient.Width() - 18 , m_rClient.Height() ) ;
    m_dcFont->CreateCompatibleDC(&dc) ;
    m_dcFont->SelectObject(m_bmFont) ;
    InvalidateRect(&m_rClient);
}
BEGIN_MESSAGE_MAP(CStcImageFont, CStatic)
    ON_WM_PAINT()
    ON_WM_CREATE()
    ON_WM_VSCROLL()
    ON_WM_LBUTTONDBLCLK()
    ON_WM_NCHITTEST()
END_MESSAGE_MAP()
// CStcImageFont 
消息处理程序
void
 CStcImageFont::OnPaint()
{
    CPaintDC dc(
this
); 
// device context for painting
    CPen pen(PS_SOLID,1,RGB(0,0,0)) ;
    CPen *pOldPen = m_dcFont->SelectObject(&pen) ;
    
//
绘制字体
    m_dcFont->FillSolidRect(0,0,m_rClient.Width()-18 , m_rClient.Height() , RGB(255,255,255)) ;
    
int
 i , j   ;
    
for
 ( i = 0 ; i <= m_iRowX ; i++ )
    
{
        m_dcFont->MoveTo(i*m_dXSpace , 0 ) ;
        m_dcFont->LineTo(i*m_dXSpace ,m_rClient.Height() ) ;
    }
    
for
 ( j = 0 ; j < m_iRowY ; j++ )
    
{
        m_dcFont->MoveTo(0 , j*m_dYSpace) ;
        m_dcFont->LineTo(m_rClient.Width()-18 ,j*m_dYSpace  ) ;
    }
    m_dcFont->SelectObject(pOldPen) ;
    
for
 ( j = 0 ; j < m_iRowY ; j++ )
    
{
        
for
 ( i = 0 ; i < m_iRowX ; i++ ) 
        
{
            RECT rc ;
            rc.left = m_rClient.left + m_dXSpace * i ;
            rc.top  = m_rClient.top  + m_dYSpace * j ;
            rc.right = rc.left + m_dXSpace ;
            rc.bottom = rc.top + m_dYSpace ;
            POSITION pos = m_strList.FindIndex(m_iCurPos*m_iRowX * m_iRowY + j*m_iRowX + i ) ;
            
if
 ( pos != NULL )
            
{
                m_dcFont->DrawText(m_strList.GetAt(pos) , &rc , DT_CENTER |DT_VCENTER | DT_SINGLELINE ) ;
            }
        }
    }
    dc.BitBlt(m_rClient.left,m_rClient.top ,m_rClient.Width()-18 ,m_rClient.Height() ,m_dcFont,0,0,SRCCOPY ) ;
    
}
int
 CStcImageFont::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    
if
 (CStatic::OnCreate(lpCreateStruct) == -1)
        
return
 -1;
    
// TODO:  
在此添加您专用的创建代码
    
return
 0;
}
void
 CStcImageFont::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    
// TODO: 
在此添加消息处理程序代码和
/
或调用默认值
    
int
 pos=m_pScrollBar->GetScrollPos(); 
    
switch
(nSBCode)
    
{
    
case
 SB_LINEDOWN :    pos+=1;        
break
;
    
case
 SB_LINEUP :    pos-=1;        
break
;
    
case
 SB_PAGEUP:        pos -= 1 ;    
break
 ;
    
case
 SB_PAGEDOWN:    pos += 1 ;    
break
 ;
    
case
 SB_THUMBTRACK : pos=nPos;    
break
;
    
default
 : 
break
;
    }
    m_pScrollBar->SetScrollPos(pos);
    m_iCurPos=m_pScrollBar->GetScrollPos(); 
    InvalidateRect(&m_rClient);
    CStatic::OnVScroll(nSBCode, nPos, pScrollBar);
}
void
 CStcImageFont::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    
// TODO: 
在此添加消息处理程序代码和
/
或调用默认值
  
    
int
 i , j  ;
    
int
 xIndex =-1 ;
    
int
 yIndex =-1 ;
    
for
 ( j = 0 ; j < m_iRowY ; j++ )
    
{
        
for
 ( i = 0 ; i < m_iRowX ; i++ ) 
        
{
            RECT rc ;
            rc.left = m_rClient.left + m_dXSpace * i ;
            rc.top  = m_rClient.top  + m_dYSpace * j ;
            rc.right = rc.left + m_dXSpace ;
            rc.bottom = rc.top + m_dYSpace ;
            
if
 ( ::PtInRect(&rc,point) ) 
            
{
                xIndex = i ;
                yIndex = j ;
            }
        }
        
if
 ( xIndex != -1 && yIndex !=-1 ) 
break
 ;
    }
    
    POSITION pos = m_strList.FindIndex(m_iCurPos*m_iRowX * m_iRowY + yIndex*m_iRowX + xIndex ) ;
    
if
 ( pos != NULL )
    
{
        m_strSelText = m_strList.GetAt(pos) ;
    }
    CStatic::OnLButtonDblClk(nFlags, point);
}
CString CStcImageFont::GetSelText() 
{
    
return
 m_strSelText ;
}
UINT CStcImageFont::OnNcHitTest(CPoint point)
{
    
// TODO: 
在此添加消息处理程序代码和
/
或调用默认值
    
return
 HTCLIENT ;
}

two,使用这个类,建立一个对话框类,在上面放一个 CSatic 控件.增加一个控件变量,CStcImageFont m_stcImageFont;编译图:

其它特殊字符的添加,按代码改吧。

adiOS

end

转载于:https://my.oschina.net/bigfool007139/blog/532197

你可能感兴趣的文章
洛谷P2469 星际竞速
查看>>
《c程序设计语言》读书笔记-4.14-定义宏交换两个参数
查看>>
Centos7 上安装mysql遇上的问题:mysql无法正常启动
查看>>
开发工具中出现报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path...
查看>>
事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序
查看>>
Centos 6 tesseract安装
查看>>
Java程序设计第一次作业
查看>>
流量异常监控
查看>>
javascript 中的location.href 并不是立即执行的,是在所在function 执行完之后执行的。...
查看>>
Learning JavaScript(0)_Concepts
查看>>
11. Django及数据库环境搭建
查看>>
28. Python编写自动化测试用例
查看>>
Java-break,continue,return用法
查看>>
jQuery Json数据格式排版高亮插件json-viewer.js的使用
查看>>
svn冲突的解决办法
查看>>
关于 Xcode bitcode 错误
查看>>
消息队列的四大典型使用场景
查看>>
JVM调优
查看>>
二阶段冲刺第四天
查看>>
Python爬虫知识点一
查看>>