l MFC ウィンドウスのタイル '98. .
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
目次のページ MFC 3 書式・図形 6 ウィンドウ 9 保存・ファイル   検索  
1 文字列の表示 4 Bitmap画像 7 View・CTRL 10 予約(未定)  その他
2 クリックしたら表示 5 リソース 8 コレクション  乱数・タイマ  未使用
  ウィンドウ   更新領域   スタイル   別々の子ウィンドウ  
  分割ウィンドウ   別々のビュー   分割のネスト   合体 
オブジェクトと表示データ  CREATESTRUCT構造体  style  拡張スタイル  スタイルの変更 

T ウィンドウスのタイル
ウィンドウの スタイルなどのデータは、CREATESTRUCT 構造体に格納されます。

T オブジェクトと表示データ
ウィンドウのオブジェクトは、 そのウィンドウで使うデータと、メンバ関数の集まりです。
CEdit ED; // エディットボックスのオブジェクトを宣言します。
リソースエディタを使って、ダイアログボックスにエディットボックスなどのコントロールを配置し、ClassWizard でダイアログクラスを作ると、コントロールのオブジェクトは勝手に宣言されます。
AppWizard を使ってMFCプロジェクトを作ると、主ウィンドウやビューなどのオブジェクトは勝手に宣言されます。
オブジェクトを宣言すると、メンバ関数を呼び出して使うことができるようになります。

ウィンドウの表示データ ( ウィンドウの絵 のデータ )は、 メンバ関数 Create( ) によって作られます。
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); // CEdit
CRect RE(20,10, 320,210); // 作成するエディットボックスの、座標を用意します。
ED.Create(WS_VISIBLE|ES_MULTILINE|ES_WANTRETURN,RE,this,IDC_EDIT1); // 初期化します。
// 表示される、複数行の、改行できる、RE の大きさの、this を親とする、
// IDC_EDIT1 を使うエディットボックス。
// ※ 文字列リソースを作るなど、ID ( この例では IDC_EDIT1 ) を用意してあること。

リソースエディタを使って配置したコントロールは、勝手に初期化されます。
AppWizard を使って作成した主ウィンドウなどは、勝手に初期化されます。


T どのようなウィンドウを作るか
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); // CEdit
Create( ) によってウィンドウの表示データを作成するときには、
ツールバーを付けるかどうかなど、ウィンドウのスタイルを引数で指定します。
Create( ) の引数 dwStyle に指定した内容は、CREATESTRUCT 構造体に格納されます。
Create( ) の引数に、ウィンドウスタイルのデフォルト値が設定されているクラス
CFrameWnd : dwStyle = WS_OVERLAPPEDWINDOW . . . デフォルト値が設定されています。
CMDIFrameWnd :    〃
CMDIChildWnd  : dwStyle = WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW
CMiniFrameWnd など : デフォルト値は設定されていません。
※ MFCを使っている場合には、特別な場合を除いて 自分で Create( ) を書く必要はありません。


T CREATESTRUCT 構造体のメンバ
LPVOID
HANDLE
HMENU
HWND
int
int
int
int
LONG
LPCSTR
LPCSTR
DWORD
lpCreateParams
hInstance
hMenu
hwndParent
cy
cx
y
x
style
lpszName
lpszClass
dwExStyle
??
??
メニューのハンドル。子ウィンドウのときはID
親ウィンドウのハンドル
ウィンドウの縦幅
ウィンドウの横幅
ウィンドウ左辺の X 座標
ウィンドウ上辺の Y 座標
ウィンドウのスタイル ( 下記参照 )
ウィンドウ名へのポインタ
?? WNDCLASS 構造体名へのポインタ
拡張スタイル ( style 以外の指定。WS_EX_ABSPOSITION など。)

T style に指定できる値
メモ :  最大化ボタンを無効にするなど、設定済みの指定を取り除くのは自由です。
しかし、ハンドラなどを用意しないでスクロールバーを設けるなど、
スタイルだけを勝手に変更すると、パソコンが停止するなど重大な誤動作を発生します。
0x00800000L WS_BORDER   境界を持つウィンドウにします。
0x40000000L WS_CHILD   子ウィンドウにします。( WS_POPUP と一緒には使えません。)
0x02000000L WS_CLIPCHILDREN   子ウィンドウが占める領域を除いて ( 枠だけ ) 描画します。
      親ウィンドウのみ。( 親ウィンドウの内部の描画方法の指定。)
0x04000000L WS_CLIPSIBLINGS   ??兄弟ウィンドウをクリップ。( WS_CHILD と共に指定。)
0x08000000L WS_DISABLED   初期状態で使用禁止のウィンドウ。
     ( クリックできないボタンや、入力できないエディットボックス など。)
0x00400000L WS_DLGFRAME   二重境界を持ち、タイトルを持たないウィンドウ。
0x00020000L WS_GROUP   グループウィンドウ。
     ( ダイアログ上のコントロールなど、方向キーで順番に選択できるウィンドウ。)
0x00100000L WS_HSCROLL   水平スクロール バーを設けます。
0x01000000L WS_MAXIMIZE   最初から最大表示されるウィンドウにします。
0x00010000L WS_MAXIMIZEBOX   最大表示ボタンを設けます。
0x20000000L WS_MINIMIZE   最初は最小表示 ( アイコン化 ) 。( WS_OVERLAPPED と共に指定。)
0x00020000L WS_MINIMIZEBOX   アイコン化ボタンを設けます。
0x00000000L WS_OVERLAPPED   オーバラップウィンドウ。 ( 普通は、WS_CAPTION と共に指定。)
0x80000000L WS_POPUP   ポップアップウィンドウ。( WS_CHILD と一緒の指定は不可。)
0x00080000L WS_SYSMENU   タイトル バーに、メニューボックスを設けます。
      タイトル バーを持つウィンドウのみ。( 最小化・最大化・ズーム・閉じる ボタン )
0x00010000L WS_TABSTOP   TAB キーで移動できるウィンドウ。
     ( ダイアログ上のコントロールなど、Tab キーで順番に選択できるウィンドウ。)
0x00040000L WS_THICKFRAME   サイズ変更が可能なウィンドウ。
0x10000000L WS_VISIBLE   表示されるウィンドウ ( 初期状態で可視。)
0x00200000L WS_VSCROLL   垂直スクロール バーを設けます。

0x40000000L WS_CHILDWINDOW = WS_CHILD
0x00C00000L WS_CAPTION = WS_BORDER | WS_DLGFRAME
   タイトル バーを持つウィンドウを作成します。
  ? WS_DLGFRAME スタイルと一緒に使うことはできません。
0x00CF0000L WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
                | WS_THICKFRAME | WS_MINIMIZEBOX| WS_MAXIMIZEBOX

0x80880000L WS_POPUPWINDOW = WS_POPUP | WS_BORDER |  WS_SYSMENU

他に、例えばエディットボックスでは、更にエディットスタイルも組み合せて使います。


T 拡張スタイル
WS_EX_ABSPOSITION   ウィンドウの絶対位置を指定します。
WS_EX_ACCEPTFILES   ドラッグ アンド ドロップ されたファイルを受け入れます。
WS_EX_CLIENTEDGE   ウィンドウの境界の縁を3D ( 立体的に ) 表示します。
WS_EX_CONTEXTHELP   ウィンドウのタイトル バーに、クエスチョンマーク ( ? ) を設けます。
  ?をクリックするとマウスカーソルは?の形に変わります。
  ?カーソルで子ウィンドウをクリックすると、子ウィンドウに WM_HELP メッセージを送ります。
WS_EX_CONTROLPARENT   TAB キーによるウィンドウ間の移動を可能にします。
WS_EX_DLGMODALFRAME   WS_CAPTION スタイルを指定したとき、
  タイトルバーを持ち (オプション) 、二重境界を持つウィンドウとする。
WS_EX_LEFT   左揃え表示のウィンドウとする。( デフォルト )
WS_EX_LEFTSCROLLBAR   垂直スクロールバーがあるなら、左側に配置する。
WS_EX_LTRREADING   文字の表示方向を 左から右とする。( デフォルト )
WS_EX_MDICHILD   MDI 子ウィンドウにする。
WS_EX_NOPARENTNOTIFY   子ウィンドウが作成/破棄されたときに、
  親ウィンドウに WM_PARENTNOTIFY メッセージを送らないウィンドウとする。
WS_EX_OVERLAPPEDWINDOW   = WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE
WS_EX_PALETTEWINDOW   WS_EX_WINDOWEDGE | WS_EX_SMCAPTION | WS_EX_TOPMOST
WS_EX_RIGHT   右揃え表示のウィンドウとする。
WS_EX_RIGHTSCROLLBAR   垂直スクロールバーがあるなら、右に配置する。( デフォルト )
WS_EX_RTLREADING   文字列の表示方向を、右から左とする。
WS_EX_SMCAPTION   小さなタイトルバーにする。
WS_EX_STATICEDGE   入力禁止の、3D境界をもつウィンドウにします。
WS_EX_TOOLWINDOW   フローティング ツールバー用のウィンドウにする。
WS_EX_TOPMOST   一番上に表示される ( 他のウィンドウの影にできない ) ウィンドウとする。
  SetWindowPos メンバ関数を使ってこの属性の追加や削除ができます。
WS_EX_TRANSPARENT   透明なウィンドウとする。
  下にある兄弟ウィンドウがすべて更新されてから、WM_PAINT メッセージを受け取る。
WS_EX_WINDOWEDGE   浮き出した境界線をもつウィンドウにする。


T スタイルの変更
CREATESTRUCT 構造体のデータを変更すると、ウィンドウスタイルを変更することができます。

PreCreateWindow( ) の引数には、CREATESTRUCT 構造体のポインタが与えられています。
BOOL CMainFrame::PreCreateWindow( CREATESTRUCT& cs )
{
// TODO: この位置で CREATESTRUCT cs を修正して、Window クラスやスタイルを修正してください。
cs.style ^= WS_MAXIMIZEBOX; // 最大化ボタンを無効にします。
cs.cy = 500; // ウィンドウの幅を 500 ピクセルに設定します。
return CFrameWnd::PreCreateWindow( cs );
}
 最大化ボタンがないウィンドウに、スタイルの指定だけでボタンを付けるなどはできません。
  適合しないスタイルを指定すると、パソコンが動かなくなるなどの誤動作を発生します。




 
T

  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html