用 C 编写的记事本

最近想好好研究C,于是便拿记事本这个小程序练练手。 自己从网上找了一个挺不错的,就从这个开始学习吧。。。。 一:代码 先

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

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

一:代码

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

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

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

#include "sample.h"    A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "sample.ico"    MAINMENU MENU  {    POPUP "文件(&F)"  {    MENUITEM "打开(&O)...", CM_FILE_OPEN    MENUITEM "另存为(&S)...", CM_FILE_SAVEAS    MENUITEM SEPARATOR    MENUITEM "关闭", CM_FILE_EXIT  }    POPUP "帮助(&H)"  {    MENUITEM "关于(&A)", CM_ABOUT  }  }

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

#define CM_FILE_SAVEAS    9072  #define CM_FILE_EXIT    9071  #define CM_FILE_OPEN    9070  #define CM_ABOUT        9069

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

#include <windows.h>  #include "sample.h"    static char g_szClassName[] = "MyWindowClass";  static HINSTANCE g_hInst = NULL;  #define IDC_MAIN_TEXT   1001    BOOL LoadFile(HWND hEdit, LPSTR pszFileName)  {     HANDLE hFile;     BOOL bSuccess = FALSE;         hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,        OPEN_EXISTING, 0, 0);     if(hFile != INVALID_HANDLE_VALUE)     {        DWORD dwFileSize;        dwFileSize = GetFileSize(hFile, NULL);        if(dwFileSize != 0xFFFFFFFF)        {           LPSTR pszFileText;           pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);           if(pszFileText != NULL)           {              DWORD dwRead;              if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))              {                 pszFileText[dwFileSize] = 0;                 if(SetWindowText(hEdit, pszFileText))                    bSuccess = TRUE;              }              GlobalFree(pszFileText);           }        }        CloseHandle(hFile);     }     return bSuccess;  }      BOOL SaveFile(HWND hEdit, LPSTR pszFileName)  {     HANDLE hFile;     BOOL bSuccess = FALSE;     hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);     if(hFile != INVALID_HANDLE_VALUE)     {        DWORD dwTextLength;        dwTextLength = GetWindowTextLength(hEdit);        if(dwTextLength > 0)        {           LPSTR pszText;           pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);           if(pszText != NULL)           {              if(GetWindowText(hEdit, pszText, dwTextLength + 1))              {                 DWORD dwWritten;                 if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))                    bSuccess = TRUE;              }              GlobalFree(pszText);           }        }        CloseHandle(hFile);     }     return bSuccess;  }      BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)  {     OPENFILENAME ofn;     char szFileName[MAX_PATH];         ZeroMemory(&ofn, sizeof(ofn));     szFileName[0] = 0;         ofn.lStructSize = sizeof(ofn);     ofn.hwndOwner = hwnd;     ofn.lpstrFilter = "文本文件 (*.txt)/0*.txt/0所有文件 (*.*)/0*.*/0/0";     ofn.lpstrFile = szFileName;     ofn.nMaxFile = MAX_PATH;     ofn.lpstrDefExt = "txt";         if(bSave)     {        ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |           OFN_OVERWRITEPROMPT;                  if(GetSaveFileName(&ofn))        {           if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))           {              MessageBox(hwnd, "保存文件失败.", "错误信息",                 MB_OK | MB_ICONEXCLAMATION);              return FALSE;           }        }     }     else     {        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;        if(GetOpenFileName(&ofn))        {           if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))           {              MessageBox(hwnd, "打开文件失败.", "错误信息",                 MB_OK | MB_ICONEXCLAMATION);              return FALSE;           }        }     }     return TRUE;  }      LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)  {     switch(Message)     {        case WM_CREATE:           CreateWindow("EDIT", "",              WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |                 ES_WANTRETURN,              CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,              hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL);               SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,              (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));        break;        case WM_SIZE:           if(wParam != SIZE_MINIMIZED)              MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),                 HIWORD(lParam), TRUE);        break;        case WM_SETFOCUS:           SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));        break;        case WM_COMMAND:           switch(LOWORD(wParam))           {              case CM_FILE_OPEN:                 DoFileOpenSave(hwnd, FALSE);              break;              case CM_FILE_SAVEAS:                 DoFileOpenSave(hwnd, TRUE);              break;              case CM_FILE_EXIT:                 PostMessage(hwnd, WM_CLOSE, 0, 0);              break;              case CM_ABOUT:                 MessageBox (NULL, "一个Windows C 记事本程序" , "关于...", 0);           }        break;        case WM_CLOSE:           DestroyWindow(hwnd);        break;        case WM_DESTROY:           PostQuitMessage(0);        break;        default:           return DefWindowProc(hwnd, Message, wParam, lParam);     }     return 0;  }      int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,     LPSTR lpCmdLine, int nCmdShow)  {     WNDCLASSEX WndClass;     HWND hwnd;     MSG Msg;       g_hInst = hInstance;       WndClass.cbSize        = sizeof(WNDCLASSEX);     WndClass.style         = 0;     WndClass.lpfnWndProc   = WndProc;     WndClass.cbClsExtra    = 0;     WndClass.cbWndExtra    = 0;     WndClass.hInstance     = g_hInst;     WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);     WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);     WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);     WndClass.lpszMenuName  = "MAINMENU";     WndClass.lpszClassName = g_szClassName;     WndClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);         if(!RegisterClassEx(&WndClass))     {        MessageBox(0, "注册窗口失败", "错误信息",           MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);        return 0;     }       hwnd = CreateWindowEx(        WS_EX_CLIENTEDGE,        g_szClassName,        "一个记事本程序",        WS_OVERLAPPEDWINDOW,        CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,        NULL, NULL, g_hInst, NULL);         if(hwnd == NULL)     {        MessageBox(0, "创建窗口失败", "错误信息",           MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);        return 0;     }         ShowWindow(hwnd, nCmdShow);     UpdateWindow(hwnd);         while(GetMessage(&Msg, NULL, 0, 0))     {        TranslateMessage(&Msg);        DispatchMessage(&Msg);     }     return Msg.wParam;  }

二:编译,连接运行

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

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

进入d:note下

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

用 C 编写的记事本

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

用 C 编写的记事本

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

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

用 C 编写的记事本

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

4.连接

用 C 编写的记事本

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

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

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

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

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

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

用 C 编写的记事本

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

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

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

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

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

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

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

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

未登录用户
全部评论0
到底啦