#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 hI, HINSTANCE hPI, PSTR szCL, int iCS) {
static TCHAR szAppName[] = TEXT("Leitura de Disco");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hI;
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("Windows NT"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(
szAppName, TEXT("Leitura de Disco:"), 0xcf0000 | 0x2000000,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hI, NULL
);
ShowWindow(hwnd, iCS);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
static BOOL bValidFile;
static BYTE buffer[MAXREAD];
static 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(msg) {
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(2), cyChar*10,
hwnd, (HMENU) ID_LIST, (HINSTANCE) GetWindowLong(hwnd, -6), 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, -6), NULL
);
OldList = (WNDPROC) SetWindowLong(hwndList, -4, (LPARAM) ListProc);
SendMessage(hwndList, LB_DIR, DIRATTR, (LPARAM) TEXT("*.*"));
return 0;
case WM_SIZE:
rect.right = LOWORD(lp);
rect.bottom = HIWORD(lp);
return 0;
case WM_SETFOCUS:
SetFocus(hwndList);
return 0;
case WM_COMMAND:
if(LOWORD(wp)==ID_LIST && HIWORD(wp)==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(szFile, GENERIC_READ,
FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL))) {
bValidFile = FALSE;
break;
}
ReadFile(hFile, buffer, MAXREAD, &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, buffer, i, &rect, DTFLAGS);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
LRESULT CALLBACK ListProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
if(msg==WM_KEYDOWN && wp==VK_RETURN)
SendMessage(GetParent(hwnd), WM_COMMAND, MAKELONG(1, LBN_DBLCLK), (LPARAM) hwnd);
return CallWindowProc(OldList, hwnd, msg, wp, lp);
}
Comentários
Postar um comentário