我使用vc++编程,我使用RegisterClassEx注册了窗口类,怎么用CreateWindow创建该类的MDI窗口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我使用vc++编程,我使用RegisterClassEx注册了窗口类,怎么用CreateWindow创建该类的MDI窗口?相关的知识,希望对你有一定的参考价值。

使用RegisterClassEx创建子窗口类后,
使用CreateWindow(_TEXT("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
0, 0, rectMain.right, 50, hWnd, NULL, hInstance, (PSTR)&lsSet1);
创建了hwnd的MDI窗口,怎样才能使新创建的MDI窗口与刚刚注册的窗口类相关联呢?

看看这个 希望对你有帮助

#include <windows.h>
#include <tchar.h>

HINSTANCE hInst;

ATOM WindowRegister(WNDPROC lpfnWndProc, char *lpClname, HBRUSH hbrBack)

WNDCLASSEX wnd;

wnd.cbClsExtra = 0;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.cbWndExtra = 0;
wnd.hbrBackground = hbrBack;
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInst;
wnd.lpfnWndProc = lpfnWndProc;
wnd.lpszClassName = lpClname;
wnd.lpszMenuName = NULL;
wnd.style = CS_HREDRAW | CS_VREDRAW;

return RegisterClassEx(&wnd);


LRESULT CALLBACK ClientProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

HWND hWndEdit;

switch (uMsg)

case WM_CREATE:
RECT rect;

GetClientRect(hWnd, &rect);

hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("Edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_MULTILINE,
0, 0, rect.right, rect.bottom, hWnd, NULL, hInst, NULL);
return 0;
case WM_SIZE:
hWndEdit = GetWindow(hWnd, GW_CHILD);

GetClientRect(hWnd, &rect);
SetWindowPos(hWndEdit, NULL, 0, 0, rect.right, rect.bottom, SWP_NOMOVE | SWP_NOZORDER);
break;
case WM_MDIACTIVATE:
return 0;


return DefMDIChildProc(hWnd, uMsg, wParam, lParam);


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

static HWND hClient;

MDICREATESTRUCT mdic;

switch (uMsg)

case WM_CREATE:
WindowRegister(ClientProc, _T("Client"), (HBRUSH)GetStockObject(WHITE_BRUSH));

HMENU hMenu;

hMenu = CreateMenu();

AppendMenu(hMenu, MF_STRING, 1000, _T("New(&N)"));
SetMenu(hWnd, hMenu);

CLIENTCREATESTRUCT ccs;

ccs.hWindowMenu = NULL;
ccs.idFirstChild = 100;

hClient = CreateWindow(_T("MDICLIENT"), NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
0, 0, 0, 0, hWnd, NULL, hInst, &ccs);
return 0;
case WM_DESTROY: PostQuitMessage(0); return 0;
case WM_COMMAND:
switch (LOWORD(wParam))

case 1000:
mdic.szClass = _T("Client");
mdic.szTitle = _T("Document");
mdic.hOwner = hInst;
mdic.x = CW_USEDEFAULT;
mdic.y = CW_USEDEFAULT;
mdic.cx = CW_USEDEFAULT;
mdic.cy = CW_USEDEFAULT;
mdic.style = 0;
mdic.lParam = 0;

HWND hChild;

hChild = (HWND)SendMessage(hClient, WM_MDICREATE, 0, (LPARAM)&mdic);
break;
default:
hChild = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0);

if (IsWindow(hChild)) SendMessage(hChild, WM_COMMAND, wParam, lParam);

break;

break;


return DefFrameProc(hWnd, hClient, uMsg, wParam, lParam);


INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd)

hInst = hInstance;

WindowRegister(WndProc, _T("Sample"), (HBRUSH)(COLOR_APPWORKSPACE + 1));

HWND hWnd = CreateWindow(_T("Sample"), _T("Sample"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
100, 100, 500, 400, NULL, NULL, hInstance, NULL);

if (!hWnd) return FALSE;

HWND hClient = GetWindow(hWnd, GW_CHILD);

ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

if (!TranslateMDISysAccel(hClient, &msg))

TranslateMessage(&msg);
DispatchMessage(&msg);



return msg.wParam;
参考技术A 你在用CreateWindow函数创建窗口时,该函数的第一个参数,是窗口类名,你只要用你上面注册的窗口类的类名,这样就联系上了。

以上是关于我使用vc++编程,我使用RegisterClassEx注册了窗口类,怎么用CreateWindow创建该类的MDI窗口?的主要内容,如果未能解决你的问题,请参考以下文章

vc ++ mfc中串行编程的一些问题

UINavigationController appDelegate UIViewController以编程方式

在 Swift 中以编程方式制作 Segue

以编程方式显示到控制器的导航

C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配

以编程方式创建 VC,使用公式中文本字段中的整数并在点击 UIButton 时执行计算