Hackerboard WikiHaboBlog

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

C++ / Winapi / Mdi

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 ...

Antwort
Alt 28.04.07, 01:57   #1 (permalink)
 
Registriert seit: 02.02.06
eqw0uL Leistung: Facit NTK
eqw0uL eine Nachricht über ICQ schicken
Likes: 0
Standard C++ / Winapi / Mdi


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;
}
Ich hoffe Jemand kann mir helfen. Die MSDN und diverse Tutorials konnten es nicht :(
eqw0uL ist offline   Mit Zitat antworten
Alt 01.05.07, 15:43   #2 (permalink)
 
Registriert seit: 17.04.07
c++api Leistung: Facit NTK
Likes: 0
Standard

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
c++api ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 01.05.07, 22:04   #3 (permalink)
Themenstarter
 
Registriert seit: 02.02.06
eqw0uL Leistung: Facit NTK
eqw0uL eine Nachricht über ICQ schicken
Likes: 0
Standard c++ / WinApi Treeview

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; 
}
eqw0uL ist offline   Mit Zitat antworten
Alt 02.05.07, 01:15   #4 (permalink)
 
Registriert seit: 17.04.07
c++api Leistung: Facit NTK
Likes: 0
Standard RE: c++ / WinApi Treeview

Zitat:
Original von eqw0uL
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)
Wenn du den Beitrag zum Thema TVITEM in der MSDN richtig gelesen hättest, würdest du den Fehler schon finden. (Tipp: iImage/iSelectedImage).

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.
c++api ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » C++ / Winapi / Mdi
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ä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


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61