본문 바로가기
코스웨어/15년 스마트컨트롤러

20151120 김태현 WinAPI 7일차 비트맵 뷰어

by 알 수 없는 사용자 2015. 11. 23.
728x90
반응형

#include <windows.h>
#include "smart.h"

#define  XPOS  20
#define  YPOS  20
#define  SWIDTH  190
#define  SHEIGHT  25
#define YGAP  5
#define XGAP    10

LRESULT OnCreate(WPARAM wParam, LPARAM lParam);
LRESULT OnPaint(WPARAM wParam, LPARAM lParam);
LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);
void PrintBmpInfo(BITMAPFILEHEADER* stpFH, BITMAPINFOHEADER*stpIH);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

stMsgMap MsgMap[] = {
  { WM_PAINT, OnPaint },
  { WM_CREATE, OnCreate },
  { WM_DESTROY, OnDestroy },
  { WM_NULL, 0 },
};

unsigned char * ucpData;
HWND hWnd;
HINSTANCE g_hInst;
LPSTR lpszClass = "First";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
  , LPSTR lpszCmdParam, int nCmdShow)
{
  MSG Message;
  WNDCLASS WndClass;
  g_hInst = hInstance;

  WndClass.cbClsExtra = 0;
  WndClass.cbWndExtra = 0;
  WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  WndClass.hInstance = hInstance;
  WndClass.lpfnWndProc = (WNDPROC)WndProc;
  WndClass.lpszClassName = lpszClass;
  WndClass.lpszMenuName = NULL;
  WndClass.style = CS_HREDRAW | CS_VREDRAW;
  RegisterClass(&WndClass);

  hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, (HMENU)NULL, hInstance, NULL);
  ShowWindow(hWnd, nCmdShow);

  while (GetMessage(&Message, 000)) {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWpWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  stMsgMap * stpMap = MsgMap;
  hWnd = hWpWnd;
  //message map 기법을 통해서 switch case 문을 지우고 while문이 모든 함수를 처리한다.
  while (WM_NULL != (*stpMap).uiMsg)
  {
    if (iMessage == (*stpMap).uiMsg)
    {
      //내부적으로 처리하기 때문에 와일문이 돌면 안되기 때문에 return으로 처리한다.
      return (((*stpMap).fp)(wParam, lParam));
    }
    ++stpMap;
  }
  return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

LRESULT OnCreate(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  HANDLE hFile;
  BOOL bRet;
  BITMAPFILEHEADER stBFHead;
  BITMAPINFOHEADER stBfInfo;
  DWORD dwCount;

  hFile = CreateFile("1.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (INVALID_HANDLE_VALUE==hFile)
  {
    MessageBox(hWnd, "파일을 열수 없습니다.""알림", MB_OK);
    //파일 열때 실패하면 아무것도 안하고 종료해야하기 때문에 디스트로이를 안쓰고 바로 종료한다
    PostQuitMessage(0);
    return 0;
  }
  //읽어들인 데이터를 인자로 반환한다
  bRet = ReadFile(hFile, &stBFHead, sizeof(BITMAPFILEHEADER), &dwCount, NULL);
  if (FALSE ==bRet)
  {
    MessageBox(hWnd,"stBFHead구조체 ReadFile에 실패했습니다.""Error.", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(0);
    return 0;
  }
  bRet = ReadFile(hFile, &stBfInfo, sizeof(BITMAPINFOHEADER), &dwCount, NULL);
  if (FALSE == bRet)
  {
    MessageBox(hWnd, "stBfInfo구조체 ReadFile에 실패했습니다.""Error.", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(0);
    return 0;
  }

  PrintBmpInfo(&stBFHead, &stBfInfo);
  CloseHandle(hFile);
  return 0;
}

LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
{
  PAINTSTRUCT ps;

  BeginPaint(hWnd, &ps);
  EndPaint(hWnd, &ps);
  return 0;
}

LRESULT OnDestroy(WPARAM wParam, LPARAM lParam)
{
  PostQuitMessage(0);
  return 0;
}
void PrintBmpInfo(BITMAPFILEHEADER* stpFH, BITMAPINFOHEADER* stpIH)
{
  int iCntY;
  PCHAR ucTitle[15=
  {
    "Magic Number",
    "Size of File",
    "Data Position",
    "Size of BITMAPINFOHEADER",
    "Width of Image",
    "Height of Image",
    "Bit Plane number",
    "Bit Count",
    "Compression",
    "Size of Image",
    "Resolution of Width",
    "Resolution of Height",
    "Number of Used Color",
    "Index of Important Color"
  };

  for (iCntY = 0; iCntY < 14; ++iCntY)
  {
    CreateWindow(TEXT("static")
      , ucTitle[iCntY]
      , WS_CHILD | WS_VISIBLE
      , XPOS
      , YPOS*(iCntY + 1) + (YGAP*iCntY)
      , SWIDTH
      , SHEIGHT
      , hWnd
      , (HMENU)-1
      , g_hInst
      , NULL);

    CreateWindow(TEXT("edit")
      , TEXT("test")
      , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY
      , XPOS + SWIDTH + XGAP
      , YPOS*(iCntY + 1) + (YGAP*iCntY)
      , SWIDTH
      , SHEIGHT
      , hWnd
      , (HMENU)-1
      , g_hInst
      , NULL);
  }

  return;
}

큰 특이점 없고 create window를 사용해서 static과 edit사용법만 익히면 됨


실행화면



728x90