首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么无法用MoveWindow()改变窗口大小?该怎么解决

2012-03-13 
为什么无法用MoveWindow()改变窗口大小?我编写一个程序,主要是建立一个主窗口(hMainWnd),再在主窗口的窗户

为什么无法用MoveWindow()改变窗口大小?
我编写一个程序,主要是建立一个主窗口(hMainWnd),再在主窗口的窗户区建立一个子窗口(hDocWnd)。可是当我希望子窗口随着主窗口的大小变化而变化的时候,就在主窗口过程的WM_SIZE消息处理中,加了一条语句,用MoveWindow()来改变子窗口的大小。可是奇怪的很,竟然不起作用。不管如何修改,这个MoveWindow()函数就是不起作用。子窗口还是原来的大小。

我不得已,在WM_SIZE消息中插了一条语句,发现每当主窗口大小改变时,这条语句是执行的,也就是说MoveWindow语句还是执行了,但就是不起作用。

我又试着把这条MoveWindow语句插入到WM_CREATE消息处理流程中(就是下列代码中“************”的上一行),直接放在建立子窗口的语句后面,也就是说子窗口刚建立,立即用MoveWindow()来改变它的大小。发现这回起作用了。

奇怪了,为什么放在WM_CREATE消息处理流程中,就起作用,而放在WM_SIZE消息处理流程中, 就不起作用呢?

请高手指点!

附代码:(环境为VC++6.0)



#include <Windows.h>
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DocWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
HINSTANCE hIn;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("editc");
static TCHAR szMainWnd[] = TEXT("MainWnd");
HWND hMainWnd;
MSG msg;
WNDCLASSEX wndclassex;

hIn=hInstance;

wndclassex.cbSize = sizeof (WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = MainWndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = szMainWnd;
wndclassex.hIconSm =0;

if (!RegisterClassEx(&wndclassex))
{
MessageBox(NULL, TEXT("程序需要Windows NT!!"), szAppName, MB_ICONERROR);
return 0;
}
hMainWnd=CreateWindowEx(WS_EX_WINDOWEDGE,
szMainWnd,
TEXT("EditC"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL | WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hMainWnd, SW_MAXIMIZE);
UpdateWindow(hMainWnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK MainWndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static TCHAR szDocWnd[] = TEXT("DocWnd");
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
HWND hDocWnd;
WNDCLASSEX wndclassex;
int cxClient,cyClient;

switch (message)
{
case WM_CREATE:
GetClientRect(hMainWnd, &rect);
cxClient = rect.right - rect.left;
cyClient = rect.bottom - rect.top;

wndclassex.cbSize = sizeof (WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclassex.lpfnWndProc = DocWndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hIn;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = szDocWnd;
wndclassex.hIconSm =0;
if (!RegisterClassEx(&wndclassex))
{
MessageBox(NULL, TEXT("程序需要Windows NT!"), szDocWnd, MB_ICONERROR);
return 0;
}
hDocWnd = CreateWindow(szDocWnd,
0,
WS_VSCROLL | WS_HSCROLL | WS_CHILD | WS_VISIBLE | WS_THICKFRAME,

cxClient/5,
0,
cxClient-cxClient/5,
cyClient,
hMainWnd,


(HMENU)10,
hIn,
NULL);
//MoveWindow(hDocWnd,cxClient/5,0,cxClient-cxClient/5,cyClient-100,FALSE);
//*************************************************************************************
return 0;

caseWM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
MoveWindow(hDocWnd,cxClient/5,0,cxClient-cxClient/5,cyClient-100,FALSE);
return 0;

case WM_PAINT:
hdc=BeginPaint (hMainWnd, &ps) ;
EndPaint (hMainWnd, &ps) ;
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hMainWnd, message, wParam, lParam) ;
}

LRESULT CALLBACK DocWndProc(HWND hDocWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc (hDocWnd, message, wParam, lParam);
}


[解决办法]
HWND hMainWnd;
这个变量在回调函数结束时就清空了,前面加个static就行了。

热点排行