2011年4月4日月曜日

指定ウィンドウのウィンドウサイズを変更


setClientSize.zip(6.68KB)
 ひまつぶしというか、Vectorで探すのが面倒だったのでさくっと。
EnumWindowsですべてのウィンドウのハンドルを取得。
SetWindowPosで指定したウィンドウのサイズを変更するプログラム。
サイズはクライアントサイズを指定するのでゲーム画面の大きさをがっちり設定したい場合に向いてる。
なんかしらのサンプル代わりにでもなれば幸い。
 

#include <windows.h>
#include <cstdio>
#include <tchar.h>
#include <vector>
 
struct Data
{
  TCHAR name[ 256 ];
  HWND hWnd;
};
 
typedef std::vector<Data> WindowList;
WindowList g_winList;
 
BOOL CALLBACK EnumWindowProc( HWND hWnd, LPARAM lParam )
{
  if ( hWnd )
  {
    Data data;
    data.hWnd = hWnd;
    if ( 1 < GetWindowText( hWnd, data.name, sizeof(data.name)/sizeof(*data.name) ) )
    {
      g_winList.push_back( data );
    }
  }

  return TRUE;
}
 
 
 
void setClientSize( HWND hWnd, LONG clientWidth, LONG clientHeight )
{
  // 計算するためにとりあえず一回設定
  SetWindowPos( hWnd, HWND_TOP, 0, 0, clientWidth, clientHeight, SWP_NOMOVE );
 
  // 設定サイズと実際のサイズの誤差から正しいサイズを計算
  RECT rect;
  GetClientRect( hWnd, &rect );
  const int frameWidth = clientWidth - rect.right;
  const int frameHeight = clientHeight - rect.bottom;
  const int winWidth = clientWidth + frameWidth;
  const int winHeight = clientHeight + frameHeight;
 
  // 設定
  SetWindowPos( hWnd, HWND_TOP, 0, 0, winWidth, winHeight, SWP_SHOWWINDOW | SWP_NOMOVE );
}
 
 
 
int main()
{
  for(;;)
  {
    g_winList.clear();
    EnumWindows( EnumWindowProc, 0 );
    
    // render list
    {
      size_t n = g_winList.size();
      for (size_t i=0; i<n; ++i)
      {
        _tprintf(TEXT("%d: %s\n"), i, g_winList[i].name);
      }
    }
 
    _tprintf(TEXT("param: [settingWindowNo][width][height]\n"));
    int no;
    std::scanf("%d", &no);
    if ( no < 0 && no >= g_winList.size() ) continue;
 
    int width;
    std::scanf("%d", &width);
    if ( width < 16 && width > 2048 ) continue;
 
    int height;
    std::scanf("%d", &height);
    if ( height < 16 && height > 2048 ) continue;
 
    setClientSize( g_winList[no].hWnd, width, height );
    _tprintf(TEXT("[%d]Set! [%d x %d]\n\n"), no, width, height);
  }
 
  return 0;
}

0 件のコメント: