怎么把一段字符串一一个圆形的方式显示在一副图片的上面。
就好像一个图章一样。

解决方案 »

  1.   

    圆形必须设置字体.
    BOOL CreateFontIndirect(
       const LOGFONT* lpLogFont 
    );
    LOGFONT结构
    中设置字体信息
      

  2.   

    一个简单的例子!
    void CRotateDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CPaintDC dc(this); CRect rc; 
    GetClientRect(rc); 
    CString str(_T("............运行结果!")); 
    int nOldMode=dc.SetBkMode(TRANSPARENT); 
    COLORREF clrOld=dc.SetTextColor(RGB(0,0,255)); 
    CFont font; 
    LOGFONT lf; 
    memset(&lf,0,sizeof(LOGFONT));
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT),sizeof(lf),&lf);
    lf.lfHeight = -14; 
    lf.lfWeight = FW_NORMAL; 
    lf.lfClipPrecision = CLIP_LH_ANGLES; 
    for (int i=0;i<3600;i+=150) 

    lf.lfEscapement = i; 
    font.CreateFontIndirect(&lf); 
    CFont *pOldFont = dc.SelectObject(&font); 
    dc.TextOut(rc.right/2, rc.bottom/2,str); 
    dc.SelectObject(pOldFont); 
    font.DeleteObject(); 
    }
    dc.SetBkMode(nOldMode);
    dc.SetTextColor(clrOld);
    CDialog::OnPaint();
    }
    }
      

  3.   

    我把我的想法再详细的说一下:
    在程序初始化的时候,我装载了一个bmp文件
    在窗口上又个 Edit 控件,我在里面输入汉字
    点击显示按钮,想在装载的这个bmp 图像上面显示我输入的汉字。
    程序如下:
    void CsigilDlg::OnPaint() 

    ....
    CPaintDC dc(this);
    HBITMAP bitmap = ::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC));
    HDC hdc= ::CreateCompatibleDC(NULL);
    SelectObject(hdc,bitmap);
    ::StretchBlt(dc.m_hDC,0,0,350,350,hdc,0,0,250,250,SRCCOPY);
    ::DeleteDC(hdc);
    ::DeleteDC(dc);
    ::DeleteObject(bitmap);
    CDialog::OnPaint();
    }void CsigilDlg::OnBnClickedOk()
    {
     TODO: 在此添加控件通知处理程序代码
    UpdateData(1);
    int x , y;
    double mm , xx;
    int len = this->m_edit.GetLength();
    int n = len/2; //汉字个数
    int TmpAngle = 270/(n-1);//临时定义印章的夹角范围为270度,以左225度到315度从左开始
    for (int i = 0; i< n ; i++)
    {
    int Angle = 225-TmpAngle*i;
    if (Angle < 0)
    {
    Angle = 315+TmpAngle*(n-i-1);
    }
     x =  (cos(3.14*Angle/180)*r);
     x=cx + x;
     y = cy - (sin(3.14*Angle/180)*r);
     xx =450 - Angle ;
     mm = fmod(xx,360);
    m_edit = m_edit.Left(1);
    TTextOut(mm, x, y, m_edit);
    }
    }void CsigilDlg::TTextOut(int Angle,int q,int w,CString AStr)
    {
    CPaintDC dc(this);
    dc.SetBkMode(TRANSPARENT);
    CFont AFont; LOGFONT logFont;
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT),sizeof(logFont),&logFont);
    // 为新字体设置旋转属性
    HBITMAP bitmap = ::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC));
    HDC dc= ::CreateCompatibleDC(NULL);
    SelectObject(dc,bitmap);
    ::StretchBlt(dcc.m_hDC,0,0,350,350,dc,0,0,250,250,SRCCOPY);
    logFont.lfHeight = 50 ;
    logFont.lfWeight = FW_NORMAL; 
    logFont.lfClipPrecision = CLIP_LH_ANGLES;
    logFont.lfEscapement = -Angle*10; //设置顺时针方向与X轴的夹角
    logFont.lfOrientation = -Angle*10;
    AFont.CreateFontIndirect(&logFont);
    CFont *pOldFont = dc.SelectObject(&AFont);
    dc.TextOut(100,100,"11");
    dc1.SelectObject(pOldFont); 
    dc1.TextOut(q,w,AStr);
    AFont.DeleteObject(); 
    ::DeleteDC(dc1);
    ::DeleteDC(dc);
    }
    一直没有反应,要不就是出错。
    哪个大哥帮我看看啊。
      

  4.   

    上面的写错了,是这个  
    程序如下:  
    void  CsigilDlg::OnPaint()    
    {    
    ....  
    CPaintDC  dc(this);  
    HBITMAP  bitmap  =  ::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC));  
    HDC  hdc=  ::CreateCompatibleDC(NULL);  
    SelectObject(hdc,bitmap);  
    ::StretchBlt(dc.m_hDC,0,0,350,350,hdc,0,0,250,250,SRCCOPY);  
    ::DeleteDC(hdc);  
    ::DeleteDC(dc);  
    ::DeleteObject(bitmap);  
    CDialog::OnPaint();  
    }  
     
    void CsigilDlg::TTextOut(int Angle,int q,int w,CString AStr)
    {
    CPaintDC dc1(this);
    dc1.SetBkMode(TRANSPARENT);
    CFont AFont; LOGFONT logFont;
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT),sizeof(logFont),&logFont);
    // 为新字体设置旋转属性
    HBITMAP bitmap = ::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC));
    HDC dc= ::CreateCompatibleDC(NULL);
    SelectObject(dc,bitmap);
    ::StretchBlt(dc1.m_hDC,0,0,350,350,dc,0,0,250,250,SRCCOPY);
    logFont.lfHeight = 50 ;
    logFont.lfWeight = FW_NORMAL; 
    logFont.lfClipPrecision = CLIP_LH_ANGLES;
    logFont.lfEscapement = -Angle*10; //设置顺时针方向与X轴的夹角
    logFont.lfOrientation = -Angle*10;
    AFont.CreateFontIndirect(&logFont);
    CFont *pOldFont = dc1.SelectObject(&AFont);
    dc1.TextOut(q,w,AStr);
    AFont.DeleteObject(); 
    ::DeleteDC(dc1);
    }void CsigilDlg::OnBnClickedOk()
    {
     //TODO: 在此添加控件通知处理程序代码
    UpdateData(1);
    int x , y;
    double mm , xx;
    int len = this->m_edit.GetLength();
    int n = len/2; //汉字个数
    int TmpAngle = 270/(n-1);//临时定义印章的夹角范围为270度,以左225度到315度从左开始
    for (int i = 0; i< n ; i++)
    {
    int Angle = 225-TmpAngle*i;
    if (Angle < 0)
    {
    Angle = 315+TmpAngle*(n-i-1);
    }
     x =  (cos(3.14*Angle/180)*r);
     x=cx + x;
     y = cy - (sin(3.14*Angle/180)*r);
     xx =450 - Angle ;
     mm = fmod(xx,360);
    m_edit = m_edit.Left(1);
    TTextOut(mm, x, y, m_edit);
    }
    }
    一直没有反应,要不就是出错。  
    哪个大哥帮我看看啊。
      

  5.   

    谢谢  fanqing(火影忍者+26%)
    我找到错误了,现在已经显示出来了。