#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);
}
转载于:https://blog.51cto.com/leibnitz/1405788