1. 首页
  2. 开发
  3. C/C++

c++使用windows api实现EDIT控件读取和保存

#pragma warning(disable:4996)
#include<windows.h>
#include<string>
#include<fstream>


#define HDC_EDIT_1 0x100
#define HDC_BUTTON_1 0x101
#define HDC_BUTTON_2 0x102

//全局变量声明
HINSTANCE hinst;

//函数声明
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
char * wchar2char(const wchar_t* wchar);

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //HINSTANCE为应用程序的句柄
  WNDCLASSEX wcx; //窗口类
  HWND hwnd; //窗口句柄
  MSG msg;  //消息
  BOOL fGotMessage; //是否成功获取消息
  hinst = hinstance; //用来保存当前的应用程序的句柄
  static TCHAR szAppName[] = "MyWindows";

  //对创建的窗口类进行填充相应的数据结构
  wcx.cbSize = sizeof(wcx); //cxSize转到定义为 该类型为UINT
  wcx.style = CS_HREDRAW | CS_VREDRAW; //样式 大小改变时 重新进行绘制
  wcx.lpfnWndProc = MainWndProc; // 窗口消息处理函数
  wcx.cbWndExtra = 0;	// 不使用类内存
  wcx.cbClsExtra = 0;	// 不使用窗口内存
  wcx.hInstance = hinstance;  //所属的应用程序的实例句柄
  wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标: 默认 指定一个和类相关的图标资源句柄,如果没有指定就用默认的。
  wcx.hCursor = LoadCursor(NULL, IDC_ARROW);	 // 光标:默认
  wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 画刷背景:WHITE_BRUSH
  wcx.lpszMenuName = NULL; // 菜单:无
  wcx.lpszClassName = szAppName; // 窗口类的名称
  wcx.hIconSm = (HICON)LoadImage(hinstance, //hIconSm指定一个和类相关的小的图标资源句柄,如果是空,系统会根据hIcon的图标来生成一个合适大小的图标来作为和类相关的小的图标资源句柄
    MAKEINTRESOURCE(5),
    IMAGE_ICON,
    GetSystemMetrics(SM_CXSMICON),
    GetSystemMetrics(SM_CXSMICON),
    LR_DEFAULTCOLOR);

  if (!RegisterClassEx(&wcx)) { //创建窗口类
    return -1;
  }

  //调用CreateWindow API
  hwnd = CreateWindow(szAppName, //窗口类名称
    "我是以恶搞表示",  //窗口标题
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, //水平位置:默认
    CW_USEDEFAULT, //垂直位置:默认
    CW_USEDEFAULT, //宽度位置:默认
    500, //高度位置:默认
    (HWND)NULL, // 父窗口:无
    (HMENU)NULL, //菜单:使用窗口类的菜单
    hinstance,  //应用程序实例句柄
    (LPVOID)NULL); //窗口创建时数据:无

  CreateWindow(
    "EDIT",
    "",
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE,
    0,
    0,
    800,
    500,
    hwnd,
    (HMENU)HDC_EDIT_1, //需要进行强转类型
    hinstance,
    (LPVOID)NULL
  );


  CreateWindow(
    "BUTTON",
    "选择文件",
    WS_CHILD | WS_VISIBLE,
    900,
    200,
    100,
    50,
    hwnd,
    (HMENU)HDC_BUTTON_1, //需要进行强转类型
    hinstance,
    (LPVOID)NULL
  );

  CreateWindow(
    "BUTTON",
    "保存文本",
    WS_CHILD | WS_VISIBLE,
    900,
    260,
    100,
    50,
    hwnd,
    (HMENU)HDC_BUTTON_2, //需要进行强转类型
    hinstance,
    (LPVOID)NULL
  );



  if (!hwnd) {  //创建窗口失败的处理
    return -1;
  }

  //显示窗口
  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

  //消息循环,作用就是将我们在窗口上产生的msg进行TranslateMessage解析然后再进行DispatchMessage传输给窗口消息处理函数进行处理
  while ((fGotMessage = GetMessage(&msg, (HWND)NULL, 0, 0)) != 0 && fGotMessage != -1) {
    TranslateMessage(&msg); //翻译作用,比如 在处理按键的时候,将接收到的十六进制转换为字符码char的时候就可以派上用场了
    DispatchMessage(&msg); //传输,根据对应的窗口HWND,找到对应的窗口过程函数,比如这里定义的MainWndProc函数进行处理

                 //当DispatchMessage之后,内核中将该句柄对应的窗口过程函数进行调用
  }

  return msg.wParam;
}

/*
MainWndProc
功能:窗口消息处理函数 对所有的消息都使用默认处理函数
*/

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //这里接收的hwnd,uMsg,wParam,lParam 
                                           //也就是MSG结构体中的消息,umsg是动作 wParam lParam保存了该动作中的详细信息的,hwnd为该句柄

  TCHAR szchar[100] = { 0 };
  OPENFILENAME  ofn;
  TCHAR szfile[MAX_PATH]; //用来存储文件名
  std::fstream fs;
  std::string mystring;

  char szBuf[2048] = { 0 };


  switch (uMsg) { //switch对产生的消息进行处理
  case WM_DESTROY: //当进行关闭处理时候 进行ExitThread 结束进程操作
    PostQuitMessage(0);
    return 0;
  case WM_COMMAND: // 十六进制为0x111
    switch (wParam) {
    case 0x101: //第一个按钮

      ZeroMemory(&ofn, sizeof(ofn));

      ofn.lStructSize = sizeof(OPENFILENAME);
      ofn.hwndOwner = NULL;
      ofn.lpstrFile = szfile;
      ofn.lpstrFile[0] = '\0';
      ofn.nMaxFile = sizeof(szfile);
      ofn.lpstrFilter = "All(*.*)\0*.*\0Text(*.txt)\0*.TXT\0\0";
      ofn.nFilterIndex = 1;
      ofn.lpstrFileTitle = NULL;
      ofn.nMaxFileTitle = 0;
      ofn.lpstrInitialDir = NULL;
      ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

      if (GetOpenFileName(&ofn)) {
        fs.open(ofn.lpstrFile, std::fstream::in);
        while (fs.getline(szBuf, 1024)) {
          mystring.append(szBuf);
          mystring.append("\r\n");
        }

        fs.close();
        SetDlgItemText(hwnd, HDC_EDIT_1, mystring.c_str());

      }
      else {
        DWORD myDword = CommDlgExtendedError();
        sprintf(szchar, "error : %d", myDword);
        OutputDebugString(szchar);
      }

      break;

    case 0x102:  //第二个按钮
      ZeroMemory(&ofn, sizeof(ofn));

      ofn.lStructSize = sizeof(OPENFILENAME);
      ofn.hwndOwner = NULL;
      ofn.lpstrFile = szfile;
      ofn.lpstrFile[0] = '\0';
      ofn.nMaxFile = sizeof(szfile);
      ofn.lpstrFilter = "All(*.*)\0*.*\0Text(*.txt)\0*.TXT\0\0";
      ofn.nFilterIndex = 1;
      ofn.lpstrFileTitle = NULL;
      ofn.nMaxFileTitle = 0;
      ofn.lpstrInitialDir = NULL;
      ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

      if (GetOpenFileName(&ofn)) {
        fs.open(ofn.lpstrFile, std::fstream::out);
        GetDlgItemText(hwnd, HDC_EDIT_1, szBuf, 2048);
        fs.write(szBuf, sizeof(szBuf));
          fs.close();
        break;
      }

    default:
      break;
    }
  default:
    return DefWindowProc(hwnd, uMsg, wParam, lParam); //不关心的操作都给windows自己的窗口消息处理函数进行处理
  }

}

 

原创文章,作者:admin,如若转载,请注明出处:https://www.huiyingwu.com/4312/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注