st0627 发表于 2018-6-23 12:35:40

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

#include <windows.h>  
#include <stdio.h>
  
#include <stdlib.h>
  
#include <time.h>

  
#define>  
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,>
  wnd.hCursor = LoadCursor(NULL,>  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, src, strlen(src)) )    //查找想要被替换字符串的起始位置
  {
  strncpy(&ptr, dest, strlen(dest));   //替换字符串的长度为目标字符串的长度
  }
  }
  ptr = '\0';   //计算出字符串结束位置,并加上‘/0’
  return ptr;
  
}
  
void ReadFile(HDC hdc)//读取文件,并打印输出
  
{
  TCHAR szPath;
  GetModuleFileName( NULL, szPath, 1024 );    //获取当前程序的路径
  const char * pFileName = ReplaceString(szPath,"tx.exe","FILE.file");    //替换字符串,得到想要读取文件的路径,tx.exe为当前程序名称,FILE.file为程序要读取文件的名称
  FILE * pFile;
  int Row = 0;    //得到文件中的总行数
  char str; //用于储存最终要输出的字符串
  char strTry;//用于储存计算文件行数时读取到的内容
  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,>  fgets(strTry,1024,pFile);   //读取一行内容到strTry中去
  Row++;
  }
  fclose(pFile);//关闭文件流
  int RowCount = rand()%Row;//随机得到文件中的某一行
  pFile=fopen(pFileName,"rt");
  while (!feof(pFile) && RowCount >= 0)    //当读取到那一行时,进行操作
  {

  ZeroMemory(str,>  fgets(str,1024,pFile);//读取随机得到的一行
  //fscanf(pFile, "%s", str);
  RowCount--;
  }
  fclose(pFile);
  char PrintStr = {0};   //用于暂存将要打印的一行字符串
  for(int i = 0; i < 68; i++)//屏幕上输出的第一行字符,要空两格,具体情况根据客户区的长度决定
  {
  PrintStr = str;
  TextOut ( hdc , 30 , 10 , PrintStr , strlen ( PrintStr ) ) ;    //在屏幕上显示字符
  }

  ZeroMemory(PrintStr,>  for(int CountLine = 0; CountLine < 7; CountLine ++)//第二行起不用空格,为满行输出,CountLine < 7,这也要根据客户区的高度决定的
  {
  for(int i = 0; i < 70; i++)
  {
  PrintStr = str;
  TextOut ( hdc , 0 , 10+20*(CountLine+1) , PrintStr , strlen ( PrintStr ) ) ;
  }

  ZeroMemory(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);
  
}
页: [1]
查看完整版本: VS2012+C语言+图形界面窗口+读取TXT文件+显示