| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: C++ / Winapi / Mdi im Forum Code Kitchen, in der Kategorie Software Home; Hallo, ich bin gerade dabei eine MDI-Applikation zu entwerfen und stoße dabei auf Probleme. 1.Als erstes weiß ich nicht wie ...
![]() |
| | #1 (permalink) |
| 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. 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;
} | |
| | |
| | #2 (permalink) |
| Registriert seit: 17.04.07 ![]() Likes: 0 | Als erstes nochmals ein Tipp CreateMDIWindow (erspart eine Menge an Arbeit). Zum Verändern der Fenstergröße: Keine Kritik hier, aber wenn du dir schon mal einige MDI-Applikationen angeschaut hast, wird dir sicherlich auffallen, dass die MDI-Clients hier nur automatisch mit vergößert/verkleinert werden wenn sie maximiert sind (oder sollen, falls mehrere vorhanden alle angepasst werden). Falls du dieses jedoch beim Ändern der Parentfenstergöße unbedingt benötigtst, reagiere auf WM_SIZE und passe dann die Größe des benötigten CHILD-Fensters an (nicht wie in deinem Code, die des Edit-Fensters - welches bei dir sowieso nicht funktionieren kann, da du als Parent das Hauptfenster angibst). Eine weitere Möglichkeit wäre WM_SIZEING 'abzufangen'. Zum Edit-Fenster: Das Fenster wird bei dir mit einer Größe von 0x0 erzeugt (deshalb nicht sichtbar). Siehe CreateWindow in der MSDN im Bezug auf Fensterbreite/höhe mit CW_USEDEFAULT und Style WS_CHILD. Noch ein Tipp zur Menüleiste: siehe MSDN Message WM_MDISETMENU |
| | |
| HaBOT | |
| |
| | #3 (permalink) |
| Themenstarter | Ich habe bereits alle Probleme gelöst. Dummerweise habe ich beim Schreiben nicht darauf geachtet SetUpMDIChildWindowClass() und SetUpMDIChildWindowClass() den gleichen Klassennamen zu geben. Trotzdem Danke für deine Hilfe. Ich habe nun ein anderes Problem und ich möchte in diesem thread bleiben um das Board nich vollzuspammen. Ich habe eine Treeview erstellt. Ich kann bereits Einträge einfügen, jedoch wird mir kein Icon angezeigt, obwohl ich alles getan habe, was in der MSDN steht damit es angezeigt wird. ( InitCommonControls() ist ausgeführt) Code: // in der .rc Datei
ICON_SERVER BITMAP "server.png"
//------------------------------------------------------
// in dem rc header
#define ICON_SERVER 110
//------------------------------------------------------
// hauptdatei
BOOL InitTreeViewImageLists(HWND hwndTV)
{
HIMAGELIST himl;
HBITMAP hbmp;
if ((himl = ImageList_Create(16,
16,
FALSE,
1, 0)) == NULL)
MessageBox(hWnd,"bla","nochmehrbla",MB_ICONEXCLAMATION | MB_OK);
hbmp = LoadBitmap(hInstance, MAKEINTRESOURCE(ICON_SERVER));
ImageList_Add(himl, hbmp, (HBITMAP)NULL);
DeleteObject(hbmp);
TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL);
return TRUE;
}
HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel)
{
TVITEM tvi;
TVINSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
static HTREEITEM hPrevRootItem = NULL;
static HTREEITEM hPrevLev2Item = NULL;
HTREEITEM hti;
tvi.mask = TVIF_TEXT | TVIF_IMAGE
| TVIF_SELECTEDIMAGE | TVIF_PARAM;
tvi.pszText = lpszItem;
tvi.cchTextMax = sizeof(tvi.pszText)/sizeof(tvi.pszText[0]);
tvi.iImage = nDoc;
tvi.iSelectedImage = nDoc;
tvi.lParam = (LPARAM)nLevel;
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
if (nLevel == 1)
tvins.hParent = TVI_ROOT;
else if (nLevel == 2)
tvins.hParent = hPrevRootItem;
else
tvins.hParent = hPrevLev2Item;
hPrev = (HTREEITEM)SendMessage(hwndTV,
TVM_INSERTITEM,
0,
(LPARAM)(LPTVINSERTSTRUCT)&tvins);
if (nLevel == 1)
hPrevRootItem = hPrev;
else if (nLevel == 2)
hPrevLev2Item = hPrev;
if (nLevel > 1)
{
hti = TreeView_GetParent(hwndTV, hPrev);
tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = hti;
tvi.iImage = nClo;
tvi.iSelectedImage = nClo;
TreeView_SetItem(hwndTV, &tvi);
}
return hPrev;
} |
| | |
| | #4 (permalink) | |
| Registriert seit: 17.04.07 ![]() Likes: 0 | Zitat:
Trotz dessen vermisse ich, wenn ich folgende Zeile lese ICON_SERVER BITMAP "server.png" irgendwelche Aufrufe der gdi+ Klasse, statt dessen versucht du die Datei mit LoadBitmap(...) zu laden. Es ist auch ganz hilfreich die Rückgabewerte der Funktionen zu überprüfen und dementsprechend mal GetLastError() aufzurufen. | |
| | |
![]() |
| | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Mit der WinAPI zeichnen | nookstar | Code Kitchen | 9 | 24.07.09 19:19 |
| WinApi Registry | ByteSurfer | Code Kitchen | 4 | 18.05.07 15:16 |
| Schonwieder c++/WinAPI | eqw0uL | Code Kitchen | 5 | 18.04.07 02:35 |
| c++/winapi | eqw0uL | Code Kitchen | 5 | 15.04.07 21:28 |
| C++ Tuts zur WinAPI | Nornagest | Code Kitchen | 2 | 19.10.01 00:57 |