#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,使得程序無邊框,即只有客戶區; 接下來四個參數:第1、二個肯定程序的左上角X,Y位置, 第3、四個肯定程序的長、寬 */ 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); }