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

メインウインドウを透明にする(C/C++版)

メインウインドウを透明にするサンプルです。

サンプルの実行画面

ソースコード

[Sample6.c]

//--------------------------------------------------------------------------------------
//  ■メインウインドウを透明にする■ Sample NO.6
//
//--------------------------------------------------------------------------------------

#include <windows.h>

// BCC用設定
#ifdef STRICT
  WNDPROC ButtonAdress;
#else
  FARPROC ButtonAdress;
#endif

HWND    hButton;      // ボタンウインドウのハンドル 
HWND    hMain;        // メインウインドウのハンドル 

//ボタンID
#define ID_BUTTON 101

//コールバックプロシージャ
LRESULT CALLBACK  WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK  ButtonProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

//------------------------------------------------------
//■関数 ScreenCenterX(ローカル)
//■用途 ウインドウを中央にする為にX座標(LEFT)を算出する
//■引数
//        Width     ...ウインドウの横幅
//------------------------------------------------------
int ScreenCenterX(int Width){ 
 int X = (GetSystemMetrics(SM_CXSCREEN)- Width) / 2;
 if (X<0) X=0;
 return(X);
}
//------------------------------------------------------
//■関数 ScreenCenterY(ローカル)
//■用途 ウインドウを中央にする為にY座標(TOP)を算出する
//■引数
//        Height     ...ウインドウの縦幅
//------------------------------------------------------
int ScreenCenterY(int Height){ 
 int Y= (GetSystemMetrics(SM_CYSCREEN)- Height) / 2;
 if (Y<0) Y=0;
 return(Y);
}
//------------------------------------------------------
//■関数 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;                     // メニューの設定
        
    // ウィンドウ クラスを登録
    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);
}
//------------------------------------------------------
//■関数名  ControlCreate
//■用途    ウインドウ(コントロール)を作成
//■引数
//       hwndParent ...親ウインドウのハンドル
//       Left       ...作成するウインドウの左隅のX座標
//       Top        ...作成するウインドウの左隅のY座標
//       Width      ...作成するウインドウの横幅
//       Height     ...作成するウインドウの縦幅
//       dwExStyle  ...ウインドウの拡張フラグ
//       dwFlag     ...ウインドウの作成フラグ
//       Caption    ...作成するウインドウのキャプション
//       ClassName  ...作成するウインドウクラス名
//       ChildID    ...子ウインドウの識別子
//       hInstance  ...インスタンスハンドル 
//■戻り値
//  子ウインドウのハンドル
//------------------------------------------------------
HWND CreateControlWindow(HWND hwndParent, int Left, int Top,int Width, int Height,int dwExStyle ,
                           int dwFlag ,LPCTSTR Caption, LPCTSTR ClassName,HMENU ChildID,HINSTANCE hInstance){ 
 return CreateWindowEx(dwExStyle,ClassName,Caption,WS_CHILD | WS_VISIBLE | dwFlag    ,
                         Left, Top, Width, Height, hwndParent, ChildID, hInstance, NULL);
}

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

  // メインウインドウを作成
  // ウインドウのスタイルをWS_POPUPにして拡張ウインドウスタイルをWS_EX_TOOLWINDOWにしているのに注意)     
  // WS_EX_TOOLWINDOW タスクバーにアイコンを表示しない
  // WS_POPUP         タイトルバーを持たない 
  hMain=CreateMainWindow(200,30,"メインウインドウを透明にする",hInstance,nCmdShow,
                          (WNDPROC)WindowProc,WS_POPUP,WS_EX_TOOLWINDOW,NULL,
                            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){   
    HRGN hRGN;   //リージョンのハンドルは破棄しなくていいらしい?
    switch (uMsg){
      case WM_CREATE:
           // ボタン作成
           hButton= CreateControlWindow(hwnd,0,0,200,30,0,BS_PUSHBUTTON,"Button1",
                    "BUTTON",(HMENU)ID_BUTTON,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE));
           // リージョン作成
           hRGN=CreateRectRgn(0,0,200,30);
           // メインウインドウに新しい領域を設定する
           SetWindowRgn(hwnd,hRGN,TRUE) ;
           // ボタンウインドウのサブクラス化
#ifdef STRICT
            ButtonAdress = (WNDPROC)GetWindowLong(hButton, GWL_WNDPROC);
#else
            ButtonAdress = (FARPROC)GetWindowLong(hButton, GWL_WNDPROC);
#endif
           
            SetWindowLong(hButton, GWL_WNDPROC, (LONG)ButtonProc);
           break;
      case WM_DESTROY:
                  SetWindowLong(hButton, GWL_WNDPROC, (LONG)ButtonAdress);
                  PostQuitMessage(0);
                  break;
      // その他のメッセージはWindowsに任せる
      default:return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
    }
    return (0);
}
//------------------------------------------------------
// ■関数 ButtonProc
// ■用途 ボタンウインドウに送られるメッセージを処理  
// ■引数
//        hwnd    ...ウインドウのハンドル
//        uMsg    ...メッセージID
//        wParam  ...第1メッセージ パラメータ    
//        lParam  ...第2メッセージ パラメータ
//------------------------------------------------------
LRESULT CALLBACK ButtonProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
    switch (uMsg)    {
        // ウインドウを移動  
        case WM_LBUTTONDOWN:
                        ReleaseCapture();
                        // メインウインドウをドラッグせよという命令を送る
                        SendMessage(hMain, WM_NCLBUTTONDOWN, HTCAPTION,0);
                        break;
        // 終了 
        case WM_RBUTTONUP: SendMessage(hMain,WM_SYSCOMMAND,SC_CLOSE,0);    break;
   
        // その他のメッセージはWindowsに任せる
        default: 
             return (CallWindowProc(ButtonAdress, hwnd, uMsg, wParam, lParam));
    }
    return (0);
}


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

capi_sample6.zip 2,958 バイト

動作環境

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