回 帖 发 新 帖 刷新版面

主题:研究了几天了,难死我了,高手帮帮忙

/* 要创建一个窗口,包含一个文件(IDR_TYPER)菜单,文件菜单下有关闭(ID_FILE_EXIT)和打开(ID_OPEN)当单击打开时会打开一个打开的通用对话框,在选择文本文件后,本想让文件内容显示在窗口中,但总是不能正常显示,高手来帮忙啊*/

#include <windows.h>
#include "resource.h"
#include <string>

// 窗口函数的函数原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
//打开文件函数
BOOL OpFile(char szFileName[256]);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    char szClassName[] = "MainWClass";    
    WNDCLASSEX wndclass;
    
    // 用描述主窗口的参数填充WNDCLASSEX结构
    wndclass.cbSize = sizeof(wndclass);    // 结构的大小
    wndclass.style = CS_HREDRAW|CS_VREDRAW;    // 指定如果大小改变就重画
    wndclass.lpfnWndProc = MainWndProc;    // 窗口函数指针
    wndclass.cbClsExtra = 0;        // 没有额外的类内存
    wndclass.cbWndExtra = 0;        // 没有额外的窗口内存
    wndclass.hInstance = hInstance;        // 实例句柄 
    wndclass.hIcon = ::LoadIcon(hInstance, 
            (LPSTR)IDI_TYPER);    // 使用自定义图标    
    wndclass.hCursor = ::LoadCursor(NULL,
            IDC_ARROW);        // 使用预定义的光标
    wndclass.hbrBackground =  
        (HBRUSH)(COLOR_3DFACE + 1);    // 使用预定义画刷
    wndclass.lpszMenuName = (LPSTR)IDR_TYPER;    
    wndclass.lpszClassName = szClassName ;    // 窗口类的名称    
    wndclass.hIconSm = NULL;        // 没有类的小图标
    
    // 注册这个窗口类
    ::RegisterClassEx(&wndclass); 
    
    // 创建主窗口
    HWND hwnd = ::CreateWindowEx( 
        WS_EX_CLIENTEDGE,    
        szClassName,        // lpClassName,类名    
        "My first Window!",        // lpWindowName,标题    
        WS_OVERLAPPEDWINDOW,        // dwStyle,窗口风格    
        CW_USEDEFAULT,        // X,初始 X 坐标    
        CW_USEDEFAULT,        // Y,初始 Y 坐标    
        CW_USEDEFAULT,        // nWidth,宽度    
        CW_USEDEFAULT,        // nHeight,高度    
        NULL,            // hWndParent,父窗口句柄
        NULL,            // hMenu,菜单句柄    
        hInstance,        // hlnstance,程序实例句柄    
        NULL) ;            // lpParam,用户数据    
    if(hwnd == NULL)
    {
        ::MessageBox(NULL, "创建窗口出错!", "error", MB_OK);
        return -1;
    }

    // 显示窗口,刷新窗口客户区
    ::ShowWindow(hwnd, nCmdShow);
    ::UpdateWindow(hwnd);
    // 从消息堆中取出消息
    MSG msg;    
    while(::GetMessage(&msg, NULL, 0, 0)
    {
        // 转化键消息
        ::TranslateMessage(&msg);
        // 将消息发送到相应的窗口函数
        ::DispatchMessage(&msg);
    }
    // 当GetMessage返回0时程序结束
    return msg.wParam;
}
    //两个全局变量
    char* filebegin="";    //显示内容
    char* fileread=(char*)malloc(sizeof(char));//打开文件后文件内容存储地点

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // str对象用于保存窗口客户区显示的字符串
    // 为了使用string类,应该包含头文件:“#include <string>”

    switch (message)
    {
    case WM_CREATE:
        {
        // 设置窗口的标题
        ::SendMessage(hwnd, WM_SETTEXT, 0, (long)"作者制作——记事本");
        return 0;
        }

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case ID_OPEN:
            {
            //打开文件对话框的显示
            char FileNameRead[256]="";
            OPENFILENAME file={0};
            file.lStructSize =sizeof(file);
            file.lpstrFile =FileNameRead;//打开文件的文件名
            file.nMaxFile =256;
            file.lpstrFilter ="Text File(*.txt)\0*.txt\0*.*\0\0";
            file.nFilterIndex =1;
            ::GetOpenFileName(&file);//显示对话框
            ::MessageBox (NULL,fileread,"filebegin",MB_OK);            //打开文件过程
            LPDWORD dsize=(DWORD*)malloc(sizeof(DWORD));
            //打开文件
            HANDLE hFile=::CreateFile (
                FileNameRead,GENERIC_READ|GENERIC_WRITE,
        FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        //判断文件是否打开成功
        if(hFile==INVALID_HANDLE_VALUE)
        {
        ::MessageBox (NULL,"打开文件失败!","操作提示",MB_OK);
        }
        else
        ::MessageBox (NULL,"打开文件成功!","操作提示",MB_OK);        //读取文件
        int a=ReadFile(hFile,fileread,
        GetFileSize(hFile,NULL),dsize,NULL);
        if(a==0)
        ::MessageBox (NULL,"读取文件失败!","操作提示",MB_OK);
        else
        ::MessageBox (NULL,"读取文件成功!","操作提示",MB_OK);
        return 0;
        }
        case ID_FILE_EXIT:
        // 向hwnd指定的窗口发送一个WM_CLOSE消息。
        int nSel=::MessageBox (NULL,"确定要退出?","记事本",
            MB_YESNOCANCEL|MB_ICONQUESTION|MB_DEFBUTTON3);
        if(nSel==IDYES)
            ::SendMessage(hwnd, WM_CLOSE, 0, 0);
        else
            ::SendMessage(hwnd, WM_PAINT, 0, 0);
            break;
        }

    case WM_PAINT:
        {
        PAINTSTRUCT ps;
        HDC hdc = ::BeginPaint(hwnd, &ps);
        // 设置输出文本的背景颜色和文字颜色
        ::SetTextColor(hdc, RGB(255, 0, 0));  
        ::SetBkColor(hdc, ::GetSysColor(COLOR_3DFACE));
        //输出文本
        ::TextOut(hdc, 0, 0, fileread, sizeof(fileread));
        ::EndPaint(hwnd, &ps);

        return 0;        }

    case WM_CHAR:
        {
            // 保存ansi码
            filebegin = filebegin + char(wParam);
            
            // 使整个客户区无效
            ::InvalidateRect(hwnd,NULL,0);
            return 0;
        }
    case WM_DESTROY: // 正在销毁窗口
            
        // 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环
            ::PostQuitMessage(0) ;
        return 0 ;
    }
    
    // 将我们不处理的消息交给系统做默认处理
    return ::DefWindowProc(hwnd, message, wParam, lParam);
}

回复列表 (共2个回复)

沙发

int a=ReadFile(hFile,fileread, GetFileSize(hFile,NULL),dsize,NULL);

没有给fileread分配足够的空间,所以读取不到数据~

板凳

这个问题我以前也接触过,开始的时候我也找不到问题的原因,后来我进了一个技术交流群,这个群里的人挺多的,在里面可以沟通技术,你可以进去看一下.群号是:六#二#八#七#八#零#四#三。另外,这个群里可以接项目。

我来回复

您尚未登录,请登录后再回复。点此登录或注册