#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 );
}