クライアント領域のサイズ

GetWindowRect とか自分で書いて思い出したので書いておこう。
Windows の SDK を含む GUI ツールキットと Linux での GTK+ のサイズについて。
とりあえず全部 300×300 サイズなウインドウを作ってみる

SDK

hWnd = CreateWindow(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    300, // Width
    300, // Height
    NULL,
    NULL,
    hInstance,
    NULL);

WindowsForm

WPF

<Window x:Class="_wpf.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        
    </Grid>
</Window>

PyGtk (Linux)

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk

class Template(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.connect("delete-event", gtk.main_quit)
        self.resize(300, 300)
        self.show_all()

if __name__ == "__main__":
    w = Template()
    gtk.main()

MFC や Qt は知らない、MFC は SDK と結果は同じになるはずだが。
とにかく結果、Windows の画像は VirtualBox ose 上である。

GTK+ はクライアント領域のサイズ、Windows は全部が全体サイズです。
いやいや、Windows は WPF になってもまだデフォルトは外枠を含んだサイズなんですね。
よく見るとメニューさえクライアント領域に食い込んで含まれてしまうのが解る。

Windows でクライアント領域のサイズを指定するには

SDK の場合
AdjustWindowRectEx 関数を使うか GetClientRect との差を自力計算する。

WindowsForm の場合

this.ClientSize = new Size(300, 300);

WPF の場合
SizeToContent を WidthAndHeight に指定し 300×300 のコンテンツを入れる。

何故クライアント領域のサイズがどうだというと。
メニューやツールバー、ステータスバーなんかも当然クライアント領域内に食い込む。
画像ビューアや動画プレイヤーを作る場合は当然実寸で表示したくなるよね。
そうするとメニューやステータスバーのサイズまで計算し加算しなくてはいけないハメに…
ちなみに私の作った Cinema はそうやっている、ステータスバーは面倒で付けなかった。

コンテンツのサイズでクライアント領域サイズを決めたほうがイイに決まっている。
本当に GTK+ や WPF のレイアウタって神ですよ。

SDK はしかたがないとして WindowsForm はどうなんだ?ですよね。
WPF は古い考え方をブチ壊したのだから最初からクライアントサイズにすればいいのに。