ホーム > カテゴリ > C/C++ >

グラデーションを施す(C/C++版)

グラデーションを施すサンプルです。

サンプルの実行画面

ソースコード

[Sample59.c]

//--------------------------------------------------------------------------------------
//  ■グラデーションを施す■ Sample NO.59
//
//--------------------------------------------------------------------------------------

#include <windows.h>
#include <math.h>

//メニューID
#define IDM_MENU 200
 #define IDM_MENU_SUB1 106
 #define IDM_MENU_SUB2 107
 #define IDM_MENU_SUB3 108
 #define IDM_MENU_SUB4 109
 #define IDM_MENU_SUB5 110
 #define IDM_MENU_SUB6 111

//TRGBColor構造体(グラデーションで使用)
 struct TRGBColor 
 { 
   BYTE Red;
   BYTE    Green;
   BYTE Blue;
 };

 int mainWidth,mainHeight;

//ウインドウを中央にする為に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))

//グラデーションで使用するプロシージャ
void GetRGBColor(DWORD Value,struct TRGBColor *FRGBColor);
void MakeGradation(HDC hDC,int Width,int Height,DWORD TopColor,DWORD BottomColor,BOOL Horizontal);
//いつものプロシージャ
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon);
int  WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

//------------------------------------------------------
//■関数 CreateMainWindow
//■用途 メインウインドウを作成する
//■引数
//  Width       ...ウインドウの横幅
//  Height      ...ウインドウの縦幅
//  Caption     ...タイトル名
//  hInstance   ...インスタンスハンドル
//  nCmdShow    ...ウインドウの表示形態
//  lpfnWndProc ...コールバックプロシージャ
//  dwstyle     ...ウインドウスタイル
//  dwExstyle   ...拡張ウインドウスタイル
//  MenuID      ...メニューのID
//  hIcon       ...アイコン
//■戻り値
//  ウインドウのハンドル
//------------------------------------------------------
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon)
{
    HWND hWnd;         //メインウインドウのハンドル
    WNDCLASS myClass;  //WNDCLASS構造体
    
    //WNDCLASS構造体を0で初期化
    ZeroMemory(&myClass,sizeof(WNDCLASS));
 
//--->WNDCLASS構造体の設定&ウインドウクラスの登録

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

    //ウィンドウ クラスdを登録
    RegisterClass(&myClass); 
    
//--->ウインドウの作成&表示
   
  //メインウインドウの生成
  hWnd = CreateWindowEx(
           dwExstyle,            //拡張ウインドウスタイル
           "TForm",              //登録されたクラス名のアドレス 
           Caption,              //ウインドウ名
           dwstyle,              //ウインドウスタイルを設定
           ScreenCenterX(Width), //X座標の位置設定
           ScreenCenterY(Height),//Y座標の位置設定
           Width,                //横幅を設定
           Height,               //縦幅を設定
           NULL,                 //親ウインドウを設定
           NULL,                 //メニューを設定
           hInstance,            //インスタンスを識別
           NULL);                //作成したウインドウに渡すデータへのポインタ
 
  //ウインドウの表示(表示方法はnCmdShowに従う)
  ShowWindow(hWnd, nCmdShow);
  return(hWnd);
}

//----------------------------------------------------------------------
//■関数名  GetRGBColor
//■用途    RGB値から赤・緑・青の輝度値を取り出す
//■引数
//          Value      ...カラー値(RGB値)
//          FRGBColor  ...TRGBColor構造体(戻り値)
//----------------------------------------------------------------------
void GetRGBColor(DWORD Value,struct TRGBColor *FRGBColor)
{
    FRGBColor->Red    = GetRValue(Value);
    FRGBColor->Green  = GetGValue(Value);
    FRGBColor->Blue   = GetBValue(Value);
}

//----------------------------------------------------------------------
//■関数名  MakeGradation(VC++版)
//■用途    指定されたデバイスコンテキストにグラデーションを施す
//■引数
//          hDC           ...デバイコンテキストのハンドル
//          Width,Height  ...描画領域
//          TopColor      ...最初に描画するカラー値
//          BottomColor   ...最後に描画するカラー値
//          Horizontal    ...true   水平にグラデーション
//                           false  垂直にグラデーション
//----------------------------------------------------------------------
void MakeGradation(HDC hDC,int Width,int Height,DWORD TopColor,DWORD BottomColor,BOOL Horizontal)
{
 int       i;
 struct TRGBColor FTopColor,FLastColor;
 double    R1,G1,B1,R2,G2,B2 ;
 HBRUSH    nBrush,OldBrush;

      //RGB値の取得
      GetRGBColor(TopColor, &FTopColor);
      GetRGBColor(BottomColor, &FLastColor);
      R1 =(double)((FTopColor.Red-FLastColor.Red)/255);
      G1 =(double)((FTopColor.Green-FLastColor.Green)/255);
      B1 =(double)((FTopColor.Blue-FLastColor.Blue)/255);
      R2 =FTopColor.Red;
      G2 =FTopColor.Green;
      B2 =FTopColor.Blue;

      for (i=0;i<255-1;i++)
      {
          nBrush   = CreateSolidBrush(RGB((int)floor(R2),(int)floor(G2),(int)floor(B2)));
          OldBrush = SelectObject(hDC, nBrush);

          if  (Horizontal)
           PatBlt(hDC,(int)floor(i*(Width / 255)),0,(int)floor(i*(Width/ 255)+(Width / 255)),Height,PATCOPY);
          else
           PatBlt(hDC,0,(int)floor(i*(Height / 255)),Width,(int)floor(i*(Height / 255)+(Height / 255)),PATCOPY);

          R2  =R2  - R1  ;
          G2  =G2  - G1  ;
          B2  =B2  - B1  ;
          SelectObject(hDC, OldBrush);
          DeleteObject(nBrush);
      }    
}

//--------------------------------------------------------
//■関数 WinMain
//■用途 メインの関数 
//■引数
// hInstance    ...現在のインスタンスのハンドル
// hPrevInstance...以前のインスタンスのハンドル
// pszCmdLine   ...コマンド ラインのアドレス
// nCmdShow     ...ウィンドウの表示状態
//--------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
   MSG msg;

  //メインウインドウを作成
  mainWidth=400;
  mainHeight=400;
  CreateMainWindow(mainWidth,mainHeight,"グラデーションを施す",hInstance,nCmdShow,(WNDPROC)WindowProc,
       WS_OVERLAPPEDWINDOW,WS_EX_CONTROLPARENT | WS_EX_WINDOWEDGE,MAKEINTRESOURCE(IDM_MENU),LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)));

  //送られてくるメッセージを翻訳してプロシージャに渡す  
  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    TranslateMessage(&msg); 
    DispatchMessage(&msg);   
  } 
 return (msg.wParam);
}
//------------------------------------------------------
// ■関数 WindowProc
// ■用途 メインウインドウに送られるメッセージを処理
// ■引数
//   hwnd    ...ウインドウのハンドル
//   uMsg    ...メッセージID
//   wParam  ...第1メッセージ パラメータ    
//   lParam  ...第2メッセージ パラメータ
//------------------------------------------------------
LRESULT CALLBACK  WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{  
    HDC hDC;
  switch (uMsg)
    {
  case WM_CREATE:
        return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
        break;
  case WM_COMMAND:
        switch (LOWORD(wParam)) 
        {
        case IDM_MENU_SUB1:  
                          hDC=GetDC(hwnd);
                          MakeGradation(hDC,mainWidth,mainHeight,RGB(0,0,0),RGB(255,0,0),TRUE);
                          ReleaseDC(hwnd,hDC);
                          break;
        case IDM_MENU_SUB2:
                          hDC=GetDC(hwnd);
                          MakeGradation(hDC,mainWidth,mainHeight,RGB(0,0,0),RGB(0,255,0),TRUE);
                          ReleaseDC(hwnd,hDC);
                          break;
        case IDM_MENU_SUB3:
                          hDC=GetDC(hwnd);
                          MakeGradation(hDC,mainWidth,mainHeight,RGB(0,0,0),RGB(0,0,255),TRUE);
                          ReleaseDC(hwnd,hDC);
                          break;
        case IDM_MENU_SUB4:  
                          hDC=GetDC(hwnd);
                          MakeGradation(hDC,mainWidth,mainHeight,RGB(0,0,0),RGB(255,0,0),FALSE);
                          ReleaseDC(hwnd,hDC);
                          break;
        case IDM_MENU_SUB5:
                          hDC=GetDC(hwnd);
                          MakeGradation(hDC,mainWidth,mainHeight,RGB(0,0,0),RGB(0,255,0),FALSE);
                          ReleaseDC(hwnd,hDC);
                          break;
        case IDM_MENU_SUB6:
                          hDC=GetDC(hwnd);
                          MakeGradation(hDC,mainWidth,mainHeight,RGB(0,0,0),RGB(0,0,255),FALSE);
                          ReleaseDC(hwnd,hDC);
                          break;
        }
        break;
   case WM_DESTROY:
             PostQuitMessage(0);
             break;
   default:return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
    }
  return (0);
}

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

capi_sample59.zip 3,222 バイト

動作環境

このサンプルは 「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:00515