[C++] Kan child window niet activeren

Pagina: 1
Acties:

  • Dr. Vork
  • Registratie: Oktober 1999
  • Laatst online: 27-02 00:36

Dr. Vork

Moet ik hier iets tiepen?

Topicstarter
De hieronder gegeven code maakt 2 windows, de parent en de child, maar op een of andere manier kan ik de child window niet actief krijgen, wat doe ik fout?

C++:
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <windows.h>

const char g_MClassName[] = "myMainWindowClass";
const char g_C1ClassName[] = "myChild1WindowClass";


BOOL RegWinClass(HINSTANCE hInstance, WNDPROC lpfnWndProc, LPCTSTR lpszClassName)
{
    WNDCLASSEX wc;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = lpfnWndProc;
    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_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = lpszClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    return RegisterClassEx(&wc);
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    MSG Msg;
    HWND hwndMain;
    HWND hwndChild1;

    //Make main window
    RegWinClass(hInstance, MainWndProc, g_MClassName);
    hwndMain = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_MClassName,
        "Main",
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        NULL, NULL, hInstance, NULL);
    ShowWindow(hwndMain, nCmdShow);
    UpdateWindow(hwndMain);

    //Make child1 window
    RegWinClass(hInstance, ChildWndProc, g_C1ClassName);
    hwndChild1 = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_C1ClassName,
        "Child1",
        WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX,
        0, 0, 100, 100,
        hwndMain, NULL, hInstance, NULL);
    ShowWindow(hwndChild1, nCmdShow);
    UpdateWindow(hwndChild1);


    //Messageloop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

Verwijderd

de fout hier is dat om een MDI child te creeeren je 3 windows moet aanmaken, 1) je framewindow ( in jouw geval de "myMainWindowClass" ) ten 2e maak je in deze frame window een CLIENT window

in jouw geval ziet de client er ongeveer zo uit
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CLIENTCREATESTRUCT ccs;

ccs.hWindowMenu  = NULL;
ccs.idFirstChild = 50000;

HWND ClientWindow = CreateWindowEx( WS_EX_CLIENTEDGE,
                                  "MDICLIENT",
                                NULL,
                                WS_CHILD | WS_CLIPCHILDREN | 
                                WS_VISIBLE | WS_HSCROLL | WS_VSCROLL,
                                CW_USEDEFAULT,
                                CW_USEDEFAULT,
                                CW_USEDEFAULT,
                                CW_USEDEFAULT,
                                "myMainWindowClass",
                                NULL,
                                hInstance,
                                (LPVOID)&ccs );

( let op, de Classname van deze client is al voorgedefineerd, dus gebruik hierbij "MDICLIENT" zoals in het voorbeeld )

stappie 3) maak nu je eigenlijke child die als parent de CLIENTwindow heeft.

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
der staat toch nergens dat het mdi moet zijn?? zag zo snel niks fouts... maar zal het zo effe goed bekijken...


bij mij draait ie goed, zie beide windows gewoon. dat mdi misschien meer wenselijk is zal je even zelf moeten kijken.

[ Voor 38% gewijzigd door Krooswijk.com op 06-03-2003 19:41 . Reden: effe code gedraaid ]


Verwijderd

der staat toch nergens dat het mdi moet zijn?? zag zo snel niks fouts... maar zal het zo effe goed bekijken
8)7 oeps, mijn fout dan. 8)7 omdat ik laats zelf ook met child windows liep te klooten ging ik er automatisch van uit dat hij dat ook wilde...in mijn eerste poging met het creeren van een child in een parent (toen zat ik ook niet aan MDI te denken) had ik namelijk soortgelijke code en toen ging die child heel gaar doen omdat ik die client er nie inhad...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Alleen een desktop/root window mag de foregroundwindow zijn (zie SetForegroundWindow docs). Wat je wil kan dus per definitie niet. Je mag een child window best een Caption, SysMenu en van alles geven, maar die worden alleen getekend, in non-activated vorm.

Voor het wellicht gewenste effect (dat je dat window kunt ronddraggen en activeren) zul je MDI moeten aanschuppen.

Professionele website nodig?