Win32API ウィンドウを移動させる MoveWindow

MoveWindow関数で、ウィンドウの位置や大きさを設定することができる。


MoveWindow関数のプロトタイプ

BOOL MoveWindow(
  HWND hWnd,      // ウィンドウのハンドル
  int X,          // 横方向の位置
  int Y,          // 縦方向の位置
  int nWidth,     // 幅
  int nHeight,    // 高さ
  BOOL bRepaint   // 再描画オプション
);




MoveWindow関数を使用した簡単なサンプルプログラム

ノートパッドを起動し、ノートパッドのウィンドウを移動させる

#include <windows.h>
#include <stdlib.h>

BOOL CALLBACK WndEnumProc(HWND hWnd, LPARAM)
{
    char szClassName[256];
    ::GetClassNameA(hWnd, szClassName, _countof(szClassName));

    if (::lstrcmpiA(szClassName, "NOTEPAD") == 0) {
        MoveWindow(hWnd, 0, 0, 300, 300, TRUE);
        Sleep(1000);
        MoveWindow(hWnd, 300, 300, 300, 300, TRUE);
        Sleep(1000);
        MoveWindow(hWnd, 500, 500, 300, 300, TRUE);
    }
    return TRUE;
}

int main()
{
    WinExec("notepad", SW_SHOW);
    ::EnumWindows(WndEnumProc, 0); 
    return 0;
}





もう少し発展させて、ノートパッドがデスクトップ上を円を描いて回るようにする

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

#define PI 3.14
#define NUMBER_OF_ROTATE 3

double DegreeToRadian(double deg)
{
    return deg * (PI / 180.0);
}

void TurnWindow(HWND hWnd)
{
    int nWidth = GetSystemMetrics(SM_CXSCREEN);
    int nHeight = GetSystemMetrics(SM_CYSCREEN);
    double r = nHeight/4;
    
    for (int i = 0; i < 360*NUMBER_OF_ROTATE; i+=1) {
        
        double radian = DegreeToRadian(i);
        double x = r * cos(radian) + nWidth/2;
        double y = r * sin(radian) + nHeight/2;

        SetForegroundWindow(hWnd);
        MoveWindow(hWnd, (int)x, (int)y, 300, 300, TRUE);
        Sleep(5);
    }
}


BOOL CALLBACK WndEnumProc(HWND hWnd, LPARAM)
{
    char szClassName[256];
    ::GetClassNameA(hWnd, szClassName, _countof(szClassName));

    if (::lstrcmpiA(szClassName, "NOTEPAD") == 0) {
        TurnWindow(hWnd);
    }
    return TRUE;
}

int main()
{
    WinExec("notepad", SW_SHOW);
    ::EnumWindows(WndEnumProc, 0); 
    return 0;
}




参考
http://msdn.microsoft.com/ja-jp/library/cc410924.aspx