簡單檔案IO

來源:互聯網
上載者:User

#include <windows.h>
#include "resource.h"
#pragma comment(linker, "/subsystem:windows")

//過程函數的傳回值都是LRESULT,類型都是CALLBACK
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow)
{
 HWND hwnd;  //主視窗控制代碼,在CreateWindow中賦值
 MSG msg;  //訊息變數,在GetMessage中使用
 WNDCLASS wndclass;  //視窗類別
 TCHAR* szAppName = TEXT("File"); //類名和視窗名
 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //視窗背景
 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);  //滑鼠
 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //表徵圖
 wndclass.lpszClassName = szAppName;  //類名
 wndclass.cbClsExtra = 0;  //類的額外參數
 wndclass.cbWndExtra = 0;  //視窗的額外參數.用於基於同一視窗類別的視窗各自區分.
         //在自訂對話方塊類時必須指定為DLGWINDOWEXTRA的大小
 wndclass.lpszMenuName = TEXT("MAINMENU"); //菜單名.可以用作子視窗的id
 wndclass.style = CS_HREDRAW | CS_VREDRAW; //視窗風格
 wndclass.lpfnWndProc = WndProc;  //視窗過程
 wndclass.hInstance = hInstance;  //包含視窗過程的執行個體控制代碼

 if( !RegisterClass(&wndclass) )  //註冊視窗類別
  return 0;
 hwnd = CreateWindow(    //建立視窗
    szAppName,    //視窗類別名
    szAppName,    //視窗標題
    WS_OVERLAPPEDWINDOW, //視窗風格
    CW_USEDEFAULT,   //初始的x座標
    CW_USEDEFAULT,   //初始的y座標
    CW_USEDEFAULT,   //初始的寬度
    CW_USEDEFAULT,   //初始的高度
    NULL,     //父視窗
    NULL,     //菜單
    hInstance,    //和視窗相關的執行個體控制代碼
    NULL     //額外參數
    );
 ShowWindow( hwnd,nCmdShow );  //顯示視窗
 UpdateWindow( hwnd );    //更新視窗
 while( GetMessage(&msg,NULL,0,0) ) //訊息迴圈
 {
  TranslateMessage(&msg);   //將WM_XXXKEYXXX訊息翻譯為WM_CHAR訊息
  DispatchMessage(&msg);   //傳遞訊息到視窗過程
 } 
 return msg.wParam;     //返回
}

int FileDialog(HWND hwndParent, TCHAR* szFile, BOOL bOpen)
{
 OPENFILENAME ofn;
 ZeroMemory(&ofn, sizeof(ofn));
 ofn.Flags = OFN_EXPLORER;
 ofn.lStructSize = sizeof(ofn);
 ofn.hwndOwner = hwndParent;
 ofn.lpstrFile = szFile;
 ofn.nMaxFile = MAX_PATH;
 ofn.lpstrFile[0] = '/0';
 ofn.lpstrFilter = TEXT("Text Files(*.txt)/0*.txt/0");

 return
  bOpen ?
  GetOpenFileName(&ofn) :
  GetSaveFileName(&ofn);
}

LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
 switch( message )
 {
 case WM_COMMAND:
  switch( LOWORD(wParam) )
  {
  case IDM_FILE_NEW:
   {    
    MessageBox(hwnd, TEXT("功能有待實現"), TEXT("File"), MB_OK);
    return 0;
   }
  case IDM_FILE_OPEN:
   {
    TCHAR szFile[MAX_PATH];
    if ( FileDialog(hwnd, szFile, TRUE) )
    {
     HDC hdc = GetDC(hwnd);
     RECT rc;

     DWORD dwBytesRead =0;
     HANDLE hFile = CreateFile(
      szFile, //要開啟的檔案的檔案名稱
      GENERIC_READ, //開啟來做什麼?
      FILE_SHARE_WRITE | FILE_SHARE_READ, //其他程式可以做什麼?
      NULL, //SECURITY_ATTRIBUTE,一般為NULL
      OPEN_EXISTING, //是要建立檔案,還是開啟現有的?
      FILE_ATTRIBUTE_NORMAL,//檔案屬性,隱藏檔案? 唯讀檔案? ...
      NULL); //檔案屬性的模板, 一般為NULL
     TCHAR szData[20];
     BOOL bResult = ReadFile(
      hFile, //要讀哪個檔案?
      szData, //讀到哪裡?
      20,  //讀多少東西?
      &dwBytesRead, //真正讀了多少? 如果下面的為NULL,這個就不能為NULL
      NULL); //一般為NULL
     if( bResult && dwBytesRead == 0 )
     {
      //還沒有學會怎麼判斷檔案結束
      //這裡這樣判斷是不對的
      MessageBox(hwnd, TEXT("EOF MET!"), TEXT("File"), MB_OK);
      //return 0;
     }

     GetClientRect(hwnd, &rc);
     DrawText(hdc, szData, 3, &rc, DT_CENTER);//3是字元數
     ReleaseDC(hwnd, hdc);
     CloseHandle(hFile);
    }
    return 0;
   }
  case IDM_FILE_SAVE:
   {
    TCHAR szFile[MAX_PATH];
    if( FileDialog(hwnd, szFile, FALSE) )
    {
     HANDLE hFile = CreateFile(
      szFile,    //檔案名稱
      GENERIC_WRITE,  //指定操作許可權
      FILE_SHARE_WRITE, //指定其他程式對此檔案的操作許可權
      NULL,    //SECURITY_ATTRIBUTE
      OPEN_EXISTING,  //
      FILE_ATTRIBUTE_NORMAL,//檔案屬性
      NULL);    //檔案屬性模板

     DWORD dwBytesWritten = 0;
     SetFilePointer( //檔案指標
      hFile,  //設定哪個檔案的指標?
      10,   //位移多少
      NULL,  //也是位移量. 與上面這個一起, 使位移量可以更大 
      FILE_BEGIN);//相對哪個位置位移
     SetEndOfFile(hFile); //改變檔案大小
     WriteFile(
      hFile,  //寫哪個檔案?
      TEXT("HELLO"),//寫什麼內容?
      5,   //寫多少?
      &dwBytesWritten,//真正寫了多少?
      NULL);  //和讀檔案的一樣, 為NULL就行了

     if( hFile != NULL )
     {
      CloseHandle(hFile);
     }
    }
    return 0;
   }
  case IDM_FILE_DELETE:
   {
    TCHAR szFile[MAX_PATH];
    if(FileDialog(hwnd, szFile, TRUE))
    {
     DeleteFile(szFile); //永久刪除檔案. 如果要放到資源回收筒, 用SHFileOperation
    }
    return 0;
   }
  case IDM_FILE_EXIT:
   {
    PostQuitMessage(0);
    return 0;
   }
  }//WM_COMMAND
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }//switch(message)
 return DefWindowProc( hwnd,message,wParam,lParam );

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.