プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

ウインドウの最大サイズ変更

2007年09月29日 08時24分00秒 | ウインドウ関連

すべてのウインドウを最大サイズに変更するには可視ウインドウを検索して次のようにします。(戻る)

  1. 可視ウインドウか調べる(IsWindowVisible)
  2. オーナーのウインドウか調べる(GetWindow)
  3. キャプションが有るか調べる(空でない文字列)
  4. クラスが Progman 以外か調べる(lstrcmp)
  5. サイズ変更スタイルが有るか調べる(WS_THICKFRAME)
  6. (1)~(5)までの条件が一致したらリサイズの対象となります。

プロトタイプ宣言

BOOL IsWindowVisible(
    HWND            hWnd            // ウインドウのハンドル
);

HWND GetWindow(
    HWND            hWnd,           // ウインドウのハンドル
    UINT            uCmd            // ウインドウ関係の指定
);

BOOL EnumWindows(
    WNDENUMPROC     lpEnumFunc,     // コールバック関数
    LPARAM          lParam          // コールバック関数に渡す値
);

BOOL CALLBACK EnumWindowsProc(
    HWND            hwnd,           // 親ウインドウのハンドル
    LPARAM          lParam          // EnumWindows 関数から受け取る値
);

サンプル

#include <stdio.h>
#include <windows.h>

// オーナー・ウインドウの判別
#define IsWindowOwner(h)    (GetWindow(h,GW_OWNER) == NULL)
#define IsWindowDialog(s)   (lstrcmp(s,TEXT("#32770")) == 0)

// ワークエリア領域の取得
#define GetMonitorRect(rc)   SystemParametersInfo(SPI_GETWORKAREA,0,rc,0)

// ウインドウ状態の表示
VOID DispStatus( HWND hWnd, LPCTSTR lpTitle, LPCTSTR lpClass, LONG lStyle )
{
    printf( TEXT("%c %c %c %c %c %c %c %c %c %c [%-50s] [%s]\n"),
        IsWindowOwner(hWnd)         ? TEXT('O') : TEXT('_'),    // Ownerウインドウ
        IsWindowUnicode(hWnd)       ? TEXT('U') : TEXT('_'),    // Unicodeタイプ
        IsWindowVisible(hWnd)       ? TEXT('V') : TEXT('_'),    // 可視状態
        IsWindowEnabled(hWnd)       ? TEXT('E') : TEXT('_'),    // 有効状態
        IsIconic(hWnd)              ? TEXT('I') : TEXT('_'),    // 最小化状態
        IsZoomed(hWnd)              ? TEXT('Z') : TEXT('_'),    // 最大化状態
        IsWindow(hWnd)              ? TEXT('W') : TEXT('_'),    // ウインドウ有無
        (lStyle & WS_MINIMIZEBOX)   ? TEXT('i') : TEXT('_'),    // 最小化スタイル
        (lStyle & WS_MAXIMIZEBOX)   ? TEXT('z') : TEXT('_'),    // 最大化スタイル
        (lStyle & WS_THICKFRAME)    ? TEXT('f') : TEXT('_'),    // サイズ変更スタイル
        lpClass,                                                // クラス文字列
        lpTitle );                                              // キャプション
}

// EnumWindowsのコールバック関数
BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam )
{
    TCHAR   szTitle[ 1024 ];
    TCHAR   szClass[ 1024 ];
    INT*    nParam = (INT *)lParam;
    LONG    lStyle;
    
    GetWindowText( hWnd, szTitle, sizeof(szTitle) );    // キャプションの取得
    GetClassName(  hWnd, szClass, sizeof(szClass) );    // クラス文字列の取得
    lStyle = GetWindowLong( hWnd, GWL_STYLE );          // ウインドウスタイル
    // ウインドウのリサイズ条件
    if ( IsWindowVisible(hWnd) ){
        if ( IsWindowOwner(hWnd) || IsWindowDialog(szClass) ){
            if ( szTitle[0] != TEXT('\0') ){
                if ( lstrcmp(szClass,TEXT("Progman")) != 0 ){
                    if ( lStyle & WS_THICKFRAME ){
                        // 列挙番号
                        nParam[ 0 ] += 1;
                        printf( TEXT("%4d: "), nParam[0] );
                        DispStatus( hWnd, szTitle, szClass, lStyle );
                        // ウインドウのリサイズ
                        SetWindowPos( hWnd, NULL,
                            nParam[1], nParam[2],
                            nParam[3], nParam[4],
                            (SWP_SHOWWINDOW|SWP_NOZORDER) );
                    }
                }
            }
        }
    }
    return TRUE;
}

// メイン関数
int main( void )
{
    INT     nParam[ 5 ];
    RECT    rc;
    
    // タスクバー以外の長方形
    GetMonitorRect( &rc );
    nParam[ 0 ] = 0;                        // カウント値
    nParam[ 1 ] = rc.left;                  // X座標
    nParam[ 2 ] = rc.top;                   // Y座標
    nParam[ 3 ] = rc.right - rc.left;       // 横サイズ
    nParam[ 4 ] = rc.bottom - rc.top;       // 縦サイズ
    // ウインドウの最大サイズ変更
    EnumWindows( EnumWindowsProc, (LPARAM)nParam );
    // サイズ変更した数の表示
    printf( TEXT("\n全部で %d 個のウインドウを最大サイズにリサイズしました。\n"), nParam[0] );
    return 0;
}
  • オーナー・ウインドウがサイズ変更スタイルを持っていなくても子ウインドウがサイズ変更スタイルを持つタイプは上記のサンプルではリサイズできません。
  • このようなウインドウもリサイズするには EnumChildWindows 関数などで子ウインドウのサイズ変更スタイルも探索する必要があります。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 最大化ウインドウの復元 | トップ | マウス・キャプチャの取得/... »
最新の画像もっと見る

コメントを投稿

ウインドウ関連」カテゴリの最新記事