新手清叫一个子窗口的问题,为什么父窗口最大化最小化后,子窗口就不显示了?
代码贴在下面了,可以通过编译,但是最小化吼就不见了,改变主窗口大小,掩盖的子窗口也得不到恢复。
#include<windows.h>
HWND hwndchild;
HWND hwnd;
char ChildName[]="child";
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildWndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,
PSTR szCmdLine,int nCmdShow)
{
static TCHAR szAppName[]=TEXT("Window");
MSG msg;
WNDCLASS wndclass,childclass;
wndclass.style= CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hinstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
childclass.style=CS_HREDRAW|CS_VREDRAW;
childclass.lpfnWndProc=ChildWndProc;
childclass.cbClsExtra=0;
childclass.cbWndExtra=0;
childclass.hInstance=hinstance;
childclass.hIcon=NULL;
childclass.hCursor=NULL;
childclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
childclass.lpszMenuName=NULL;
childclass.lpszClassName=ChildName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Register class faild!"),szAppName,MB_ICONERROR);
return 0;
}
if(!RegisterClass(&childclass))
{
MessageBox(NULL,TEXT("Register childclass faild!"),"ftc",MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(
szAppName,
TEXT("My Program"),
WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
//CW_USEDEFAULT,
10,
10,
600,
800,
//CW_USEDEFAULT,
//CW_USEDEFAULT,
//CW_USEDEFAULT,
NULL,
NULL,
hinstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
HINSTANCE hInstance;
switch(message)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hwndchild=CreateWindow(ChildName,"tt",WS_VISIBLE|WS_CHILD,50,50,200,300,hwnd,NULL,hInstance,
NULL);
return 0;
case WM_SIZE:
MoveWindow(hwndchild,50,50,200,300,FALSE);
case WM_PAINT:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_SIZE:
return 0;
}
}
[解决办法]
#include "stdafx.h"
HINSTANCE g_hInst = NULL;
// 父窗口的处理函数
LRESULT CALLBACK WndProc( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam )
{
switch( nMsg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, nMsg,
wParam, lParam );
}
//子窗口的处理函数
LRESULT CALLBACK ChildProc( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam )
{
return DefWindowProc( hWnd, nMsg,
wParam, lParam );
}
//消息处理函数
void Message( )
{
MSG msg = { 0 };
while( GetMessage( &msg, NULL, 0, 0 ) )
{
DispatchMessage( &msg );
}
}
//显示窗口
void DisplayWnd( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
}
//创建窗口
HWND CreateWnd( LPSTR pszClassName,
DWORD nStyle,
HWND hParent )
{
HWND hWnd = CreateWindowEx(
0,
pszClassName,
"MyWnd",
nStyle,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
hParent,NULL,g_hInst,NULL );
return hWnd;
}
//注册窗口
BOOL RegisterWnd( LPSTR pszClassName,
WNDPROC proc,
int nBrush )
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.style = CS_HREDRAW
[解决办法]
CS_VREDRAW;
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.lpfnWndProc = proc;
wce.hIcon = NULL;
wce.hCursor = NULL;
wce.hbrBackground = HBRUSH( nBrush );
wce.hInstance = g_hInst;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.hIconSm = NULL;
ATOM nAtom = RegisterClassEx( &wce );
if( 0 == nAtom )
{
return FALSE;
}
return TRUE;
} int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
g_hInst = hInstance;
//注册父窗口类
RegisterWnd( "MyWnd", WndProc,
COLOR_BTNFACE+1 );
//注册子窗口类
RegisterWnd( "Child", ChildProc,
COLOR_WINDOW );
//创建父窗口
HWND hWnd = CreateWnd( "MyWnd",
WS_OVERLAPPEDWINDOW, NULL );
//创建子窗口
HWND hChild1 = CreateWnd( "Child",
WS_CHILD
[解决办法]
WS_VISIBLE
[解决办法]
WS_BORDER
[解决办法]
WS_THICKFRAME
[解决办法]
WS_CAPTION
[解决办法]
WS_SYSMENU
[解决办法]
WS_MINIMIZEBOX
[解决办法]
WS_MAXIMIZEBOX,
hWnd );
HWND hChild2 = CreateWnd( "Child",
WS_POPUP
[解决办法]
WS_VISIBLE
[解决办法]
WS_THICKFRAME
[解决办法]
WS_CAPTION
[解决办法]
WS_SYSMENU,
hWnd );
HWND hChild3 = CreateWnd( "Child",
WS_CHILD
[解决办法]
WS_VISIBLE
[解决办法]
WS_BORDER,
hWnd );
//移动窗口位置
MoveWindow( hChild1, 100, 100,
200, 200, TRUE );
MoveWindow( hChild2, 100, 200,
200, 200, TRUE );
MoveWindow( hChild3, 100, 300,
200, 200, TRUE );
//显示父窗口
DisplayWnd( hWnd );
Message( );
return 0;
}