Code:
// Bit Map Viewer
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include "resource.h"
TCHAR szBitmapFilename[_MAX_PATH];
HBITMAP hBitmap;
HWND hWndMain;
///////////////////////////////////////////////////////////////////////////////////////
/////////////////////// Function Prototypes ///////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
void RegisterWindowClass();
BOOL GetBitmapFileName(TCHAR *filename, int len, HWND hWnd);
HBITMAP LoadBitmapFile(const TCHAR *filename);
BOOL MainWindow_OnCommand(HWND hWnd, WORD wCommand, WORD wNotify, HWND hControl);
void MainWindow_OnPaint(HWND hWnd, HDC hDC);
//BOOL MainDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
///////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
MSG msg;
RegisterWindowClass();
hWndMain = CreateWindowEx(WS_EX_APPWINDOW,
"SampleWindowClass", _T("Bitmap Viewer II"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWndMain, SW_SHOW);
while (GetMessage(&msg, NULL, 0, 0))
DispatchMessage(&msg);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////
BOOL MainDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;
switch (uMsg)
{
case WM_COMMAND:
return MainDialog_OnCommand(hWnd, LOWORD(wParam),
HIWORD(wParam), (HWND)lParam);
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
MainDialog_OnPaint(hWnd, hDC);
EndPaint(hWnd, &ps);
return TRUE;
case IDCANCEL:
DestroyWindow(hWnd);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
return TRUE;
}
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////////////
BOOL GetBitmapFileName(TCHAR *filename, int len, HWND hWnd)
{
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = _T("Bitmap Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0\0");
ofn.lpstrFile = filename;
ofn.nMaxFile = len;
ofn.lpstrTitle = _T("Browse");
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
return GetOpenFileName(&ofn);
}
///////////////////////////////////////////////////////////////////////////////////////
HBITMAP LoadBitmapFile(const TCHAR *filename)
{
return (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
}
///////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;
switch (uMsg)
{
case WM_COMMAND:
MainWindow_OnCommand(hWnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam);
return 0;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
MainWindow_OnPaint(hWnd, hDC);
EndPaint(hWnd, &ps);
return 0;
case WM_CLOSE:
DestroyWindow(hWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//////////////////////////////////////////////////////////////////////////////////////
void MainWindow_OnPaint(HWND hWnd, HDC hDC)
{
if (hBitmap == NULL)
return;
DrawState(hDC, NULL, NULL, (LPARAM)hBitmap, 0, 0, 0, 0, 0, DST_BITMAP | DSS_NORMAL);
}
//////////////////////////////////////////////////////////////////////////////////////
void RegisterWindowClass()
{
WNDCLASSEX wcx;
ZeroMemory(&wcx, sizeof(WNDCLASSEX));
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.lpfnWndProc = MainWindowProc;
wcx.hInstance = GetModuleHandle(NULL);
wcx.hIcon = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDR_MAIN));
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcx.lpszClassName = "SampleWindowClass";
wcx.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN);
RegisterClassEx(&wcx);
}
//////////////////////////////////////////////////////////////////////////////////////
BOOL MainWindow_OnCommand(HWND hWnd, WORD wCommand, WORD wNotify, HWND hControl)
{
switch (wCommand)
{
case ID_OPEN:
if (hBitmap != NULL)
DeleteObject(hBitmap);
GetBitmapFileName(szBitmapFilename,
sizeof(szBitmapFilename) / sizeof(TCHAR), hWnd);
hBitmap = LoadBitmapFile(szBitmapFilename);
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
break;
case ID_EXIT:
DestroyWindow(hWnd);
break;
}
return TRUE;
}