有VC做一个特殊字符的选择控件

1.在Office里面有一个 特殊字符的对话框.

我们也自己做一个这个类似的控件来插入那些特殊字符.

2.说做就做,begin...........

用从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 <= 176continue;
            
if( i == 162 && j >= 227 && j <= 228continue;
            
if( i == 162 && j >= 239 && j <= 240continue;
            
if( i == 162 && j >= 253 && j <= 254continue;
            
if( i == 164 && j >= 244 && j <= 254continue;
            
if( i == 165 && j >= 247 && j <= 254continue;
            
if( i == 166 && j >= 185 && j <= 254continue;
            
if( i == 167 && j >= 194 && j <= 254continue;
            
if( i == 168 && j >= 193 && j <= 196continue;
            
if( i == 168 && j >= 234 && j <= 254continue;
            
if( i == 169 && j >= 161 && j <= 163continue;
            
if( i == 169 && j >= 240 && j <= 254continue;
            
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 ;
}

 

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

效果如下.

4.完工^V^,要做成其它的就按代码各人改吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangxingbin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值