
/**E conhecereis a verdade, e a verdade vos libertará. João 8:32*/
#include <windows.h>
#include <commdlg.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR szAppName[] = TEXT("DibSect");
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hPI, PSTR szCmdLine, int iCS) {
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 (hI, IDI_ICON);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) WHITE_BRUSH;
wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;
if(!RegisterClass(&wndclass)) {
MessageBox(
NULL,
TEXT("This program requires Windows NT!"),
szAppName,
MB_ICONERROR
);
return 0;
}
hwnd = CreateWindow(
szAppName,
TEXT("hBitmap = CreateDibSectionFromDibFile(szFileName);"),
WS_OVERLAPPEDWINDOW,
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);
FreeConsole();
}
return msg.wParam;
}
HBITMAP CreateDibSectionFromDibFile(PTSTR szFileName) {
BITMAPFILEHEADER bmfh;
BITMAPINFO * pbmi;
BYTE * pBits;
BOOL bSuccess;
DWORD dwInfoSize, dwBytesRead;
HANDLE hFile;
HBITMAP hBitmap;
hFile = CreateFile(
szFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL
);
if(hFile == INVALID_HANDLE_VALUE)
return NULL;
bSuccess = ReadFile(
hFile,
&bmfh,
sizeof(BITMAPFILEHEADER),
&dwBytesRead,
NULL
);
if(!bSuccess || (dwBytesRead != sizeof(BITMAPFILEHEADER))
|| (bmfh.bfType != * (WORD *) "BM")) {
CloseHandle(hFile);
return NULL;
}
dwInfoSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
pbmi = malloc(dwInfoSize);
bSuccess = ReadFile(hFile, pbmi, dwInfoSize, &dwBytesRead, NULL);
if(!bSuccess || (dwBytesRead != dwInfoSize)) {
free(pbmi);
CloseHandle(hFile);
return NULL;
}
hBitmap = CreateDIBSection(NULL,pbmi,DIB_RGB_COLORS,&pBits,NULL,0);
if(hBitmap == NULL) {
free(pbmi);
CloseHandle(hFile);
return NULL;
}
ReadFile(hFile,pBits,bmfh.bfSize - bmfh.bfOffBits,&dwBytesRead,NULL);
free(pbmi);
CloseHandle(hFile);
return hBitmap;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
static HBITMAP hBitmap;
static int cxClient, cyClient;
static OPENFILENAME ofn;
static TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH];
static TCHAR szFilter[]=TEXT("Bitmap Files (*.BMP)\0*.bmp\0")
TEXT("All Files (*.*)\0*.*\0\0");
BITMAP bitmap;
HDC hdc, hdcMem;
PAINTSTRUCT ps;
switch(msg) {
case WM_CREATE:
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = szFilter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFileTitle = szTitleName;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = 0;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = TEXT("bmp");
ofn.lCustData = 0;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_COMMAND:
switch(LOWORD (wParam)) {
case IDM_FILE_OPEN:
if(!GetOpenFileName(&ofn)) /**libcomdlg32.a*/
return 0;
if(hBitmap) {
DeleteObject(hBitmap);
hBitmap = NULL;
}
SetCursor(LoadCursor (NULL, IDC_WAIT));
ShowCursor(TRUE);
hBitmap = CreateDibSectionFromDibFile(szFileName);
ShowCursor(FALSE);
SetCursor (LoadCursor(NULL, IDC_ARROW));
InvalidateRect(hwnd, NULL, TRUE);
if(hBitmap == NULL) {
MessageBox(
hwnd,
TEXT("Cannot load DIB file"),
szAppName,
MB_OK | MB_ICONEXCLAMATION
);
}
return 0;
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
if(hBitmap) {
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
BitBlt(
hdc, 0, 0,
bitmap.bmWidth, bitmap.bmHeight, hdcMem,
0, 0, SRCCOPY
);
DeleteDC(hdcMem);
}
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
if(hBitmap)
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
/********************Arquivo: resource.h********************/
#define IDI_ICON 1
#define IDM_FILE_OPEN 40001
/********************Arquivo: resource.rc********************/
#include "afxres.h"
#include "resource.h"
IDI_ICON ICON "icone.ico"
DIBSECT MENU DISCARDABLE
BEGIN
POPUP "&Arquivo"
BEGIN
MENUITEM "&Abrir Bitmap", IDM_FILE_OPEN
MENUITEM "Sem Evento", 2
END
MENUITEM "Sem Evento", 4
END
Comentários
Postar um comentário