怎么读取文本文件的内容到窗口的文本框或对话框里面?(非MFC)
课程设计
1
做了一个纯c语言的窗口程序,没有用MFC!。 有另外一个串口程序接收的数据用fopen放到一个文本文件里面(有一个博主让我放CStatic里面,但是小不黑(白)表示不会弄), 现在的窗口程序做了一个文本框和对话框,请问该怎么把文本文件的内容放到这个里面来呢?对了因为接收串口数据的fopen是用的“w+”所以不会累积数据,这个文本框/对话框貌似还要一直进行更新或者循环读取? 对了,因为是一个小不黑(白),所以码的程序是自己乱拼的,要是看出来哪里有问题就跟我说
#define _CRT_SECURE_NO_WARNINGS 1
#include <windows.h>
#include <tchar.h>
#define IDB_ONE 3301//按键1
#define IDB_TWO 3302//2
#define IDB_THREE 3303//3
#define IDB_FOUR 3304//4
#define IDB_Five 3305//5 窗口
LRESULT _stdcall WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HINSTANCE hg_app;//全局实例句柄
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
WNDCLASS wndcls;//设置这个结构的不同字段
MSG msg;
/*↓↓↓↓↓↓↓↓↓↓↓↓注册窗口↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)COLOR_WINDOW;
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);//图标
wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WndProc;//过程函数
wndcls.lpszClassName=_T("ClassName");//ASCIIZ形式的窗口类名称的地址,每一个应用程序必须有一个窗口类,类名
wndcls.lpszMenuName=_T("MenuName");//ASCIIZ形式的窗口名称的地址。该名称会显示在标题条上
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);//注册这个窗口类型,wndcls
/**/
/*创建、显示窗口*/
hwnd=CreateWindow(_T("ClassName"),//窗口类名,
_T("采集窗口"),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口样式
0,//距离屏幕左上角横坐标
0,//距离屏幕左上角横坐标
1350,//窗口宽度
740,//窗口高度
NULL,//副窗口句柄
NULL,//菜单句柄
hInstance,//当前实例句柄
NULL);//指向一个值的指针,传递给窗口消息,一般为NULL
ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口
UpdateWindow(hwnd);//更新窗口
/*CreateWindow创建一个模板*/
/*消息循环,退出循环表示程序结束*/
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息给过程函数
}
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
return (int)msg.wParam;
}
/*窗口过程函数*/
LRESULT _stdcall WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)//循环
{
/*case WM_COMMAND:
return DefWindowProc(hwnd, uMsg, wParam, lParam);*/
break;
case WM_CREATE:
{
//创建三个按钮
CreateWindow(L"Button", L"开始", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
35, 10, 160, 60, hwnd, (HMENU)IDB_ONE, hg_app, NULL);
CreateWindow(L"Button", L"暂停", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
35, 80, 160, 60, hwnd, (HMENU)IDB_TWO, hg_app, NULL);
CreateWindow(L"Button", L"取消", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
35, 150, 160, 60, hwnd, (HMENU)IDB_THREE, hg_app, NULL);
CreateWindow(L"Button", L"返回", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
35, 230, 160, 60, hwnd, (HMENU)IDB_FOUR, hg_app, NULL);
//创建一个窗口,文本框
CreateWindow(L"EDIT", L"无数据",WS_CHILD/*子窗口*/ | WS_VISIBLE/*初始可见*/ | ES_MULTILINE/*多行*/|WS_BORDER/*细边框*/|WS_VSCROLL,
250,10,400,300,hwnd,(HMENU)IDB_Five,hg_app,NULL);
//创建一个窗口,对话框
CreateWindow(L"EDIT", L"数据",WS_VISIBLE/*初始可见*/|WS_SIZEBOX |WS_CHILD/*子窗口*/|WS_DLGFRAME/*对话框*/|WS_BORDER,
700,10,400,400,hwnd,(HMENU)IDB_Five,hg_app,NULL);
}
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDB_ONE:
//MessageBox(hwnd, L"您点击了第一个按钮。", L"提示", MB_OK | MB_ICONINFORMATION);
SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"正在进行");
break;
case IDB_TWO:
//MessageBox(hwnd, L"您点击了第二个按钮。", L"提示", MB_OK | MB_ICONINFORMATION);
SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"已暂停");
break;
case IDB_THREE:
//MessageBox(hwnd, L"您点击了第三个按钮。", L"提示", MB_OK | MB_ICONINFORMATION);
SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"已取消"); //窗口句柄, 应用程序发送此消息来设置一个窗口的文本
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
break;
/* case WM_PAINT:
{
}
break;*/
case WM_DESTROY:
PostQuitMessage(0);//关闭窗口,如果被拦截就关不了
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);//调用默认过程函数,刷新窗口
}
return 0;
}
}
-
用setwindowtext函数设置窗口的文本,把文件内容设置到文本框里面就好了。代码供你参考点击开始和暂停就可以修改
#include "stdafx.h" #include "Win32Project1.h" #include <mbstring.h> #define _CRT_SECURE_NO_WARNINGS 1 #include <windows.h> #include <tchar.h> #define IDB_ONE 3301//按键1 #define IDB_TWO 3302//2 #define IDB_THREE 3303//3 #define IDB_FOUR 3304//4 #define IDB_Five 3305//5 窗口 #define IDB_SIX 3306//5 对话框 LRESULT _stdcall WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HINSTANCE hg_app;//全局实例句柄 int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; WNDCLASS wndcls;//设置这个结构的不同字段 MSG msg; /*↓↓↓↓↓↓↓↓↓↓↓↓注册窗口↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH)COLOR_WINDOW; wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);//图标 wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WndProc;//过程函数 wndcls.lpszClassName = _T("ClassName");//ASCIIZ形式的窗口类名称的地址,每一个应用程序必须有一个窗口类,类名 wndcls.lpszMenuName = _T("MenuName");//ASCIIZ形式的窗口名称的地址。该名称会显示在标题条上 wndcls.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls);//注册这个窗口类型,wndcls /**/ /*创建、显示窗口*/ hwnd = CreateWindow(_T("ClassName"),//窗口类名, _T("采集窗口"),//窗口标题 WS_OVERLAPPEDWINDOW,//窗口样式 0,//距离屏幕左上角横坐标 0,//距离屏幕左上角横坐标 1350,//窗口宽度 740,//窗口高度 NULL,//副窗口句柄 NULL,//菜单句柄 hInstance,//当前实例句柄 NULL);//指向一个值的指针,传递给窗口消息,一般为NULL ShowWindow(hwnd, SW_SHOWNORMAL);//显示窗口 UpdateWindow(hwnd);//更新窗口 /*CreateWindow创建一个模板*/ /*消息循环,退出循环表示程序结束*/ while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg);//翻译消息 DispatchMessage(&msg);//分发消息给过程函数 } /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ return (int)msg.wParam; } /*窗口过程函数*/ LRESULT _stdcall WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg)//循环 { /*case WM_COMMAND: return DefWindowProc(hwnd, uMsg, wParam, lParam);*/ break; case WM_CREATE: { //创建三个按钮 CreateWindow(L"Button", L"开始", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 35, 10, 160, 60, hwnd, (HMENU)IDB_ONE, hg_app, NULL); CreateWindow(L"Button", L"暂停", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 35, 80, 160, 60, hwnd, (HMENU)IDB_TWO, hg_app, NULL); CreateWindow(L"Button", L"取消", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 35, 150, 160, 60, hwnd, (HMENU)IDB_THREE, hg_app, NULL); CreateWindow(L"Button", L"返回", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 35, 230, 160, 60, hwnd, (HMENU)IDB_FOUR, hg_app, NULL); //创建一个窗口,文本框 CreateWindow(L"EDIT", L"无数据", WS_CHILD/*子窗口*/ | WS_VISIBLE/*初始可见*/ | ES_MULTILINE/*多行*/ | WS_BORDER/*细边框*/ | WS_VSCROLL, 250, 10, 400, 300, hwnd, (HMENU)IDB_Five, hg_app, NULL); //创建一个窗口,对话框 CreateWindow(L"EDIT", L"数据", WS_VISIBLE/*初始可见*/ | WS_SIZEBOX | WS_CHILD/*子窗口*/ | WS_DLGFRAME/*对话框*/ | WS_BORDER, 700, 10, 400, 400, hwnd, (HMENU)IDB_SIX, hg_app, NULL); } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDB_ONE: //MessageBox(hwnd, L"您点击了第一个按钮。", L"提示", MB_OK | MB_ICONINFORMATION); { SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"正在进行"); HWND hwndEdit = GetDlgItem(hwnd, IDB_Five); TCHAR szText[2048]; GetWindowText(hwndEdit, szText, 2048); wcscat_s(szText, _T("\n急速光粒添加")); SetWindowText(hwndEdit, szText); } break; case IDB_TWO: { //MessageBox(hwnd, L"您点击了第二个按钮。", L"提示", MB_OK | MB_ICONINFORMATION); SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"已暂停"); HWND hwndEdit = GetDlgItem(hwnd, IDB_SIX); TCHAR szText[2048]; GetWindowText(hwndEdit, szText, 2048); wcscat_s(szText, _T("\n急速光粒添加")); SetWindowText(hwndEdit, szText); } break; case IDB_THREE: //MessageBox(hwnd, L"您点击了第三个按钮。", L"提示", MB_OK | MB_ICONINFORMATION); SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"已取消"); //窗口句柄, 应用程序发送此消息来设置一个窗口的文本 break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } break; /* case WM_PAINT: { } break;*/ case WM_DESTROY: PostQuitMessage(0);//关闭窗口,如果被拦截就关不了 break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam);//调用默认过程函数,刷新窗口 } return 0; } }
-
所有界面窗口或控件都是一个HWND,改变它的文字就用 SetWindowText函数,第一个参数就是HWND,第二个参数是要显示的字符串
上面创建EDIT控件返回的HWND用全局变量保存起来,这样HWND参数就有了
全局变量定一个char数组,读到数据放这个char数组里,作为要显示的字符串,这样SetWindowText的第二个参数的值也有了
需要更新的时候,调一下SetWindowText就好了。
如果数据不变的,只要调一次就好了。
如果数据要变的,在数据变了时调一次就好了。
发表回复