head程式

王朝百科·作者佚名  2010-01-04
窄屏简体版  字體:   |    |    |  超大  

UNIX中有一个著名的实用程式叫做head,它显示档案开始的几行。让我们使用清单方块为Windows编写一个类似的程式。如程式9-6所示,HEAD将所有档案和子目录列在清单方块中。您可以挑选某个被选择的档案来显示,方法是在该档案上使用滑鼠双击或者使用Enter键按下要选的档案。您也可以使用这两种方法之一来改变子目录。这个程式在HEAD视窗显示区域的右边,从档案的开头开始显示,它最多能够显示8 KB的内容。

程式9-6 HEAD

HEAD.C

/*-------------------------------------------------------------------------

HEAD.C -- Displays beginning (head) of file

(c) Charles Petzold, 1998

--------------------------------------------------------------------------*/

#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 WndProc (HWND, UINT, WPARAM, LPARAM) ;

LRESULT CALLBACK ListProc (HWND, UINT, WPARAM, LPARAM) ;

WNDPROC OldList ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[] = TEXT ("head") ;

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 (NULL, IDI_APPLICATION) ;

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;

wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))

{

MessageBox ( NULL, TEXT ("This program requires Windows NT!"),

szAppName, MB_ICONERROR) ;

return 0 ;

}

hwnd = CreateWindow ( szAppName, TEXT ("head"),

WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,

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 ;

}

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 ("*.*")) ;

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] = '' ;

// If setting the directory doesn't work, maybe it's

// a drive change, so try that.

if (!SetCurrentDirectory (szBuffer + 1))

{

szBuffer [3] = ':' ;

szBuffer [4] = '' ;

SetCurrentDirectory (szBuffer + 2) ;

}

// Get the new directory name and fill the list box.

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 (szFile,

GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)))

{

bValidFile = FALSE ;

break ;

}

ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;

CloseHandle (hFile) ;

// i now equals the number of bytes in buffer.

// Commence getting a device context for displaying text.

hdc = BeginPaint (hwnd, &ps) ;

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

SetTextColor (hdc, GetSysColor (COLOR_BTNTEXT)) ;

SetBkColor (hdc, GetSysColor (COLOR_BTNFACE)) ;

// Assume the file is ASCII

DrawTextA (hdc, 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) ;

}

在ENVIRON中,当我们选择一个环境变数时-无论是使用滑鼠还是键盘-程式都将显示一个环境字串。但是,如果我们在HEAD中使用这种选择显示方法,那么程式回应会很慢,这是因为在清单方块中移动选择时,程式仍然要不断地打开和关闭档案。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航