本人初学是者,正在学习Win32API中,在遇到MDI窗口时,遇到如下问题,望各位前辈指教.#include "stdafx.h"
#include "resource.h"#define MAX_LOADSTRING 100HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
TCHAR mdiWindowClass[MAX_LOADSTRING];HWND hwndClient;ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable; // Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_MDI, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MDI); // Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MDI);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = (LPCSTR)IDC_MDI;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_CREATE:
{
hInst=((LPCREATESTRUCT) lParam)->hInstance;
CLIENTCREATESTRUCT clientcreate ;
clientcreate.hWindowMenu = NULL ;
clientcreate.idFirstChild = 50000 ;
hwndClient =CreateWindowEx(0,
"MDICLIENT",
NULL,
WS_CHILD |WS_CLIPCHILDREN| WS_VISIBLE,
0,
0,
0,
0,
hWnd,
(HMENU)1,
hInst,
&clientcreate);
}
return 0;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd,(DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_NEW: WNDCLASSEX wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = (WNDPROC)About ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (HANDLE) ;
wndclass.hInstance = hInst ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = mdiWindowClass ;
RegisterClassEx(&wndclass);
MDICREATESTRUCT mdicreate;
mdicreate.szClass = szWindowClass;//出现问题的地方
mdicreate.szTitle = TEXT ("Hello");
mdicreate.hOwner = hInst ;
mdicreate.x = CW_USEDEFAULT ;
mdicreate.y = CW_USEDEFAULT ;
mdicreate.cx = CW_USEDEFAULT ;
mdicreate.cy = CW_USEDEFAULT ;
mdicreate.style = 0 ;
mdicreate.lParam = 0 ;
SendMessage (
hwndClient,
WM_MDICREATE,
0,
(LPARAM) (LPMDICREATESTRUCT) &mdicreate
) ;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefFrameProc(hWnd,hwndClient,message, wParam, lParam);
}
return 0;
}// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}上面是我用VC向导生成的一个win32框架,在上面出现问题处(标了字)当我用mdiWindowClass的窗口类名时不会有任何反映不出现任何子窗口,但当我把它改成szWindowClass时会出现子窗但子窗口是一个套一个的请教各位是我自已建的窗口结构有问题吗?
#include "resource.h"#define MAX_LOADSTRING 100HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
TCHAR mdiWindowClass[MAX_LOADSTRING];HWND hwndClient;ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable; // Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_MDI, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MDI); // Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MDI);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = (LPCSTR)IDC_MDI;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_CREATE:
{
hInst=((LPCREATESTRUCT) lParam)->hInstance;
CLIENTCREATESTRUCT clientcreate ;
clientcreate.hWindowMenu = NULL ;
clientcreate.idFirstChild = 50000 ;
hwndClient =CreateWindowEx(0,
"MDICLIENT",
NULL,
WS_CHILD |WS_CLIPCHILDREN| WS_VISIBLE,
0,
0,
0,
0,
hWnd,
(HMENU)1,
hInst,
&clientcreate);
}
return 0;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd,(DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_NEW: WNDCLASSEX wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = (WNDPROC)About ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (HANDLE) ;
wndclass.hInstance = hInst ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = mdiWindowClass ;
RegisterClassEx(&wndclass);
MDICREATESTRUCT mdicreate;
mdicreate.szClass = szWindowClass;//出现问题的地方
mdicreate.szTitle = TEXT ("Hello");
mdicreate.hOwner = hInst ;
mdicreate.x = CW_USEDEFAULT ;
mdicreate.y = CW_USEDEFAULT ;
mdicreate.cx = CW_USEDEFAULT ;
mdicreate.cy = CW_USEDEFAULT ;
mdicreate.style = 0 ;
mdicreate.lParam = 0 ;
SendMessage (
hwndClient,
WM_MDICREATE,
0,
(LPARAM) (LPMDICREATESTRUCT) &mdicreate
) ;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefFrameProc(hWnd,hwndClient,message, wParam, lParam);
}
return 0;
}// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}上面是我用VC向导生成的一个win32框架,在上面出现问题处(标了字)当我用mdiWindowClass的窗口类名时不会有任何反映不出现任何子窗口,但当我把它改成szWindowClass时会出现子窗但子窗口是一个套一个的请教各位是我自已建的窗口结构有问题吗?
解决方案 »
- vc 单文档视图中嵌入的word, 如何释放该word对象
- MFC上利用DSound录音播放声音(WaitForMultipleObjects老是返回超时值)
- WM_SETTEXT
- 关于SetWindowPos
- 怎么样才能注册上 nicaiu.dll
- 如何检测那几个串口可用?
- 如何使用CSplitterWnd动态隐藏一个分割窗口
- 新手问题:在VC中,怎样在Button上放置位图?希望各位前辈给点信心! 谢谢!!!
- 蚁群算法的高手们青帮一下忙
- vc中头文件(.h)中可以定义几个类啊,源文件中有可以定义几个类啊?
- 请问如何在一个CString中隔10个字母插入一个换行符呢?
- 帮忙看看着两段代码有什么差异,谢谢先
所以你用这个注册窗口的时候,怎么成功呢???改成szWindowClass时会出现子窗但子窗口是一个套一个
那都是同一个窗口,到时候窗口过程都是同一个了
所以…………所以,你要弄一个新的窗口,注册一个新的窗口类,mdiWindowClass要赋值的然后给这个mdiWindowClass,还要建立他自己的窗口过程,
并且第一个参数为新窗口类名。很简单。
这句改成了TCHAR mdiWindowClass[MAX_LOADSTRING]="mdiwin";
给了字符串的值,但仍无效
而且原系统提供的主窗口类名字符串TCHAR szWindowClass[MAX_LOADSTRING];也未发现系统为其赋值仍然迷惑中,希望能够给予继续解答.
谢谢!
我把创建消息中的代码改成了如下形式case WM_CREATE:
{
WNDCLASSEX wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = (WNDPROC)About ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof (HANDLE) ;
wndclass.hInstance = hInst ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = mdiWindowClass ;
RegisterClassEx(&wndclass);
hInst=((LPCREATESTRUCT) lParam)->hInstance;
CLIENTCREATESTRUCT clientcreate ;
clientcreate.hWindowMenu = NULL ;
clientcreate.idFirstChild = 50000 ;
hwndClient =CreateWindowEx(0,
mdiWindowClass,
NULL,
WS_CHILD |WS_CLIPCHILDREN| WS_VISIBLE,
0,
0,
0,
0,
hWnd,
(HMENU)1,//ID
hInst,
&clientcreate); //
}
return 0;
......但仍未成功,按书上说hwndClient应该是客户区窗口而不是子窗口,创建子窗口是SendMessage (
hwndClient,
WM_MDICREATE,
0,
(LPARAM) (LPMDICREATESTRUCT) &mdicreate
) ;
这一句.hwndClient应是子窗口的父窗口,
框架窗口-客户区窗口-子窗口.
希望您能给予进一步解答谢谢.