• 12023阅读
  • 8回复

QT调用API函数,句柄如何处理(利用GetGlyphOutline取点阵) [复制链接]

上一主题 下一主题
离线fenger
 
只看楼主 正序阅读 楼主  发表于: 2010-07-08
近周练习用QT取文字的点阵,用了扫描方法、字库方法效果总不理想,再在终于找到一种和WIN API函数可取字模的方法,效果很好。
可问题出来了,WIN API好多参数都是传句柄的,且句柄又是不同类型,不知在QT中怎处理。
如取字模中我用到下面两个API函数:
HFONT CreateFont(
  int nHeight,               // height of font
  int nWidth,                // average character width
  int nEscapement,           // angle of escapement
  int nOrientation,          // base-line orientation angle
  int fnWeight,              // font weight
  DWORD fdwItalic,           // italic attribute option
  DWORD fdwUnderline,        // underline attribute option
  DWORD fdwStrikeOut,        // strikeout attribute option
  DWORD fdwCharSet,          // character set identifier
  DWORD fdwOutputPrecision,  // output precision
  DWORD fdwClipPrecision,    // clipping precision
  DWORD fdwQuality,          // output quality
  DWORD fdwPitchAndFamily,   // pitch and family
  LPCTSTR lpszFace           // typeface name
);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD GetGlyphOutline(
  HDC hdc,             // handle to DC
  UINT uChar,          // character to query
  UINT uFormat,        // data format
  LPGLYPHMETRICS lpgm, // glyph metrics
  DWORD cbBuffer,      // size of data buffer
  LPVOID lpvBuffer,    // data buffer
  CONST MAT2 *lpmat2   // transformation matrix
);

我的思路是,首先CreateFont中建立字体,然后GetGlyphOutline根据CreateFont中建立的字体取出点阵数据存在lpvBuffer中,
照这样,问题出来了:
1、我能不能直接用QFont 表示HFONT ,用时即是 QFont font = CreateFont(.........)
2.、CreateFont中最后一个参数LPCTSTR lpszFace ,要求是字体类型,我传字符串QString  m_lpszFace= "Arial",中m_lpszFace过去,会出现类型不正确错误.那么我应该用什么类型表示字体
3、GetGlyphOutline中要求一个HDC hdc句柄,这个句柄我从哪来呢?如我想直接将CreateFont建设立的HFONT作为句柄传过来,行不行的呢?我试了,行不通的。

主要就是上面三个问题了,下面是别人用VC取字模的一些资料,我也只是一知半解:
http://blog.csdn.net/caimouse/archive/2007/12/16/1941978.aspx
http://www.vckbase.com/document/viewdoc/?id=1614
http://www.vckbase.com/document/viewdoc/?id=1757
没有做不到,只有想不到~
离线i4455

只看该作者 8楼 发表于: 2011-05-23
能告诉我怎么弄的吗 谢谢了 邮箱是 215729271@qq.com
离线fenger
只看该作者 7楼 发表于: 2010-07-14
API取点阵终于出来啦~详情请到:
http://www.mcupark.com/html/ruanjiankaifa/QTjishu/2010/0714/887.html
没有做不到,只有想不到~
离线fenger
只看该作者 6楼 发表于: 2010-07-12
有些不用处理,有些要要根据参数处理,我现在就是不知怎处理,不知GetGlyphOutline的参数HDC从哪来,
没有做不到,只有想不到~
离线cuijinquan
只看该作者 5楼 发表于: 2010-07-10
Re:(利用GetGlyphOutline取点阵)
QT调用API函数,句柄如何处理
离线fenger
只看该作者 4楼 发表于: 2010-07-09
    unsigned char strchar[10];

    //Get Local
    QByteArray ba = lineEditSource.text().toLocal8Bit();
    int lenght = ba.length();
    for(int i=0;i<lenght;i++)
    {
         strchar =ba;
        qDebug("%d",strchar);
    }

    MAT2 mat2={0,1,0,0,0,0,0,1};
    GLYPHMETRICS gm;
    DWORD nLen;
    UINT chText;
    BYTE temp;
    temp=strchar[0];

    if(temp>=128)
    {
        chText=((UINT)temp)<<8;
        temp=strchar[1];
        chText+=temp;
    }
    else
        chText=temp;

    //获取这个字符图形需要的字节的大小。
    DWORD dwNeedSize = GetGlyphOutline(widget->getDC(),chText,GGO_BITMAP,&gm,0,NULL,&mat2);
这样编程能通过,可问题又来了,不知是不是getDC()这句柄的问题,dwNeedSize 一直大于FFFF的,原则上dwNeedSize 应该在0-FFFF之间的
没有做不到,只有想不到~
离线fenger
只看该作者 3楼 发表于: 2010-07-09
定义了 HFONT hFont字体,可又转不行QFont,用setFont(nFont)会出错。

cahwxy,请问用QT提供的哪个接口呢?能提示一二吗?
没有做不到,只有想不到~
离线cahwxy

只看该作者 2楼 发表于: 2010-07-08
你可以直接使用Qt 提供的接口
离线fenger
只看该作者 1楼 发表于: 2010-07-08
用下面方法取字体编译能通过了,但不是不知怎把这字体与GetGlyphOutline的句柄关联在一起~
    HFONT hFont;// = GetFont();
    QString m_FontName = tr("Arial");
    hFont = CreateFont(20,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                DEFAULT_CHARSET,
                OUT_CHARACTER_PRECIS,
                CLIP_CHARACTER_PRECIS,
                DEFAULT_QUALITY,
                DEFAULT_PITCH|FF_DONTCARE,
               (wchar_t*) (m_FontName.utf16()));
没有做不到,只有想不到~
快速回复
限100 字节
 
上一个 下一个