MDIでステータスバー等の領域を残すには
Posted: 2010年10月29日(金) 01:47
図のようにCHILDウィンドウを最大化すると
ステータスバーやツールバーの領域まで拡大
されてしまって困っています。
この問題はどのように解決すればいいのでしょうか。
よろしくお願いします。
以下コードです
#include <windows.h>
#include "resource.h"
#include <CommCtrl.h>
LRESULT CALLBACK FrameProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
char szClassNme[/url] = "ウィンドウクラス・ネーム";
HWND hwCl;
HWND hwFm;
HINSTANCE hInstFm;
HMENU hmFm;
HWND hwSb;
void myError(LPCSTR msg){MessageBox(NULL,msg,"",0);}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow)
{
hInstFm=hInst;
MSG msg;
WNDCLASS wc;
if (!hPreInst) {
wc.style =CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc =FrameProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =NULL;
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground =(HBRUSH)(COLOR_APPWORKSPACE+1);
wc.lpszMenuName =NULL;
wc.lpszClassName =szClassNme;
if (!RegisterClass(&wc)){
myError("1");
return FALSE;
}
}
hmFm=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1));
hwFm = CreateWindow(szClassNme,"FRAME",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,hmFm,hInst,NULL);
wc.lpszClassName="CCN";
wc.lpfnWndProc=ChildProc;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
if (!RegisterClass(&wc)){
myError("1");
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
LRESULT CALLBACK FrameProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CREATE:
//Create Client
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu=GetSubMenu(hmFm,1);
ccs.idFirstChild=1;
hwCl= CreateWindow( "MDICLIENT",NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE,
0, 0, 0, 0, hw, (HMENU)1, hInstFm, (LPSTR) &ccs);
//Create Statusbar
InitCommonControls();
hwSb=CreateWindowEx(0,STATUSCLASSNAME,NULL,
WS_CHILD | SBARS_SIZEGRIP | CCS_BOTTOM | WS_VISIBLE,
0,0,0,0,hw,(HMENU)2,hInstFm,NULL);
break;
case WM_COMMAND:
switch(wp){
case IDM_NEW1:
HWND hwCh;
MDICREATESTRUCT mcs;
mcs.x=CW_USEDEFAULT;
mcs.y=CW_USEDEFAULT;
mcs.cx=CW_USEDEFAULT;
mcs.cy=CW_USEDEFAULT;
mcs.szClass="CCN";
mcs.szTitle="child";
mcs.hOwner=hInstFm;
mcs.SSS=WS_CHILD;//SSS→style
mcs.lParam=0;
hwCh=(HWND)SendMessage(hwCl,WM_MDICREATE,0,(LPARAM)&mcs);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefFrameProc(hw, hwCl,msg, wp, lp);
}
LRESULT CALLBACK ChildProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp){
return DefMDIChildProc(hw,msg,wp, lp);
}
ステータスバーやツールバーの領域まで拡大
されてしまって困っています。
この問題はどのように解決すればいいのでしょうか。
よろしくお願いします。
以下コードです
#include <windows.h>
#include "resource.h"
#include <CommCtrl.h>
LRESULT CALLBACK FrameProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
char szClassNme[/url] = "ウィンドウクラス・ネーム";
HWND hwCl;
HWND hwFm;
HINSTANCE hInstFm;
HMENU hmFm;
HWND hwSb;
void myError(LPCSTR msg){MessageBox(NULL,msg,"",0);}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow)
{
hInstFm=hInst;
MSG msg;
WNDCLASS wc;
if (!hPreInst) {
wc.style =CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc =FrameProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =NULL;
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground =(HBRUSH)(COLOR_APPWORKSPACE+1);
wc.lpszMenuName =NULL;
wc.lpszClassName =szClassNme;
if (!RegisterClass(&wc)){
myError("1");
return FALSE;
}
}
hmFm=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1));
hwFm = CreateWindow(szClassNme,"FRAME",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,hmFm,hInst,NULL);
wc.lpszClassName="CCN";
wc.lpfnWndProc=ChildProc;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
if (!RegisterClass(&wc)){
myError("1");
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
LRESULT CALLBACK FrameProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CREATE:
//Create Client
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu=GetSubMenu(hmFm,1);
ccs.idFirstChild=1;
hwCl= CreateWindow( "MDICLIENT",NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE,
0, 0, 0, 0, hw, (HMENU)1, hInstFm, (LPSTR) &ccs);
//Create Statusbar
InitCommonControls();
hwSb=CreateWindowEx(0,STATUSCLASSNAME,NULL,
WS_CHILD | SBARS_SIZEGRIP | CCS_BOTTOM | WS_VISIBLE,
0,0,0,0,hw,(HMENU)2,hInstFm,NULL);
break;
case WM_COMMAND:
switch(wp){
case IDM_NEW1:
HWND hwCh;
MDICREATESTRUCT mcs;
mcs.x=CW_USEDEFAULT;
mcs.y=CW_USEDEFAULT;
mcs.cx=CW_USEDEFAULT;
mcs.cy=CW_USEDEFAULT;
mcs.szClass="CCN";
mcs.szTitle="child";
mcs.hOwner=hInstFm;
mcs.SSS=WS_CHILD;//SSS→style
mcs.lParam=0;
hwCh=(HWND)SendMessage(hwCl,WM_MDICREATE,0,(LPARAM)&mcs);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefFrameProc(hw, hwCl,msg, wp, lp);
}
LRESULT CALLBACK ChildProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp){
return DefMDIChildProc(hw,msg,wp, lp);
}