MENUITEM "&Abrir Bitmap", IDM_FILE_OPEN


/**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