Hallo, ich bin gerade dabei eine MDI-Applikation zu entwerfen und stoße dabei auf Probleme.
1.Als erstes weiß ich nicht wie ich die hMDIClient der Fenstergröße beim vergrößern oder verkleinern des Fensters anpasse.
2. Das MDI-Child wird nicht aktiviert (fokussiert)
3. Die Editbox, die im MDI-Child erscheinen soll wird nicht angezeigt
4. Beim Maximieren eines MDIChilds verschmilzt die Titelleiste nicht mit der Menüleiste
Hier ist der Code. Unrelevante Dinge habe ich ausgelassen.
Ich hoffe Jemand kann mir helfen. Die MSDN und diverse Tutorials konnten es nicht
1.Als erstes weiß ich nicht wie ich die hMDIClient der Fenstergröße beim vergrößern oder verkleinern des Fensters anpasse.
2. Das MDI-Child wird nicht aktiviert (fokussiert)
3. Die Editbox, die im MDI-Child erscheinen soll wird nicht angezeigt
4. Beim Maximieren eines MDIChilds verschmilzt die Titelleiste nicht mit der Menüleiste
Hier ist der Code. Unrelevante Dinge habe ich ausgelassen.
Code:
IDR_MYMENU MENU
BEGIN
POPUP "&Options"
BEGIN
MENUITEM "C&onnect", ID_OPTIONS_CON
MENUITEM "E&xit", ID_FILE_EXIT
END
POPUP "&Stuff"
BEGIN
MENUITEM "&Go", ID_STUFF_GO
MENUITEM "G&o somewhere else", 0, GRAYED
END
POPUP "&Windows"
BEGIN
MENUITEM "&Tile", ID_WINDOW_TILE
MENUITEM "&Cascade", ID_WINDOW_CASCADE
MENUITEM "&Close", ID_FILE_CLOSE
MENUITEM "&Close All", ID_FILE_CLOSEALL
END
POPUP "&Help"
BEGIN
MENUITEM "&About", ID_HELP_ABOUT
END
END
//----------------------------------------------------------
#define IDC_MAIN_MDI 10000
#define ID_MDI_FIRSTCHILD 10001
#define IDC_CHILD_EDIT 5000
#define IDR_MYMENU 101
#define ID_FILE_EXIT 9001
#define ID_STUFF_GO 9002
#define ID_OPTIONS_CON 9003
#include <iostream>
#include <process.h>
#include <windows.h>
#include <winsock2.h>
#include <commctrl.h>
#include "resss.h"
LRESULT CALLBACK WndProcMain(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProcChild(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MDIChildWndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK ConDlgProc(HWND, UINT, WPARAM, LPARAM);
HWND CreateNewMDIChild(HWND);
BOOL SetUpMDIChildWindowClass(HINSTANCE);
char status[] = " - eqw0uL -", errors[] = "Error: None";
HINSTANCE hInstance;
HWND hWnd; // parent
HWND hMDIClient;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
const char szAppName[] = "eQw0L";
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProcMain;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); /* std LTGRAY_BRUSH */
wc.lpszClassName = szAppName;
wc.lpszMenuName = NULL;
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);
RegisterClass(&wc);
SetUpMDIChildWindowClass(hInstance);
hWnd = CreateWindow(szAppName, "eQw0uLitY", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT,
640, 480, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel(hMDIClient, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProcMain(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND StatBar;
int Partsize[2] = { 640, 480 }; // stbar
switch (message)
{
case WM_CREATE:
{
// MDI-Client
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd), 2);
ccs.idFirstChild = ID_MDI_FIRSTCHILD;
hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, "MDICLIENT", NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 415,
hWnd, (HMENU)IDC_MAIN_MDI, GetModuleHandle(NULL), (LPVOID)&ccs);
CreateNewMDIChild(hMDIClient);
// statusbar
InitCommonControls();
StatBar = CreateWindowEx(0, STATUSCLASSNAME, "", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, 0,
((LPCREATESTRUCT)lParam)->hInstance,NULL);
SendMessage(StatBar,SB_SETTEXT,0,(LPARAM)status);
SendMessage(StatBar,SB_SETTEXT,1,(LPARAM)errors);
}
break;
case WM_SIZE:
{
Partsize[0] = LOWORD(lParam)/*/2*/;
//Partsize[1] = LOWORD(lParam);
SendMessage(StatBar,SB_SETPARTS,1,(LPARAM)Partsize);
SetWindowPos(StatBar, 0, 0, 0, LOWORD(lParam), 0, SWP_NOMOVE);
HWND hEdit;
RECT rcClient;
GetClientRect(hWnd, &rcClient);
hEdit = GetDlgItem(hWnd, IDC_CHILD_EDIT);
SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
}
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_OPTIONS_CON:
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_CON), hWnd, ConDlgProc);
break;
case ID_HELP_ABOUT:
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), hWnd, AboutDlgProc);
break;
case ID_FILE_EXIT:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case ID_STUFF_GO:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case ID_FILE_CLOSE:
{
HWND hC = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE,0,0);
if(hC)
{
SendMessage(hC, WM_CLOSE, 0, 0);
}
}
default:
{
if(LOWORD(wParam) >= ID_MDI_FIRSTCHILD)
{
DefFrameProc(hWnd, hMDIClient, message, wParam, lParam);
}
else
{
HWND hChild = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE,0,0);
if(hChild)
{
SendMessage(hChild, WM_COMMAND, wParam, lParam);
}
}
}
}
break;
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefFrameProc(hWnd, hMDIClient, message, wParam, lParam);
}
return 0;
}
return 0;
}
BOOL SetUpMDIChildWindowClass(HINSTANCE hInstance)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MDIChildWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "a";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(0, "Could Not Register Child Window", "Oh Oh...",
MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
else
return TRUE;
}
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
HFONT hfDefault;
HWND hEdit;
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "bla",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_CHILD_EDIT, GetModuleHandle(NULL), NULL);
if(hEdit == NULL)
MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR);
hfDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
}
break;
case WM_MDIACTIVATE:
{
HMENU hMenu, hFileMenu;
UINT EnableFlag;
hMenu = GetMenu(hWnd);
if(hwnd == (HWND)lParam)
{ //being activated, enable the menus
EnableFlag = MF_ENABLED;
}
else
{ //being de-activated, gray the menus
EnableFlag = MF_GRAYED;
}
EnableMenuItem(hMenu, 1, MF_BYPOSITION | EnableFlag);
EnableMenuItem(hMenu, 2, MF_BYPOSITION | EnableFlag);
hFileMenu = GetSubMenu(hMenu, 2);
EnableMenuItem(hFileMenu, ID_FILE_SAVEAS, MF_BYCOMMAND | EnableFlag);
EnableMenuItem(hFileMenu, ID_FILE_CLOSE, MF_BYCOMMAND | EnableFlag);
EnableMenuItem(hFileMenu, ID_FILE_CLOSEALL, MF_BYCOMMAND | EnableFlag);
DrawMenuBar(hWnd);
}
break;
return DefMDIChildProc(hWnd, msg, wParam, lParam);
default:
return DefMDIChildProc(hWnd, msg, wParam, lParam);
}
return 0;
}
HWND CreateNewMDIChild(HWND hMDIClient)
{
HWND hChild;
MDICREATESTRUCT mcs;
mcs.szTitle = "[Untitled]";
mcs.szClass = "MDICLIENT";
mcs.hOwner = hInstance;
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
mcs.style = MDIS_ALLCHILDSTYLES;
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);
if(!hChild)
{
MessageBox(hMDIClient, "MDI Child creation failed.", "2Oh Oh...",
MB_ICONEXCLAMATION | MB_OK);
}
return hChild;
}
Ich hoffe Jemand kann mir helfen. Die MSDN und diverse Tutorials konnten es nicht