分享

用C编写的记事本

 心不留意外尘 2016-08-26

http://blog.csdn.net/yueguanghaidao/article/details/6949249

2011

  最近想好好研究C,于是便拿记事本这个小程序练练手。

自己从网上找了一个挺不错的,就从这个开始学习吧。。。。

一:代码

先建立一文件夹->方便管理与查看

拿我来说,在d盘根目录下新建note文件夹

1.新建一note.rc资源文件,代码如下。

  1. #include "sample.h"  
  2.   
  3. A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "sample.ico"  
  4.   
  5. MAINMENU MENU   
  6. {  
  7.   POPUP "文件(&F)"  
  8.  {  
  9.   MENUITEM "打开(&O)...", CM_FILE_OPEN  
  10.   MENUITEM "另存为(&S)...", CM_FILE_SAVEAS  
  11.   MENUITEM SEPARATOR  
  12.   MENUITEM "关闭", CM_FILE_EXIT  
  13.  }  
  14.   
  15.  POPUP "帮助(&H)"  
  16.  {  
  17.   MENUITEM "关于(&A)", CM_ABOUT  
  18.  }  
  19. }  
  1.   
  1.   

2.新建sample.h,代码如下

  1. #define CM_FILE_SAVEAS    9072  
  2. #define CM_FILE_EXIT    9071  
  3. #define CM_FILE_OPEN    9070  
  4. #define CM_ABOUT        9069  



3.新建源程序note.c ,代码如下

  1. #include <windows.h>  
  2. #include "sample.h"  
  3.   
  4. static char g_szClassName[] = "MyWindowClass";  
  5. static HINSTANCE g_hInst = NULL;  
  6. #define IDC_MAIN_TEXT   1001  
  7.   
  8. BOOL LoadFile(HWND hEdit, LPSTR pszFileName)  
  9. {  
  10.    HANDLE hFile;  
  11.    BOOL bSuccess = FALSE;  
  12.   
  13.   
  14.    hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,  
  15.       OPEN_EXISTING, 0, 0);  
  16.    if(hFile != INVALID_HANDLE_VALUE)  
  17.    {  
  18.       DWORD dwFileSize;  
  19.       dwFileSize = GetFileSize(hFile, NULL);  
  20.       if(dwFileSize != 0xFFFFFFFF)  
  21.       {  
  22.          LPSTR pszFileText;  
  23.          pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);  
  24.          if(pszFileText != NULL)  
  25.          {  
  26.             DWORD dwRead;  
  27.             if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))  
  28.             {  
  29.                pszFileText[dwFileSize] = 0;   
  30.                if(SetWindowText(hEdit, pszFileText))  
  31.                   bSuccess = TRUE;   
  32.             }  
  33.             GlobalFree(pszFileText);  
  34.          }  
  35.       }  
  36.       CloseHandle(hFile);  
  37.    }  
  38.    return bSuccess;  
  39. }  
  40.   
  41.   
  42. BOOL SaveFile(HWND hEdit, LPSTR pszFileName)  
  43. {  
  44.    HANDLE hFile;  
  45.    BOOL bSuccess = FALSE;  
  46.    hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,  
  47.       CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  
  48.    if(hFile != INVALID_HANDLE_VALUE)  
  49.    {  
  50.       DWORD dwTextLength;  
  51.       dwTextLength = GetWindowTextLength(hEdit);  
  52.       if(dwTextLength > 0)  
  53.       {  
  54.          LPSTR pszText;  
  55.          pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);  
  56.          if(pszText != NULL)  
  57.          {  
  58.             if(GetWindowText(hEdit, pszText, dwTextLength + 1))  
  59.             {  
  60.                DWORD dwWritten;  
  61.                if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))  
  62.                   bSuccess = TRUE;  
  63.             }  
  64.             GlobalFree(pszText);  
  65.          }  
  66.       }  
  67.       CloseHandle(hFile);  
  68.    }  
  69.    return bSuccess;  
  70. }  
  71.   
  72.   
  73. BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)  
  74. {  
  75.    OPENFILENAME ofn;  
  76.    char szFileName[MAX_PATH];  
  77.   
  78.   
  79.    ZeroMemory(&ofn, sizeof(ofn));  
  80.    szFileName[0] = 0;  
  81.   
  82.   
  83.    ofn.lStructSize = sizeof(ofn);  
  84.    ofn.hwndOwner = hwnd;  
  85.    ofn.lpstrFilter = "文本文件 (*.txt)\0*.txt\0所有文件 (*.*)\0*.*\0\0";  
  86.    ofn.lpstrFile = szFileName;  
  87.    ofn.nMaxFile = MAX_PATH;  
  88.    ofn.lpstrDefExt = "txt";  
  89.   
  90.   
  91.    if(bSave)  
  92.    {  
  93.       ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |  
  94.          OFN_OVERWRITEPROMPT;  
  95.            
  96.       if(GetSaveFileName(&ofn))  
  97.       {  
  98.          if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))  
  99.          {  
  100.             MessageBox(hwnd, "保存文件失败.", "错误信息",  
  101.                MB_OK | MB_ICONEXCLAMATION);  
  102.             return FALSE;  
  103.          }  
  104.       }  
  105.    }  
  106.    else  
  107.    {  
  108.       ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;  
  109.       if(GetOpenFileName(&ofn))  
  110.       {  
  111.          if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))  
  112.          {  
  113.             MessageBox(hwnd, "打开文件失败.", "错误信息",  
  114.                MB_OK | MB_ICONEXCLAMATION);  
  115.             return FALSE;  
  116.          }  
  117.       }  
  118.    }  
  119.    return TRUE;  
  120. }  
  121.   
  122.   
  123. LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)  
  124. {  
  125.    switch(Message)  
  126.    {  
  127.       case WM_CREATE:  
  128.          CreateWindow("EDIT", "",  
  129.             WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |  
  130.                ES_WANTRETURN,  
  131.             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,  
  132.             hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL);  
  133.   
  134.   
  135.          SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,  
  136.             (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));  
  137.       break;  
  138.       case WM_SIZE:  
  139.          if(wParam != SIZE_MINIMIZED)  
  140.             MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),  
  141.                HIWORD(lParam), TRUE);  
  142.       break;  
  143.       case WM_SETFOCUS:  
  144.          SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));  
  145.       break;  
  146.       case WM_COMMAND:  
  147.          switch(LOWORD(wParam))  
  148.          {  
  149.             case CM_FILE_OPEN:  
  150.                DoFileOpenSave(hwnd, FALSE);  
  151.             break;  
  152.             case CM_FILE_SAVEAS:  
  153.                DoFileOpenSave(hwnd, TRUE);  
  154.             break;  
  155.             case CM_FILE_EXIT:  
  156.                PostMessage(hwnd, WM_CLOSE, 0, 0);  
  157.             break;  
  158.             case CM_ABOUT:  
  159.                MessageBox (NULL, "一个Windows C 记事本程序" , "关于...", 0);  
  160.          }  
  161.       break;  
  162.       case WM_CLOSE:  
  163.          DestroyWindow(hwnd);  
  164.       break;  
  165.       case WM_DESTROY:  
  166.          PostQuitMessage(0);  
  167.       break;  
  168.       default:  
  169.          return DefWindowProc(hwnd, Message, wParam, lParam);  
  170.    }  
  171.    return 0;  
  172. }  
  173.   
  174.   
  175. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  176.    LPSTR lpCmdLine, int nCmdShow)  
  177. {  
  178.    WNDCLASSEX WndClass;  
  179.    HWND hwnd;  
  180.    MSG Msg;  
  181.   
  182.    g_hInst = hInstance;  
  183.   
  184.    WndClass.cbSize        = sizeof(WNDCLASSEX);  
  185.    WndClass.style         = 0;  
  186.    WndClass.lpfnWndProc   = WndProc;  
  187.    WndClass.cbClsExtra    = 0;  
  188.    WndClass.cbWndExtra    = 0;  
  189.    WndClass.hInstance     = g_hInst;  
  190.    WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);  
  191.    WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);  
  192.    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);  
  193.    WndClass.lpszMenuName  = "MAINMENU";  
  194.    WndClass.lpszClassName = g_szClassName;  
  195.    WndClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);  
  196.   
  197.   
  198.    if(!RegisterClassEx(&WndClass))  
  199.    {  
  200.       MessageBox(0, "注册窗口失败", "错误信息",  
  201.          MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);  
  202.       return 0;  
  203.    }  
  204.   
  205.    hwnd = CreateWindowEx(  
  206.       WS_EX_CLIENTEDGE,  
  207.       g_szClassName,  
  208.       "一个记事本程序",  
  209.       WS_OVERLAPPEDWINDOW,  
  210.       CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,  
  211.       NULL, NULL, g_hInst, NULL);  
  212.   
  213.   
  214.    if(hwnd == NULL)  
  215.    {  
  216.       MessageBox(0, "创建窗口失败", "错误信息",  
  217.          MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);  
  218.       return 0;  
  219.    }  
  220.   
  221.   
  222.    ShowWindow(hwnd, nCmdShow);  
  223.    UpdateWindow(hwnd);  
  224.   
  225.   
  226.    while(GetMessage(&Msg, NULL, 0, 0))  
  227.    {  
  228.       TranslateMessage(&Msg);  
  229.       DispatchMessage(&Msg);  
  230.    }  
  231.    return Msg.wParam;  
  232. }  


二:编译,连接运行

在编译之前需要一个sample.ico图标.

打开运行,输入cmd,回车,进入dos命令行

进入d:\note下

1.用dir命令列一下当前目录包含文件。


2.编译源程序(用cl编译器,/c的意思是:只编译,不连接)

用dir命令查看一下当前目录,是不是多了一个note.obj文件。

3.编译资源文件(用rc编译器编译)

用dir命令查看一下当前目录,是不是多了一个note.RES文件.

4.连接

用dir命令查看一下当前目录,是不是多了一个note.exe可执行查询.


打开看看,是不是很有成就感啊,没有借助任何编译器。

我们不仅要问,为什么要加入那么多的lib文件呢?

 在windows编程中,有三个基本的lib文件,即kernel32.lib,user32.lib,gdi32.lib 

所以一般就添加这几个,我们连接一下试试。

不幸的是报错了,我们看看

这一看就晕了,什么意思啊

稍微有经验的的人就知道这是缺少lib库文件。

GetOpenFileName这个函数用MSDN查看一下,翻到末尾,有没有看到

Import Library: Use comdlg32.lib   -》这个提示

所以我们把comdlg32.lib加进去。


这里有一个问题?为什么头文件sample.h没有用到呢?

解答:在编译连接时不需要指定头文件,将头文件放到当前目录下,系统会自动引用。

三:下面的工作就是仔细分析代码了,借助MSDN看懂不是很难。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多