| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1906 人关注过本帖, 1 人收藏
标题:向hellovfp大哥及各位论坛大牛请教关于windows编程文字输出的问题
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏(1)
已结贴  问题点数:99 回复次数:50 
向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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:30 
其实是那个LOGFONT结构的填充是人工无法自己做的,最好的方法是让API自己填充,而要填充它,要么查询字体清单,要么借用原先正在用的字体数据(如果何用的话)。

授人以渔,不授人以鱼。
2012-04-20 20:25
有容就大
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
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:50 
Font Explorer这段程序蛮有用的,可以直接放到记事本之类的程序中。

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

梅尚程荀
马谭杨奚







                                                       
2012-04-21 10:54
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 7楼 有容就大
不用担心,《windows程序设计》中有相关的源代码,不过只是基础功能,关健还是自己的创新。
偶想了很多的新功能,准备用来替换windows自带的记事本,只是使用edit控件,不打算用RichEdit。
包括行号显示,工具栏,历史菜单,背景色可选,编码支持,透明窗体等等。

我们都在路上。。。。。
2012-04-21 10:58
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
偶的动态菜单添加:
void form_init_menu()
{
    Menu menu;

    menu_init(&menu);

    menu_add_item(100, _T("新建(&N)\t    Ctrl+N"), 0);
    menu_add_item(101, _T("打开(&O)...\t    Ctrl+O"), 0);
    menu_add_item(102, _T("保存(&S)\t    Ctrl+S"), 0);
    menu_add_item(103, _T("另存为(&A)..."), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(104, _T("页面设置(&U)..."), 0);
    menu_add_item(105, _T("打印(&P)...\t    Ctrl+P"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(106, _T("退出(&X)"), 0);
    menu_add_to_main(_T("文件(&F)"));

    menu_add_item(150, _T("撤销(&U)\t    Ctrl+Z"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(151, _T("剪切(&T)\t    Ctrl+X"), 0);
    menu_add_item(152, _T("复制(&C)\t    Ctrl+C"), 0);
    menu_add_item(153, _T("粘贴(&P)\t    Ctrl+V"), 0);
    menu_add_item(154, _T("删除(&L)\t    Del"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(155, _T("查找(&F)...\t    Ctrl+F"), 0);
    menu_add_item(156, _T("查找下一个(&N)\t    F3"), 0);
    menu_add_item(157, _T("替换(&R)...\t    Ctrl+H"), 0);
    menu_add_item(158, _T("转到(&G)...\t    Ctrl+G"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(159, _T("全选(&A)\t    Ctrl+A"), 0);
    menu_add_item(160, _T("插入日期(&D)\t    F5"), 0);
    menu_add_item(161, _T("插入时间(&D)\t    F6"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(162, _T("锁定文档(&S)\t    Alt+S"), 0);
    menu_add_to_main(_T("编辑(&E)"));

    menu_add_item(200, _T("自动换行(&W)"), 0);
    menu_add_item(201, _T("字体(&F)..."), 0);
    menu_add_item(202, _T("背景色(&B)..."), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(203, _T("编码 ANSI"), 0);
    menu_add_item(204, _T("编码 Unicode"), 0);
    menu_add_item(205, _T("编码 UTF-8"), 0);
    menu_add_to_main(_T("格式(&O)"));

    menu_add_item(250, _T("工具栏(&T)"), 0);
    menu_add_item(251, _T("状态栏(&S)"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(252, _T("单栏格式(&1)\t    Ctrl+1"), 0);
    menu_add_item(253, _T("左右双栏格式(&2)\t    Ctrl+2"), 0);
    menu_add_item(254, _T("上下双栏格式(&3)\t    Ctrl+3"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(255, _T("总在最前面(&A)\t    Alt+A"), 0);
    menu_add_item(256, _T("窗口透明(&E)\t    Alt+E"), 0);
    menu_add_item(-1, 0, 0);
    menu_add_item(257, _T("选项(&O)..."), 0);
    menu_add_to_main(_T("查看(&V)"));

    menu_add_item(300, _T("查看热键(&H)"), 0);
    menu_add_item(301, _T("关于记事本(&A)"), 0);
    menu_add_to_main(_T("帮助(&H)"));

    menu_show(g_App.form.hwnd_self);
    menu.sub_menus->destroy(menu.sub_menus);
}

其实小小的记事本,可能是你真正用Win32 API编写的第一个实用程序,就一个Edit控件的应用也有很多的文章可做。如果可能,你还可以自己为它添加C语言项目编译等功能,支持外部Shell调用。。

[ 本帖最后由 hellovfp 于 2012-4-21 11:14 编辑 ]

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

梅尚程荀
马谭杨奚







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



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

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