...
#define DTFLAGS (DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP | DT_NOPREFIX)
...
case WM_PAINT:
if(!bValidFile)
break;
if(INVALID_HANDLE_VALUE!=(hFile=CreateFile(szBuffer,
GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)))
{
bValidFile=FALSE;
break;
}
ReadFile(hFile,buffer,MAXREAD,(LPDWORD)(&i),NULL);
CloseHandle(hFile);
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
DrawTextA(hdc,(LPCSTR)buffer,i,&rect,DTFLAGS);
EndPaint(hwnd,&ps);
return 0;
我感觉这个应该可以在显示区显示文件内容才对,为什么编译出来没有这功能呢?

解决方案 »

  1.   

    把szBuffer指向的文件中的内容以颜色COLOR_BTNTEXT显示在背景色为COLOR_BTNFACE的界面上
      

  2.   

    如果编译出来没这个功能:
    1、看看WM_PAINT消息有没有被响应
    2、bValidFile是不是true
    3、szBuffer指向的文件是否存在
      

  3.   

    #define DTFLAGS (DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP | DT_NOPREFIX) //风格样式
    ...
    case WM_PAINT:
            if(!bValidFile)
                break;
         //打开文件
            if(INVALID_HANDLE_VALUE!=(hFile=CreateFile(szBuffer,
                    GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)))
            {
                bValidFile=FALSE;
                break;
            }
         //读文件
            ReadFile(hFile,buffer,MAXREAD,(LPDWORD)(&i),NULL);
         //关闭文件句柄
            CloseHandle(hFile);
            hdc=BeginPaint(hwnd,&ps);
         //选择字体资源
            SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
         //设置文件颜色
            SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
         //设置背景颜色
            SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
         //在屏上显示
            DrawTextA(hdc,(LPCSTR)buffer,i,&rect,DTFLAGS);
            EndPaint(hwnd,&ps);
            return 0;
      

  4.   


    全代码如下,麻烦大神看一下。#include <Windows.h>#define ID_LIST 1
    #define ID_TEXT 2#define MAXREAD 8192
    #define DIRATTR (DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM |\
    DDL_DIRECTORY | DDL_ARCHIVE | DDL_DRIVES)
    #define DTFLAGS (DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP | DT_NOPREFIX)LRESULT CALLBACK ListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
    WNDPROC OldList;
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )
    {
    static TCHAR szAppName[]=TEXT("temp");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass; wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    // wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hInstance=hInstance;
    wndclass.lpfnWndProc=WndProc;
    wndclass.lpszClassName=szAppName;
    wndclass.lpszMenuName=NULL;
    wndclass.style=CS_HREDRAW | CS_VREDRAW; if(!RegisterClass(&wndclass))
    {
    MessageBox(NULL,TEXT("注册失败"),szAppName,MB_ICONERROR);
    return 0;
    } hwnd=CreateWindow(
    szAppName,
    TEXT("temp"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nShowCmd);
    UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    static BOOL bValidFile;
    static BYTE buffer[MAXREAD];
    static HWND hwndList,hwndText;
    static RECT rect;
    static TCHAR szFile[MAX_PATH+1];
    HANDLE hFile;
    HDC hdc;
    int i,cxChar,cyChar;
    PAINTSTRUCT ps;
    TCHAR szBuffer[MAX_PATH+1];
    switch(message)
    {
    case WM_CREATE:
    cxChar=LOWORD(GetDialogBaseUnits());
    cyChar=HIWORD(GetDialogBaseUnits());
    rect.left=20*cxChar;
    rect.top=3*cyChar;
    hwndList=CreateWindow(
    TEXT("listbox"),
    NULL,
    WS_CHILDWINDOW | WS_VISIBLE | LBS_STANDARD,
    cxChar,cyChar*3,cxChar*13+GetSystemMetrics(SM_CXVSCROLL),cyChar*10,
    hwnd,(HMENU)ID_LIST,
    (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
    GetCurrentDirectory(MAX_PATH+1,szBuffer);
    hwndText=CreateWindow(
    TEXT("static"),
    szBuffer,
    WS_CHILDWINDOW | WS_VISIBLE | SS_LEFT,
    cxChar,cyChar,cxChar*MAX_PATH,cyChar,
    hwnd,(HMENU)ID_TEXT,
    (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
    OldList=(WNDPROC)SetWindowLong(hwndList,GWL_WNDPROC,(LPARAM)ListProc);
    SendMessage(hwndList,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*") /*(LPARAM)TEXT("D:\\赵一丁")*/);
    return 0;
    case WM_SIZE:
    rect.right=LOWORD(lParam);
    rect.bottom=HIWORD(lParam);
    return 0;
    case WM_SETFOCUS:
    SetFocus(hwndList);
    return 0;
    case WM_COMMAND:
    if(LOWORD(wParam)==ID_LIST && HIWORD(wParam)==LBN_DBLCLK)
    {
    if(LB_ERR==(i=SendMessage(hwndList,LB_GETCURSEL,0,0)))
    break;
    SendMessage(hwndList,LB_GETTEXT,i,(LPARAM)szBuffer);
    if(INVALID_HANDLE_VALUE!=(hFile=CreateFile(szBuffer,
    GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)))
    {
    CloseHandle(hFile);
    bValidFile=TRUE;
    lstrcpy(szFile,szBuffer);
    GetCurrentDirectory(MAX_PATH+1,szBuffer);
    if(szBuffer[lstrlen(szBuffer)-1]!='\\')
    lstrcat(szBuffer,TEXT("\\"));
    SetWindowText(hwndText,lstrcat(szBuffer,szFile));
    }
    else
    {
    bValidFile=FALSE;
    szBuffer[lstrlen(szBuffer)-1]='\0';
    if(!SetCurrentDirectory(szBuffer+1))
    {
    szBuffer[3]=':';
    szBuffer[4]='\0';
    SetCurrentDirectory(szBuffer+2);
    }
    GetCurrentDirectory(MAX_PATH+1,szBuffer);
    SetWindowText(hwndText,szBuffer);
    SendMessage(hwndList,LB_RESETCONTENT,0,0);
    SendMessage(hwndList,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*"));
    }
    InvalidateRect(hwnd,NULL,TRUE);
    }
    return 0;
    case WM_PAINT:
    if(!bValidFile)
    break;
    if(INVALID_HANDLE_VALUE!=(hFile=CreateFile(szBuffer,
    GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)))
    {
    bValidFile=FALSE;
    break;
    }
    ReadFile(hFile,buffer,MAXREAD,(LPDWORD)(&i),NULL);
    CloseHandle(hFile);
    hdc=BeginPaint(hwnd,&ps);
    SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
    SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
    SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
    DrawTextA(hdc,(LPCSTR)buffer,i,&rect,DTFLAGS);
    EndPaint(hwnd,&ps);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    } return DefWindowProc(hwnd,message,wParam,lParam);
    }LRESULT CALLBACK ListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    if(message==WM_KEYDOWN && wParam==VK_RETURN)
    SendMessage(GetParent(hwnd),WM_COMMAND,MAKELONG(1,LBN_DBLCLK),(LPARAM)hwnd);
    return CallWindowProc(OldList,hwnd,message,wParam,lParam);
    }
      

  5.   

    两处严重错误,一是WM_PAINT有逻辑反了,二是使用static变量用法也感觉不对,移到外面就行了,在list列表双击,显示内容// 5.cpp : Defines the entry point for the application.
    //#include "stdafx.h"#include <Windows.h>#define ID_LIST    1
    #define ID_TEXT    2#define MAXREAD    8192
    #define DIRATTR    (DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM |\
        DDL_DIRECTORY | DDL_ARCHIVE | DDL_DRIVES)
    #define DTFLAGS (DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP | DT_NOPREFIX)LRESULT CALLBACK ListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
    WNDPROC OldList;
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);/////////////////////////////////////////////////////////////移到这里BOOL bValidFile;
    BYTE buffer[MAXREAD];
    HWND hwndList,hwndText;
        HANDLE hFile;
    TCHAR szFile[MAX_PATH+1];
         TCHAR szBuffer[MAX_PATH+1];
    RECT rect;
    ///////////////////////////////////////////////////////////////int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )
    {
        static TCHAR szAppName[]=TEXT("temp");
        HWND hwnd;
        MSG msg;
        WNDCLASS wndclass;    wndclass.cbClsExtra=0;
        wndclass.cbWndExtra=0;
    //    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
        wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
        wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
        wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        wndclass.hInstance=hInstance;
        wndclass.lpfnWndProc=WndProc;
        wndclass.lpszClassName=szAppName;
        wndclass.lpszMenuName=NULL;
        wndclass.style=CS_HREDRAW | CS_VREDRAW;    if(!RegisterClass(&wndclass))
        {
            MessageBox(NULL,TEXT("注册失败"),szAppName,MB_ICONERROR);
            return 0;
        }    hwnd=CreateWindow(
            szAppName,
            TEXT("temp"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,
            CW_USEDEFAULT,CW_USEDEFAULT,
            NULL,NULL,hInstance,NULL);    ShowWindow(hwnd,nShowCmd);
        UpdateWindow(hwnd);    while(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {   HDC hdc;
        int i,cxChar,cyChar;
        PAINTSTRUCT    ps;
        switch(message)
        {
        case WM_CREATE:
            cxChar=LOWORD(GetDialogBaseUnits());
            cyChar=HIWORD(GetDialogBaseUnits());
            rect.left=20*cxChar;
            rect.top=3*cyChar;
            hwndList=CreateWindow(
                TEXT("listbox"),
                NULL,
                WS_CHILDWINDOW | WS_VISIBLE | LBS_STANDARD,
                cxChar,cyChar*3,cxChar*13+GetSystemMetrics(SM_CXVSCROLL),cyChar*10,
                hwnd,(HMENU)ID_LIST,
                (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
            GetCurrentDirectory(MAX_PATH+1,szBuffer);
            hwndText=CreateWindow(
                TEXT("static"),
                szBuffer,
                WS_CHILDWINDOW | WS_VISIBLE | SS_LEFT,
                cxChar,cyChar,cxChar*MAX_PATH,cyChar,
                hwnd,(HMENU)ID_TEXT,
                (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
            OldList=(WNDPROC)SetWindowLong(hwndList,GWL_WNDPROC,(LPARAM)ListProc);
            SendMessage(hwndList,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*") /*(LPARAM)TEXT("D:\\赵一丁")*/);
            return 0;
        case WM_SIZE:
            rect.right=LOWORD(lParam);
            rect.bottom=HIWORD(lParam);
            return 0;
        case WM_SETFOCUS:
            SetFocus(hwndList);
            return 0;
        case WM_COMMAND:
            if(LOWORD(wParam)==ID_LIST && HIWORD(wParam)==LBN_DBLCLK)
            {
                if(LB_ERR==(i=SendMessage(hwndList,LB_GETCURSEL,0,0)))
                    break;
                SendMessage(hwndList,LB_GETTEXT,i,(LPARAM)szBuffer);
                if(INVALID_HANDLE_VALUE!=(hFile=CreateFile(szBuffer,
                    GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)))
                {
                    CloseHandle(hFile);
                    bValidFile=TRUE;
                    lstrcpy(szFile,szBuffer);
                    GetCurrentDirectory(MAX_PATH+1,szBuffer);
                    if(szBuffer[lstrlen(szBuffer)-1]!='\\')
                        lstrcat(szBuffer,TEXT("\\"));
                    SetWindowText(hwndText,lstrcat(szBuffer,szFile));
                }
                else
                {
                    bValidFile=FALSE;
                    szBuffer[lstrlen(szBuffer)-1]='\0';
                    if(!SetCurrentDirectory(szBuffer+1))
                    {
                        szBuffer[3]=':';
                        szBuffer[4]='\0';
                        SetCurrentDirectory(szBuffer+2);
                    }
                    GetCurrentDirectory(MAX_PATH+1,szBuffer);
                    SetWindowText(hwndText,szBuffer);
                    SendMessage(hwndList,LB_RESETCONTENT,0,0);
                    SendMessage(hwndList,LB_DIR,DIRATTR,(LPARAM)TEXT("*.*"));
                }
                InvalidateRect(hwnd,NULL,TRUE);
            }
            return 0;
        case WM_PAINT:
            if(!bValidFile)
                break;
    ///////////////////////////////////////////////////原文逻辑反了
            if(INVALID_HANDLE_VALUE==(hFile=CreateFile(szBuffer,
                    GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)))
            {
                bValidFile=FALSE;
                break;
            }
            ReadFile(hFile,buffer,MAXREAD,(LPDWORD)(&i),NULL);
            CloseHandle(hFile);
            hdc=BeginPaint(hwnd,&ps);
            SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
            SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
            SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
            DrawTextA(hdc,(LPCSTR)buffer,i,&rect,DTFLAGS);
            EndPaint(hwnd,&ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }    return DefWindowProc(hwnd,message,wParam,lParam);
    }LRESULT CALLBACK ListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
        if(message==WM_KEYDOWN && wParam==VK_RETURN)
            SendMessage(GetParent(hwnd),WM_COMMAND,MAKELONG(1,LBN_DBLCLK),(LPARAM)hwnd);
        return CallWindowProc(OldList,hwnd,message,wParam,lParam);
    }
      

  6.   


    谢谢。
    1、逻辑反了。
    2、要在 TCHAR szBuffer[MAX_PATH+1]前也加static.