我正在尝试使用公共对话框读取小文本文件的内容,将文件中的文本传递到缓冲区,并通过使窗口无效并强制重新绘制将其绘制到表单中。
除了在屏幕上显示文本外,一切都有效,当我点击对话框上的OK按钮时,没有文字出现。
我是C的新手所以我可能错过了关键字或使用了错误的指针。
到目前为止,这是我的代码片段:
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{
CHAR fileText[1024];
HDC hdc;
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
HANDLE fileHandle;
RECT clientArea;
PAINTSTRUCT pStruct;
// Act on current message
switch(message)
{
case WM_CREATE:
AddMenus(hMainWindow);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_FILE_OPEN:
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.hwndOwner = hMainWindow;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0");
ofn.nFilterIndex = 1;
ofn.lpstrInitialDir = NULL;
ofn.lpstrFileTitle = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn))
{
fileHandle = CreateFile(&ofn.lpstrFile,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
ReadFile(fileHandle,fileText,1023,0,0);
CloseHandle(fileHandle);
}
GetClientRect(hMainWindow, &clientArea);
InvalidateRect(hMainWindow,
&clientArea,
TRUE
);
break;
case IDM_FILE_QUIT:
SendMessage(hMainWindow, WM_CLOSE, 0, 0);
break;
}
break;
case WM_PAINT:
hdc = BeginPaint(hMainWindow, &pStruct);
DrawTextA(hdc,
fileText,
-1,
&clientArea,
DT_WORDBREAK);
EndPaint(hMainWindow, &pStruct);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hMainWindow, message, wParam, lParam);
}
return 0;
}
我到底哪里错了?此外,我知道它的概念并不完美,因为我的目标是简单地让它工作,然后重新考虑它。
感谢您的时间。
答案 0 :(得分:1)
CreateFile(W)的第一个参数类型是LPCWSTR
(常量WString)。
ofn.lpstrFile
是LPWSTR
(WString)
所以&ofn.lpstrFile
代码错误(作为LPWSTR*
)。
答案 1 :(得分:0)
这:ReadFile(fileHandle,fileText,1023,0,0);
应该是:ReadFile(fileHandle, &fileText,1023,0,0);
使用char*
而不是数组。 char
指针基本上将指向数组中的第一项。