| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3835 人关注过本帖, 1 人收藏
标题:怎么从图形库输出stdin流里面的汉字内容~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
已结贴  问题点数:20 回复次数:10 
怎么从图形库输出stdin流里面的汉字内容~
这段代码能实现从图形库里面输出英文的~不过这样只能一个字节一个字节处理~那么怎么能从图形库输出汉字?~有没有高手可以实现以下?~
问题是图形库似乎不能直接调用编译器默认的字库~
程序代码:
#include<graphics.h>
#include<stdio.h>
#include <conio.h>

void main()
{
    // 绘图环境初始化
    char s[10]={0};
    int i=0;
    int j=0;
    int flag=0;

    initgraph(640, 480);

    settextstyle(16, 0, _T("宋体"));


    {
        RECT r = {i*8, j*18, 640, 480};
        drawtext(_T("_"), &r,DT_EDITCONTROL| DT_LEFT|DT_INTERNAL|DT_NOPREFIX);
    }

    while (1)
    {
        flag=0;

        s[0]=getch();

        s[1]='_';

        if (s[0]==27)
            break;
        else if (s[0]=='\r')
        {
            RECT r1 = {0, (j+1)*18, 640, 480};
            RECT r2={i*8, j*18, 640, 480};

            drawtext(_T("_"), &r1,DT_EDITCONTROL| DT_LEFT|DT_INTERNAL|DT_NOPREFIX);
            drawtext(_T(" "), &r2,DT_EDITCONTROL| DT_LEFT|DT_INTERNAL|DT_NOPREFIX);


            i=0;
            j++;

            continue;
        }
        else if (s[0]==8&&i>0)
        {
            s[0]='_';
            s[1]=' ';
            --i;
            flag=1;


        }
        else if (s[0]==8)
            continue;

        if (!kbhit()||flag==1)
        {
            RECT r = {i*8, j*18, 640, 480};
            drawtext(_T(s), &r,DT_EDITCONTROL| DT_LEFT|DT_INTERNAL|DT_NOPREFIX);
            ++i;
        }

        if (flag==1&&i>0)
            --i;
    }

    // 按任意键退出
//    getch();
    closegraph();
}


[此贴子已经被作者于2017-6-21 00:19编辑过]

搜索更多相关主题的帖子: 英文 汉字 编译器 
2017-06-20 23:34
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
当然折中一点可以用InputBox函数~用来实现项目那个框框看上去局限性很大吧~如果这样直接在控制台里面弄会不会好一点?~

[此贴子已经被作者于2017-6-20 23:49编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-20 23:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
如果是这样好像要自己放在InputBox函数自己弄个适合程序的框架才行~

看来如果真的要弄用Windows编程比较合理~看来这短期是实现不了了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-20 23:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
发现一个根本性的问题~图形库竟然直接用非编译器的输入法而不是编译器本来自带的字库~这性质决定了和控制台处理方式有很大的不同~

什么~这个问题已经在一楼说过一次啦~

[此贴子已经被作者于2017-6-21 09:43编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-21 09:38
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 九转星河
能用字典树自己建立一个字库么~这样直接把索引结果显示在屏幕上解决输入中文问题?~设想一下就行了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-21 12:32
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 九转星河
或许~建立字库把字库保存在数据库里面比较合适一点~不过表示对数据库了解不多~不知道呢~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-21 12:41
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:20 
看着版主大大自言自语了好半天,说实话,一句都听不懂!
主要疑惑的是:你不能从键盘缓冲区读出汉字并画出来和编译器、输入法、字库有什么关系呢?就我的一知半解:键盘缓冲区是底层内核处理的,字库是系统自带的,编译器是第三方的,有编译器自带字库的吗?
下述代码可以让c控制台用图形方式输出汉字,我都给了较详细的注释,希望对版主大大有帮助(vs2010下通过,vc6的控制台图形代码好像还简单些):
程序代码:
#include "StdAfx.h"
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")   //加载api所需函数库(系统用户库及图形库)
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
HWND WINAPI GetConsoleWindow();
void main()
{
    HWND hwnd;
    HDC hdc;
    HPEN hpen;
    char s[100];
    int i;
    hwnd = GetConsoleWindow();  //获取控制台窗口句柄
    hdc = GetDC(hwnd);          //给控制台申请一个场景(画布)
    system("color F0");         //设置控制台背景色为白色
    hpen=CreatePen(PS_SOLID,1,RGB(255,0,0));  //创建一个红色画笔
    SelectObject(hdc,hpen);
    MoveToEx(hdc,20,20,NULL);   //确定线条起始点
    LineTo(hdc,200,300);        //画一条红线
    s[0]=0;
    while (s[0]!=27)   //Esc键退出
    {
        for(i=0,s[0]=0;kbhit();)
        {
            s[i++]=getch();
            if(s[i-1]>127||s[i-1]<0)s[i++]=getch();  //如果不是asc码则需要从缓冲区再读一个
        }
        s[i]=0;
        if(i>0)
        {
            TextOut(hdc,50,100,s,i);
            TextOut(hdc,50,100,s,i);   //我也不是很清楚为什么要操作两次,估计是场景缓冲
        }
    }
    DeleteObject(hpen);   //删除画笔
    ReleaseDC(hwnd,hdc);  //释放场景占用空间
}
2017-06-21 13:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 xzlxzlxzl
看来x版没有玩过图形库~~~那里根本不能直接接收外部输入的汉字那里显示是直接用搜狗输入的~除非能通过某种方式来间接调用控制台程序(如果我没有猜错应该要切换窗口句柄涉及到那些底层的东西)~

如果用windows控制台这个我自己弄弄也可以~看来图形库不适合处理用户输入文字信息~

当然这样简单处理可以(主要是没有窗口界面~如果有窗口界面比较复杂)~
这可以当作一种简便的处理方法吧~

PS:现在先不管输入中文的问题了~那个打算暂时跳过~当然不用图形库直接用控制台可以用x版的实现~

[此贴子已经被作者于2017-6-21 16:07编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-21 16:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
解决方案想到了如下几个~

1:想办法让图形库支持获取输入中文信息(也就是说能接受中文信息)~
2:自己建立一个字库自己进行输入信息管理(虽然有实现可能~不过感觉比较麻烦)~
3:获取文档格式输入模块~然后自定义在指定区域进行文档编辑(不带显示提示信息窗口单纯提供输入模块)自己管理输入内容(现阶段表示不会)~
4:不用图形库直接调用控制台解决(像x版那样~不过就意味着不用图形库了)~
5:最直接用图形库的InputBox函数解决(不过那样多了个外部输入信息提示框~局限性比较大~有种那不是图形库的一个部分而是另外独立出来的感觉)~
总结一下如果真的要深入解决问题还是要了解一下windows编程才行~


[此贴子已经被作者于2017-6-21 16:38编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-21 16:23
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 8楼 九转星河
顿时感到受打击了!只要有百度在,没有什么解决不了的问题。
我不玩那个EasyX,主要是瞧不上那个,它不就是个为了兼容老版Tc的图形库么,看它用的函数只是简单的api合成,感觉有的函数不一定有我写的更实用。
不过,为解决题主问题,只好下一个了。原来EasyX屏蔽了中文输入法,只要写一个中文输入的hook就行了,下述代码是百度来的,通过读取中文输入的缓冲区来获取中文字符,在vc6里运行通过,尽管是用了c++的string类,估计修改为c的字符数组也不难(不知道原始作者是谁,在此表示感谢!)。
程序代码:
#pragma comment(lib,"imm32.lib")   //加载输入法函数库
#include <graphics.h>
#include <conio.h>
#include <windows.h>
#include <string>
using namespace std;
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow (); 

void GetIMEString(HWND hWnd,string& str)
{    
    HIMC hIMC=ImmGetContext(hWnd);//获取HIMC    
    if (hIMC)
    {    
        //这里先说明一下,以输入“中国”为例    
        //切换到中文输入法后,输入“zhongguo”,这个字符串称作IME组成字符串    
        //而在输入法列表中选择的字符串“中国”则称作IME结果字符串    
        static bool flag=false;//输入完成标记:在输入中时,IME组成字符串不为空,置true;输入完成后,IME组成字符串为空,置false    
        DWORD dwSize=ImmGetCompositionStringW(hIMC,GCS_COMPSTR,NULL,0);    //获取IME组成输入的字符串的长度    
        if (dwSize>0)//如果IME组成字符串不为空,且没有错误(此时dwSize为负值),则置输入完成标记为true    
        {    
            if (flag==false)    
            {    
                flag=true;
            }    
        }    
        else if (dwSize==0&&flag)    //如果IME组成字符串为空,并且标记为true,则获取IME结果字符串    
        {
            int iSize;    //IME结果字符串的大小    
            LPSTR pszMultiByte=NULL;//IME结果字符串指针    
            int ChineseSimpleAcp=936;//宽字节转换时中文的编码    
            WCHAR *lpWideStr=NULL;//宽字节字符数组    
            dwSize=ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,NULL,0);//获取IME结果字符串的大小    
            if (dwSize>0)    //如果IME结果字符串不为空,且没有错误    
            {    
                dwSize+=sizeof(WCHAR);//大小要加上NULL结束符    
                //为获取IME结果字符串分配空间    
                if (lpWideStr)    
                {    
                    delete []lpWideStr;    
                    lpWideStr=NULL;    
                }    
                lpWideStr=new WCHAR[dwSize];    
                memset(lpWideStr,0,dwSize);    //清空结果空间    
                ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,lpWideStr,dwSize);//获取IME结果字符串,这里获取的是宽字节    
                iSize=WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,NULL,0,NULL,NULL);//计算将IME结果字符串转换为ASCII标准字节后的大小    
                //为转换分配空间    
                if (pszMultiByte)    
                {    
                    delete [] pszMultiByte;
                    pszMultiByte=NULL;    
                }    
                pszMultiByte=new char[iSize+1];
                WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,pszMultiByte,iSize,NULL,NULL);//宽字节转换    
                pszMultiByte[iSize]='\0';
                str+=pszMultiByte;//添加到string中    
                //释放空间    
                if (lpWideStr)    
                {    
                    delete []lpWideStr;    
                    lpWideStr=NULL;    
                }    
                if (pszMultiByte)    
                {    
                    delete [] pszMultiByte;    
                    pszMultiByte=NULL;
                }    
            }    
            flag=false;
        }    
        ImmReleaseContext(hWnd,hIMC);//释放HIMC    
    }
}
void main()
{ 
    initgraph(640, 480); // 创建绘图窗口    HWND hWnd=GetHWnd();
    BeginBatchDraw();    // 设置批绘图模式    
    string str;
    HWND hWnd;
    hWnd = GetHWnd();
    while(true)    
    {    
        if (kbhit())    //如果是ASCII输入    
        {    
            char c=getch();    
            if (c=='\b')    
            {    
                if (str.length()>0)    
                {    
                    if (str.at(str.length()-1)&0x8000) 
                        str.erase(str.end()-1);    
                    str.erase(str.end()-1); 
                }    
            }    
            else if (c==27) {    }
            else    {    
                str+=c;    
            }    
        }    
        else    //除此之外,检测是否有IME输入,如果有,则将输入结果添加到string中    
        {    
            GetIMEString(hWnd,str);
        }
        if (str.length()>100)    
            str="";    
        outtextxy(0,0,str.c_str());
        FlushBatchDraw();    
        // 延时
        Sleep(15);    
        cleardevice();    
    } 
    closegraph();
}


后记:通过查看EasyX的运行过程可得知,EasyX根本就不是控制台下画图,它实际上隐藏了控制台窗口,另外开了个窗口作图。这个东西怎么看怎么不舒服,仅此一次,立即删除!
2017-06-21 18:08
快速回复:怎么从图形库输出stdin流里面的汉字内容~
数据加载中...
 
   



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

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