2017-03-20 5 views
-1
void Initialize_Window(void) 
{ 
    RECT rConsole; 
    GetWindowRect(GetConsoleWindow(), &rConsole); 
    SetWindowPos(GetConsoleWindow(), NULL, 0, 0, 800, 700, 0); 
    SetWindowLong(GetConsoleWindow(), GWL_STYLE, GetWindowLong(GetConsoleWindow(), GWL_STYLE) & ~(WS_SIZEBOX | WS_MAXIMIZEBOX)); 
    SetWindowPos(GetConsoleWindow(), NULL, (GetSystemMetrics(SM_CXSCREEN) - rConsole.right - rConsole.left)/2, (GetSystemMetrics(SM_CYSCREEN) - rConsole.bottom - rConsole.top)/2, 0, 0, SWP_NOSIZE); 
} 

上記のコードを使用してコンソールウィンドウを中央に配置しようとしていますが、ウィンドウが画面のランダムな位置に移動したようですどのようにそれを修正するには、任意のアイデアプログラムを実行する?コンソールウィンドウを次のコードでセンタリングできない

答えて

1

センターを取得するには(GetSystemMetrics(SM_CXSCREEN) - (rConsole.right - rConsole.left))/2が必要です。


サイドノート:あなたは1 SetWindowPosの代わりに2を使用することができます(とウィンドウRectを取得する必要はありません)

const int width = 800; 
const int height = 700; 
//SetWindowLong()... 
SetWindowPos(GetConsoleWindow(), NULL, 
    GetSystemMetrics(SM_CXSCREEN)/2 - width/2, 
    GetSystemMetrics(SM_CYSCREEN)/2 - height/2, 
    width, height, SWP_SHOWWINDOW); 
+0

もう動いていませんが、まだ中心になっていません –

+1

@BaronZhu *中心にない*についてもっと教えてください。今どこですか? –

+0

それは垂直に中心が置かれていますが、水平ではなく、中心から低い位置にあります。 –

1

それが唯一のメトリックを返すため、このためGetSystemMetrics()を使用しないでください。 プライマリモニタ。マルチモニタの設定は最近普及しているので、無視すればユーザーは正しく動揺します。また

、ウィンドウは、通常、物理モニター表面に、しかしタスクバー(単数または複数)を除外ワークエリアに位置合わせされるべきではありません。はい、画面の両側に複数のタスクバー(Windows Slangでは "appbars"と呼ばれます)が存在する可能性があります。実際に完全な物理的表面を使用する例外はfull screen windowsです。

両方の側面をカバーするには、MonitorFromWindow()GetMonitorInfo()を使用できます。

まず、ウィンドウハンドルから「最も近い」モニタを取得します。これは、どちらかのウィンドウ完全に示したモニターであるか、それはそれで、ウィンドウの最大の面積があります。そして、

HWND hConsoleWnd = ::GetConsoleWindow(); 
HMONITOR hMonitor = ::MonitorFromWindow(hConsoleWnd, MONITOR_DEFAULTTONEAREST); 

は、我々はそのモニタの作業領域の四角形を取得し、それにウィンドウの相対的なセンター:

if(hMonitor) 
{ 
    MONITORINFO info{ sizeof(info) }; // set cbSize member and fill the rest with zero 
    if(::GetMonitorInfo(hMonitor, &info)) 
    { 
     int width = 800; 
     int height = 700; 
     int x = (info.rcWork.left + info.rcWork.right)/2 - width/2; 
     int y = (info.rcWork.top + info.rcWork.bottom)/2 - height/2; 

     ::SetWindowPos(hConsoleWnd, nullptr, x, y, width, height, 
         SWP_NOZORDER | SWP_NOOWNERZORDER); 
    } 
} 

これだけです。実際のアプリケーションでは、ウィンドウのサイズをハードコードする必要はありません。なぜなら、これはユーザーの好みなのでです。最初の起動時には、デフォルトのサイズは妥当かもしれませんが、WindowsのDPI設定に従ってハードコーディングされずにスケーリングされるべきです。

関連する問題