首页 > 代码库 > VS2012+C语言+图形界面窗口+读取TXT文件+显示

VS2012+C语言+图形界面窗口+读取TXT文件+显示

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ID_TIMER 1
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); //声明回调函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) //主函数
{
    WNDCLASS wnd;
    wnd.style = CS_HREDRAW | CS_VREDRAW;
    wnd.lpfnWndProc = WindowProc;   //与回调函数关联
    wnd.cbClsExtra = 0;
    wnd.cbWndExtra = 0;
    wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);    //程序图标
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);  //鼠标样式
    wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //背景颜色
    wnd.lpszMenuName = NULL;
    wnd.lpszClassName = TEXT("window");
    wnd.hInstance = hInstance;   //窗口句柄
    if (!RegisterClass(&wnd))   //注册窗口类
    {
        MessageBox(NULL, "register fail", "errorMsg", 0);
        return 0;
    }
    HWND hwnd;
    int x_screen;
    //int   y_screen;
    x_screen = GetSystemMetrics(SM_CXSCREEN);//屏幕宽度
    //y_screen = GetSystemMetrics(SM_CYSCREEN);//屏幕高度
    /*创建窗口类,
    WS_EX_TOOLWINDOW,使得程序不在任务栏显示,即程序仅有一个窗口,无其他桌面显示,可在进程中看到;
    TEXT("偷得浮生半日闲"),窗口名称,不过本程序不显示边框,所以看不到;
    WS_POPUPWINDOW,使得程序无边框,即只有客户区;
    接下来四个参数:第一、二个确定程序的左上角X,Y位置,
    第三、四个确定程序的长、宽
    */
    hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,TEXT("window"),TEXT("偷得浮生半日闲"),WS_POPUPWINDOW,x_screen - 532 ,10, 512,192, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nShowCmd); //  显示窗口
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))    //消息循环
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.lParam;
}
char* ReplaceString(const char *srcStr, const char *src, const char *dest)  //替换字符串,获得文件路径
{  
    char *ptr;
    int len = strlen(srcStr);
    ptr = (char*)malloc(sizeof(char)*len+1);
    strcpy(ptr, srcStr);       
    for ( int i=0; i<len; ++i )
    {
        if ( 0==strncmp(&ptr[i], src, strlen(src)) )    //查找想要被替换字符串的起始位置
        {           
            strncpy(&ptr[i], dest, strlen(dest));   //替换字符串的长度为目标字符串的长度
        }   
    }   
    ptr[len+strlen(dest)-strlen(src)] = ‘\0‘;   //计算出字符串结束位置,并加上‘/0’
    return ptr;
}
void ReadFile(HDC hdc)  //读取文件,并打印输出
{
    TCHAR szPath[1024];
    GetModuleFileName( NULL, szPath, 1024 );    //获取当前程序的路径
    const char * pFileName = ReplaceString(szPath,"tx.exe","FILE.file");    //替换字符串,得到想要读取文件的路径,tx.exe为当前程序名称,FILE.file为程序要读取文件的名称
    FILE * pFile;
    int Row = 0;    //得到文件中的总行数
    char str[1024]; //用于储存最终要输出的字符串
    char strTry[1024];  //用于储存计算文件行数时读取到的内容
    pFile=fopen(pFileName,"rt");    //以文本方式打开文件
    if ( NULL == pFile )    //判断打开文件成功否
    {
        MessageBox(NULL, "Open File Fail !", "errorMsg", 0);
        Sleep(5000);    //程序睡眠5秒
        PostQuitMessage(0); //退出程序
        return;
    }
    while (!feof(pFile))    //只要文件未读完,就一次一行的读取
    {
        ZeroMemory(strTry, sizeof(strTry)); //清空strTry中的内容
        fgets(strTry,1024,pFile);   //读取一行内容到strTry中去
        Row++;
    }
    fclose(pFile);  //关闭文件流
    int RowCount = rand()%Row;  //随机得到文件中的某一行
    pFile=fopen(pFileName,"rt");
    while (!feof(pFile) && RowCount >= 0)    //当读取到那一行时,进行操作
    {
        ZeroMemory(str, sizeof(str));  
        fgets(str,1024,pFile);  //读取随机得到的一行
        //fscanf(pFile, "%s", str);
        RowCount--;
    }
    fclose(pFile);
    char PrintStr[128] = {0};   //用于暂存将要打印的一行字符串
    for(int i = 0; i < 68; i++)  //屏幕上输出的第一行字符,要空两格,具体情况根据客户区的长度决定
    {
        PrintStr[i] = str[i];
        TextOut ( hdc , 30 , 10 , PrintStr , strlen ( PrintStr ) ) ;    //在屏幕上显示字符
    }
    ZeroMemory(PrintStr, sizeof(PrintStr));
    for(int CountLine = 0; CountLine < 7; CountLine ++)  //第二行起不用空格,为满行输出,CountLine < 7,这也要根据客户区的高度决定的
    {
        for(int i = 0; i < 70; i++)
        {
            PrintStr[i] = str[i+68+70*CountLine];
            TextOut ( hdc , 0 , 10+20*(CountLine+1) , PrintStr , strlen ( PrintStr ) ) ;
        }
        ZeroMemory(PrintStr, sizeof(PrintStr));
    }
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)  //回调函数具体实现
{
    HDC hdc;
    PAINTSTRUCT ps;
    HFONT hFont;
    switch (msg)
    {
    case WM_CREATE:
        srand((unsigned) time(NULL));   //生成随机函数种子,使得生成随机数时更加随机
        SetTimer(hwnd,ID_TIMER,20000,NULL); //定时器,20000为20秒,每20秒执行一次 case WM_TIMER:下的内容
        return 0;
    case WM_TIMER:
        KillTimer(hwnd,ID_TIMER);   //撤消计时器
        PostQuitMessage(0); //退出程序
        return 0;
    case WM_PAINT:
        hdc=BeginPaint ( hwnd,&ps );
        hFont = CreateFont(20,  //字符的高度值
            0,  //如果此值为0,字体映射器选择一个closest match值
            0,  //指定移位向量和设备X轴之间的一个角度
            0,  //指定每个字符的基线和设备X轴之间的角度
            400,    //指定字体的权值
            FALSE,  //设置为斜体
            FALSE,  //增加下划线
            FALSE,  //增加删除线
            GB2312_CHARSET, //指定字符集
            OUT_DEFAULT_PRECIS, //指定输出精度
            CLIP_DEFAULT_PRECIS,    //指定裁剪精度
            DEFAULT_QUALITY,    //指向输出质量
            FIXED_PITCH|FF_MODERN,  //指定字体间距和字体族
            "微软雅黑");    //指定字体的字样名
        SelectObject(hdc,hFont);  //选入字体
        //TextOut ( hdc , 30 , 10 , str , strlen ( str ) ) ;
        ReadFile(hdc);  //读取文件,并在屏幕上输出
        DeleteObject(hFont);    //删除画笔
        EndPaint ( hwnd,&ps );
        return 0;
    /*case WM_SIZE:
        return 0 ;
    case WM_DESTROY:   
        PostQuitMessage(0);
        return 0;*/
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}