| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1906 人关注过本帖, 1 人收藏
标题:向hellovfp大哥及各位论坛大牛请教关于windows编程文字输出的问题
取消只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏(1)
已结贴  问题点数:99 回复次数:23 
向hellovfp大哥及各位论坛大牛请教关于windows编程文字输出的问题
程序代码:
void skyline_OnPaint(HWND hWnd)
{
    PAINTSTRUCT PaintStruct;

    HFONT OldFont;

    HDC PaintDC  = BeginPaint(hWnd, &PaintStruct);

    if (choice == StockFont)
    {
        OldFont = SelectFont(PaintDC, TheFont);
        GetTextFace(PaintDC, sizeof(aFaceName), (LPSTR)aFaceName);
        GetTextMetrics(PaintDC, &TextMets);
        SetTextColor(PaintDC, RGB(rand()%255, rand()%255, rand()%255));
        TextOut(PaintDC, 10, 10, aFaceName, strlen(aFaceName));
        TextOut(PaintDC, 10, 30, "Stock Font", 11);
        TextOut(PaintDC, 10, 50, "Ten Letters", 11);
        SelectFont(PaintDC, OldFont);
    }
    else
    {
        for (int i = 0; i <= 3; i++)
        {
            TheFont = GetFont(900 * i, FontChoice[choice]);
            OldFont = SelectFont(PaintDC, TheFont);
            SetTextColor(PaintDC, RGB(rand()%255, rand()%255, rand()%255));
            TextOut(PaintDC, 200, 200, "skyline!", 8 );
            GetTextFace(PaintDC, sizeof(aFaceName), (LPSTR)aFaceName);
            GetTextMetrics(PaintDC, &TextMets);
            SelectFont(PaintDC, OldFont);
        }
        TextOut(PaintDC, 10, 10, aFaceName, strlen(aFaceName));
    }

    EndPaint(hWnd, &PaintStruct);
}

上面是打印skyline!这行文字的旋转字体的WM_PAINT消息函数, 我把相关的变量和定义贴上
程序代码:
static LOGFONT LogFont;
static HFONT TheFont;
static char aFaceName[80];
TEXTMETRIC TextMets;
char * FontChoice[] = {"New Times Roman", "Arial", "Symbol", "StockFont"};
enum TChoice {Roman, Swiss, Symbol, StockFont};
TChoice choice;

关于choice是在WM_COMMAND下处理的
程序代码:
////////////////////////////////////
// Handle WM_COMMAND
////////////////////////////////////

#pragma argsused
void skyline_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify)
{
    char s[500];

    switch (id)
    {
    case CM_INFO:
        {
            GetFontString(s, TextMets, aFaceName);
            MessageBox(hWnd, s, "Font Info", MB_OK);
            break;
        }
    case CM_ROMAN:
        {
            choice = Roman;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_SWISS:
        {
            choice = Swiss;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_SYMBOL:
        {
            choice = Symbol;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_ANSI_FIXED_FONT:
        {
            if (TheFont != 0)
                DeleteFont(TheFont);
            TheFont = GetStockFont(ANSI_FIXED_FONT);
            choice = StockFont;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_ANSI_VAR_FONT:
        {
            if (TheFont != 0)
                DeleteFont(TheFont);
            TheFont = GetStockFont(ANSI_VAR_FONT);
            choice = StockFont;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_DEVICE_DEFAULT_FONT:
        {
            if (TheFont != 0)
                DeleteFont(TheFont);
            TheFont = GetStockFont(DEVICE_DEFAULT_FONT);
            choice = StockFont;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_OEM_FIXED_FONT:
        {
            if (TheFont != 0)
                DeleteFont(TheFont);
            TheFont = GetStockFont(OEM_FIXED_FONT);
            choice = StockFont;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_SYSTEM_FONT:
        {
            if (TheFont != 0)
                DeleteFont(TheFont);
            TheFont = GetStockFont(SYSTEM_FONT);
            choice = StockFont;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    case CM_SYSTEM_FIXED_FONT:
        {
            if (TheFont != 0)
                DeleteFont(TheFont);
            TheFont = GetStockFont(SYSTEM_FIXED_FONT);
            choice = StockFont;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
    }
}

GetFont()函数是自定义的
程序代码:
HFONT GetFont(int Escapement, char *Name)
{
    memset(&LogFont, 0, sizeof(LOGFONT));

    LogFont.lfHeight = 60;
    LogFont.lfWidth = 50;
    LogFont.lfWeight = 900;
    LogFont.lfEscapement = Escapement;
    LogFont.lfItalic = 1;
    LogFont.lfUnderline = 1;
    LogFont.lfStrikeOut = 1;
    LogFont.lfOutPrecision = OUT_STROKE_PRECIS;
    LogFont.lfClipPrecision = CLIP_STROKE_PRECIS;
    LogFont.lfQuality = PROOF_QUALITY;
    strcpy(LogFont.lfFaceName, Name);

    if (TheFont != 0)  
    {
        DeleteFont(TheFont);
    }

    TheFont = CreateFontIndirect(&LogFont);
    return TheFont;
}



针对这些代码有问题如下 :
1. 去查了下SelectFont 看不太明白 MSDN上没看到这个 貌似不是个函数 是个宏吧 他在干什么的 有啥子用处?
2. 查了下StockFont 应该是对应的六种字体吧 在 char * FontChoice[] = {"New Times Roman", "Arial", "Symbol", "StockFont"};中他和其他的字符串应该有相似的含义吧,那为什么
enum TChoice {Roman, Swiss, Symbol, StockFont};中的“Arial”和Swiss不对应? 为什么把if (choice == StockFont)作为一个单独条件提出来?
3.aFaceName 究竟是个什么样的字符串 他的内容是什么 从哪里获取的 我曾经单独立出个工程就打印他 并给他先赋值然后用TextOut()函数输出 结果无论我怎么改变赋值的内容他都打印出 System ?GetTextFace()的源字符串和目的字符串都是谁?
4关于GetTextMetrics()百度解释是:该函数把程序当前的字体信息,存放到TEXTMETRIC(即MSDN原文中的specified buffer)中,也就是说这不是个输出函数 是获取函数 ,但是在这段程序中他究竟有个什么作用 会对后面有什么影响?
先问这么多 一大篇啊 麻烦看看。
搜索更多相关主题的帖子: windows 编程 choice 
2012-04-19 19:40
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
hellovfp 大哥谢谢你在论坛升级时还用短信给我讲解那么多。终于明白这个OldFont的作用了 在后面一章的一个字体显示程序中有一个HFONT SaveIt 和这个OldFont的功能应该是差不多的。相当于一个临时存储变量吧。

[ 本帖最后由 有容就大 于 2012-4-20 19:18 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-04-20 19:13
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 3楼 TonyDeng
自学手册上是先通过一个GetFont函数 对LOGFONT类进行赋值 然后通过 HFONT TheFont = GetFontIndirect(&LogFont)来获取一个字体实例句柄,如果没有自定义的GetFont貌似无法实现自己想要的文字字体的形态吧。
比如变粗 变大 加下划线 字体质量的靠拢 和裁剪的方式等等 有自动实现这个的API吗?

梅尚程荀
马谭杨奚







                                                       
2012-04-21 09:30
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

梅尚程荀
马谭杨奚







                                                       
2012-04-21 10:27
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 6楼 hellovfp
你说记事本 我也想试着写个。
现在手册看到第二章 窗体控制那一节 一点不知道MFC 也不清楚书后面的知识 能做出来吗?

梅尚程荀
马谭杨奚







                                                       
2012-04-21 10:54
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 9楼 hellovfp
好 去试试看。

梅尚程荀
马谭杨奚







                                                       
2012-04-21 11:16
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 11楼 hellovfp
嗯 这么一讲就有头绪了。

梅尚程荀
马谭杨奚







                                                       
2012-04-21 11:30
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 13楼 hellovfp
表示鸭梨很大。

梅尚程荀
马谭杨奚







                                                       
2012-04-21 11:41
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
windows程序设计没有使用消息分流机制 我用HANDLE_MSG好还是switch -- case 好?

梅尚程荀
马谭杨奚







                                                       
2012-04-21 11:44
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 16楼 hellovfp
呵呵 那先顺着他的思路来。

梅尚程荀
马谭杨奚







                                                       
2012-04-21 11:55
快速回复:向hellovfp大哥及各位论坛大牛请教关于windows编程文字输出的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032325 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved