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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章