TOP > カテゴリ > C/C++ >

グラフィックエフェクト- モノクロ(C/C++版)

グラフィックエフェクト- モノクロのサンプルです。

サンプルの実行画面

ソースコード

[Sample93.c]

//--------------------------------------------------------------------------------------
//  ■グラフィックエフェクト- モノクロ -■ Sample NO.93
//
//--------------------------------------------------------------------------------------

#include <windows.h>

#define IDM_MENU  101
#define IDM_ON    102
#define IDM_NONE  103
#define IDM_END   104

//ウインドウを中央にする為にX座標(LEFT)とY座標(TOP)算出するマクロ
#define ScreenCenterX(Width) ((0)<((int)((GetSystemMetrics(SM_CXSCREEN)- Width) / 2)) ? ((int)((GetSystemMetrics(SM_CXSCREEN)- Width) / 2)) :(0))
#define ScreenCenterY(Height) ((0)<((int)((GetSystemMetrics(SM_CYSCREEN)- Height) / 2)) ? ((int)((GetSystemMetrics(SM_CYSCREEN)- Height) / 2)) :(0))

LRESULT CALLBACK  WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int  WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow);
void Mono(HWND hwnd,BYTE Value);

HBITMAP hBitmap=NULL;  //ビットマップのハンドル
HBITMAP hTempBMP=NULL; //テンポラリビットマップのハンドル
HDC     hTempMem=NULL; //テンポラリメモリデバイスコンテキスト
BOOL    OK;            //フラグ    
 
/////////////////////////////////////////////////////////////////////////////
//
//  Mono  
//         VBレベルの手法なので遅いです(^^;  
//         高速に処理したい人はGetDIBits()APIなどを使いましょう。
//         
//         Value ...明るさの度合い(0-255)   
void Mono(HWND hwnd,BYTE Value)
{
  BITMAP  BMPINFO;   
  HDC     hMem,hDC; 
  int     X,Y;
  BYTE    R,G,B;
  DWORD   RGBColor;
  
  hDC=GetDC(hwnd);
  GetObject(hBitmap, sizeof(BITMAP), &BMPINFO);
  //メモリビットマップ作成
  hMem    = CreateCompatibleDC(hDC);
  SelectObject(hMem, hBitmap);
  //テンポラリメモリビットマップ作成
  hTempMem = CreateCompatibleDC(hDC);
  hTempBMP = CreateCompatibleBitmap(hDC, BMPINFO.bmWidth, BMPINFO.bmHeight);
  SelectObject(hTempMem, hTempBMP);
 
  for (Y=0;Y<BMPINFO.bmHeight;Y++)
  {
   for (X=0;X<BMPINFO.bmWidth;X++)
   {   
       RGBColor=GetPixel(hMem, X, Y);
       R=GetRValue(RGBColor);
       G=GetGValue(RGBColor);
       B=GetBValue(RGBColor);
    
       if  ((R <=Value) & (G <=Value) & (B <=Value)) 
         SetPixelV(hTempMem, X, Y,RGB(0,0,0));
       else
         SetPixelV(hTempMem, X, Y,RGB(255,255,255));       
   }  
  }
  DeleteDC(hMem);    
  ReleaseDC(hwnd,hDC);
}

/////////////////////////////////////////////////////////////////////////////
//
//  WinMain 
//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
   MSG      msg;
   HWND     hWnd;         
   WNDCLASS myClass;  

    ZeroMemory(&myClass,sizeof(WNDCLASS));

    myClass.style         =CS_HREDRAW | CS_VREDRAW;    //ウインドウスタイルを設定 
    myClass.lpfnWndProc   =(WNDPROC)WindowProc;        //コールバックプロシージャへのポインタ
    myClass.hInstance     =hInstance;                  //インスタンスハンドルを設定
    myClass.hCursor       =LoadCursor(NULL, IDC_ARROW);//カーソルの設定(Windows標準リソースを使用)  
    myClass.hbrBackground =(HBRUSH)COLOR_WINDOW;       //ウインドウの背景を設定(デフォルトカラー)
    myClass.lpszClassName ="Programming Library";      //クラス名の設定  
    myClass.hIcon         =NULL;                       //アイコンの指定
    myClass.lpszMenuName  =MAKEINTRESOURCE(IDM_MENU);  //メニューの設定

    //ウィンドウ クラスを登録
    RegisterClass(&myClass); 

    //メインウインドウの生成
    hWnd=CreateWindowEx(
           WS_EX_CONTROLPARENT | WS_EX_WINDOWEDGE, //拡張ウインドウスタイル
           "Programming Library",                  //登録されたクラス名のアドレス 
           "グラフィックエフェクト- モノクロ -",     //ウインドウ名
           WS_OVERLAPPEDWINDOW,                    //ウインドウスタイルを設定
           ScreenCenterX(300),                     //X座標の位置設定
           ScreenCenterY(300),                     //Y座標の位置設定
           300,                                    //横幅を設定
           300,                                    //縦幅を設定
           NULL,                                   //親ウインドウを設定
           NULL,                                   //メニューを設定
           hInstance,                              //インスタンスを識別
           NULL);                                  //作成したウインドウに渡すデータへのポインタ
 
  //ウインドウの表示(表示方法はnCmdShowに従う)
  ShowWindow(hWnd, nCmdShow);

  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    TranslateMessage(&msg); 
    DispatchMessage(&msg);   
  } 
 return (msg.wParam);
}

/////////////////////////////////////////////////////////////////////////////
//
//  WindowProc 
//
LRESULT CALLBACK  WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{  
  switch (uMsg)
    {
  case WM_CREATE:
         //ビットマップのロード
         hBitmap =(HBITMAP)LoadImage((HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),"Sample93.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
         if (hBitmap==NULL)
         {
          MessageBox(hwnd,"Sample93.bmpがありません。","エラー",MB_OK);
          PostQuitMessage(0);
         }
         else
         {
          //先にモノクロ画像を作成 
          Mono(hwnd,152);         
         }
         break;
  case WM_PAINT:
        { 
          BITMAP      BMPINFO;    //BITMAP構造体
          HDC         hMem,hDC;   //メモリデバイスコンテキストのハンドル
                  
                  if (OK)
                  {
                   //モノクロ画像表示
                   hDC=GetDC(hwnd);
                   GetObject(hBitmap, sizeof(BITMAP), &BMPINFO);
                   BitBlt(hDC,0,0, BMPINFO.bmWidth,BMPINFO.bmHeight, hTempMem, 0, 0, SRCCOPY);
                   ReleaseDC(hwnd,hDC);
                  }
                  else
                  {  
                   //ノーマル画像表示
                   hDC=GetDC(hwnd);
                   GetObject(hBitmap, sizeof(BITMAP), &BMPINFO);
                   hMem = CreateCompatibleDC(hDC);
                   SelectObject(hMem, hBitmap);
                   BitBlt(hDC,0,0, BMPINFO.bmWidth,BMPINFO.bmHeight, hMem, 0, 0, SRCCOPY);
                   DeleteDC(hMem);    
                   ReleaseDC(hwnd,hDC);
                   }                  
                  return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
                  break;
        }
   case WM_COMMAND:
             switch(LOWORD(wParam))
             {
               case IDM_ON : 
                   CheckMenuItem(GetMenu(hwnd),IDM_ON,MF_BYCOMMAND |MF_CHECKED);
                   CheckMenuItem(GetMenu(hwnd),IDM_NONE,MF_BYCOMMAND |MF_UNCHECKED);
                   OK=TRUE;
                   SendMessage(hwnd,WM_PAINT,0,0);
                   break;
               case IDM_NONE:
                   CheckMenuItem(GetMenu(hwnd),IDM_ON,MF_BYCOMMAND |MF_UNCHECKED);
                   CheckMenuItem(GetMenu(hwnd),IDM_NONE,MF_BYCOMMAND |MF_CHECKED);
                   OK=FALSE;
                   SendMessage(hwnd,WM_PAINT,0,0);
                   break;
               case IDM_END:  
                   DeleteObject(hBitmap);
                   DeleteObject(hTempBMP);
                   DeleteObject(hTempMem);
                   PostQuitMessage(0);
                   break;
               default :return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
             }
             break;      
   case WM_DESTROY:
             DeleteObject(hBitmap);
             DeleteObject(hTempBMP);
             DeleteObject(hTempMem);             
             PostQuitMessage(0);
             break;
   default:return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
    }
  return (0);
}

ソースコード一式のダウンロード

capi_sample93.zip 37,166 バイト

動作環境

このサンプルは 「Windows98」及び「Microsoft Visual C++5.0」「Borland C++ Compiler 5.5」で確認しております。環境が異なる場合は正常に動作しない場合もございますのでご了承下さい。

Visual C++5.0でのコンパイル

VC5.0でサンプルをコンパイルする場合は新規プロジェクト(Win32Application)を作成後、各ファイルを追加してビルドしてください。

Borland C++ Compiler 5.5でのコンパイル

BCC5.5でサンプルをコンパイルする場合は「bcc32.exe」で*.c又は*.cppファイルをコンパイルします。リソースがある場合は「brc32.exe」で*resファイルを付与してください。

サンプルについて

このWindows APIサンプル集(C/C++版)は2000年頃にC/C++言語の学習の為に作成したものです。コードはエレガントではなく「初心者レベルのコーディング」です。仕事などの業務で利用する際にはエラー処理やメモリ解放などの再確認を必ずして下さい。





関連記事



公開日:2015年03月19日
記事NO:00549