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 件のコメント:
コメントを投稿