#include<windows.h> #include<commdlg.h> #include"resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
static OPENFILENAME
ofn;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[]= TEXT("openFile");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style
= CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc
= WndProc;
wndclass.cbClsExtra
= 0;
wndclass.cbWndExtra
= 0;
wndclass.hInstance
= hInstance;
wndclass.hIcon
= LoadIcon(hInstance, szAppName);
wndclass.hCursor
= LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground
= GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName
= szAppName;
wndclass.lpszClassName
= szAppName;
if(!RegisterClass(&wndclass)){
MessageBox(NULL, TEXT("Register failure..."),
szAppName, MB_ICONERROR); return 0; }
hwnd = CreateWindow(szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL,
hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,
0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg); } return msg.wParam; }
/*
初始文件
把初始文件作为一个函数,在创建窗口的时候调用
这样才不用在保存文件的时候再写一次
*/
void PopFileInitialize(HWND hwnd)
{
static TCHAR szFilter[] = TEXT("文本文档(*.txt)\0*.txt\0") \ TEXT("ASCII文档 (*.ASC)\0*.asc\0") \ TEXT("所有文档(*.*)\0*.*\0\0");
// 确定结构的大小
ofn.lStructSize = sizeof(OPENFILENAME);
// 指定它的父窗口
ofn.hwndOwner = hwnd;
// 一般为NULL,表示我们使用的是通用对话框,
// 当然我们也可以自定义对话框,此时hInstance指示资源的handle。
ofn.hInstance = NULL;
// 指示打开或者保存文件时的过滤器,比如说:
// static TCHAR szFilter[] = TEXT("Text Files(*.txt)\0*.txt\0") \
// TEXT("All Files(*.*)\0*.*\0\0");
// 结构是这样的:描述\0过滤\0, 最后一项必须是两个\0,
// 详情请参考MSDN。
ofn.lpstrFilter = szFilter;
// 一般为NULL
ofn.lpstrCustomFilter = NULL;
// 一般为0
ofn.nMaxCustFilter = 0;
// 指示默认过滤器为第几项
ofn.nFilterIndex = 0;
// 用于保存文件的完事路径及文件名
ofn.lpstrFile = NULL;
// 指示上面结构的大小
ofn.nMaxFile = MAX_PATH;
// 用于保存文件名,不包括路径
ofn.lpstrFileTitle = NULL;
// 指示上面结构的大小
ofn.nMaxFileTitle = MAX_PATH;
// 指示打开对话框的第一路径,
// 我发现为NULL时,初始化路径总是“我的文档”。
ofn.lpstrInitialDir = NULL;
// 指示对话框的caption, 我们一般为NULL,让系统指示, 当然也可以自己设置。
ofn.lpstrTitle = NULL;
// 这个东西在打开保存等有点不同,下面是为了打开而设置的
// 我们以后会看到保存时此项的设置。
ofn.Flags = OFN_HIDEREADONLY;
// 为0就可以了
ofn.nFileOffset = 0;
// 为0就可以了
ofn.nFileExtension = 0;
// 如果你保存的时候忘记加.txt时,它会自动给你加上。
ofn.lpstrDefExt = TEXT("txt");
// 为0就可以了
ofn.lCustData = 0;
// 为NULL就可以了
ofn.lpfnHook = NULL;
// 如果想定制对话框, 下面的就不能为NULL了
// 但是我们一般为NULL。
ofn.lpTemplateName = NULL;
}
BOOL openDlg(HWND hwnd, TCHAR* fullPath, TCHAR*
fileName)
{ ofn.hwndOwner= hwnd;
ofn.lpstrFile= pstrFileName;
ofn.lpstrFileTitle= pstrTitleName;
ofn.Flags= OFN_HIDEREADONLY| OFN_CREATEPROMPT;
return GetOpenFileName(&ofn);
}
BOOL openReadFile(HWND hwnd, TCHAR* fullPath){
HANDLE hFile;
PBYTE pBuffer; int iFileLength;
DWORD dwByteRead;
if(INVALID_HANDLE_VALUE==(hFile=
CreateFile(
fullPath, GENERIC_READ, FILE_SHARE_READ,NULL,
OPEN_EXISTING, 0,NULL))) return FALSE;
iFileLength = GetFileSize(hFile,NULL);
pBuffer =
malloc(iFileLength
+ 2);
ReadFile(hFile, pBuffer, iFileLength,&dwByteRead,NULL);
CloseHandle(hFile);
pBuffer[iFileLength]= pBuffer[iFileLength+ 1]='\0';
SetWindowText(hwnd, pBuffer); free(pBuffer); return TRUE; }
LRESULT CALLBACK WndProc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{ static TCHAR fullPath[MAX_PATH], fileName[MAX_PATH];
TCHAR* pText; static HWND hwndEdit;
switch(message){ case WM_CREATE:
hwndEdit = CreateWindow(TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE
| ES_LEFT | WS_HSCROLL
| WS_VSCROLL | ES_MULTILINE
|
ES_AUTOVSCROLL,
0, 0, 0, 0,
hwnd, (HMENU)1, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
PopFileInitialize(hwnd);//初始化文件设置 return 0; case WM_SIZE:
MoveWindow(hwndEdit, 0, 0, LOWORD(lParam),
HIWORD(lParam),TRUE); return 0;
case WM_COMMAND: switch(LOWORD(wParam)){ case IDM_FILE_OPEN: if(!openDlg(hwnd, fullPath,
fileName)){
MessageBox(NULL, TEXT("can not open file."),
TEXT("Error"), MB_ICONERROR);
fullPath[0]='\0';
fileName[0]='\0'; return 0; } if(!openReadFile(hwndEdit, fullPath)){
MessageBox(NULL, TEXT("error read file."),
TEXT("Error"), MB_ICONERROR);
fullPath[0]='\0';
fileName[0]='\0'; return 0; } break; default: break; } return 0; case WM_DESTROY:
PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
|