#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); }
VS2012+C语言+图形界面窗口+读取TXT文件+显示,布布扣,bubuko.com
时间: 2024-10-25 11:02:31