Problem z przekazywaniem parametrów w WndProc

0

Witam!
Przejdę od razu do konkretów. Spróbuje wytłumaczyć mój problem klarowanie jak tylko się da.
Więc..
Mam plik menu.rc z taką przykładową strukturą:

200 MENU
{
    POPUP "&Plik"
    {
        MENUITEM "&Nowa", 100
        MENUITEM "&Otwórz..", 101
        MENUITEM "&Zapisz", 102
        MENUITEM "Z&apisz jako..", 103
        MENUITEM SEPARATOR
        MENUITEM "Zakoń&cz", 104
    }
}

Wybierzmy sobie obojętnie jakie pole, może być menuitem o identyfikatorze 102.
Całej struktury WinAPI nie będę tu przedstawiał, tak jak mówiłem konkrety:
Mam taką kontrolkę:

hText = CreateWindowEx( WS_EX_CLIENTEDGE, L"EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 480, 240, hwnd, NULL, hInstance, NULL );

Tworzy ona pole tekstowe, gdzie możemy sobie coś napisać.
Mamy teraz funkcję WndProc:

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg ) {
        
        HANDLE_MSG( hwnd, WM_COMMAND, OnCommand );
        HANDLE_MSG( hwnd, WM_CLOSE, OnClose );
        HANDLE_MSG( hwnd, WM_DESTROY, OnDestroy );
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    
    return 0;
}

Jak widać, zastosowałem tutaj łamacza komunikatów. Wszystkie komunikaty typu WM_COMMAND, są kierowane do funkcji OnCommand. Jak wiadomo, wszystkie pola z menu po kliknięciu generują właśnie taki komunikat.
Teraz mamy funkcje OnCommand:

void OnCommand( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify ) {
    
    switch( id ) {
    case 102:
        zapisz_plik( ??? ) //TUTAJ MAM PROBLEM!
        break;
    }
}

I teraz opis całej sytuacji: Napisze sobie coś w kontrolce i z menu kliknę pozycję Zapisz. Po kliknięciu generowany jest komunikat WM_COMMAND, który kierowany jest do funkcji OnCommand, gdzie przy pomocy switch'a weryfikuję co tak naprawdę zostało kliknięte. Jak widzimy w switch'u mamy nasze id 102, więc tutaj wchodzimy. I teraz chce załóżmy zapisać do pliku, to co napisałem w mojej kontrolce. Jak widzimy mam wywołanie funkcji "zapisz_plik", ale ja do tej funkcji potrzebuję przekazać uchwyt do mojej kontrolki z tekstem (czyli hText), aby taki tekst pobrać! Jak ja mam to zrobić?
Istnieją jakieś inne implementacje funkcji WndProc żeby to działało jakbym chciał?
W programie będę miał więcej zdarzeń które, będą wywoływać jakieś tam funkcje z jakimiś potrzebnymi parametrami..
Mam nadzieję, że wszystko jasno wytłumaczyłem.
Dziękuję i pozdrawiam,
mleko64

0

Istnieją jakieś inne implementacje funkcji WndProc żeby to działało jakbym chciał?
A po co?

Jak widzimy mam wywołanie funkcji "zapisz_plik", ale ja do tej funkcji potrzebuję przekazać uchwyt do mojej kontrolki z tekstem (czyli hText)
Skoro tworzysz kontrolkę, to znaczy że masz do niej uchwyt, prawda?
A jak nie to GetDlgItem, ale i tak potrzebujesz jej ID.

0

Tak, mam do niej uchwyt, ale nie jest to uchwyt globalny, tylko tworzenie tej kontrolki jest w osobnej funkcji.. Innymi słowy, nie mam dostępu do uchwytu tej kontrolki we funkcji OnCommand..
Pomysł z GetDlgItem też niezły, no ale nie mam żadnych identyfikatorów kontrolek. Szkoda ze sam uchwyt okna hwnd, nie ma informacji na temat kontrolek z nią związanych.. Wtedy sprawa była by prosta..

0

To sobie przekaż. Trzymaj w polu klasy. W zmiennej globalnej. Dowolnie.
WinAPI nie jest obiektowe, musisz sobie obiektowość zrobić sam.

0

Musisz opracować jakiś sposób dostawania się od okna do jego kontrolek. W WinAPI właśnie system ID kontrolek jest tutaj czymś co można wykorzystać. Jeśli nie budujesz całej obiektowej otoczki na okna czy jakiejś innej struktury opisującej co jest gdzie to można by ten system wykorzystać. Albo sobie zrób zasób z kontrolkami okna albo użyj hmenu podczas tworzenia kontrolki. Coś takiego powinno zadziałać:

/* KONTROLKA EDYCYJNA */
HWND CreateEditor(..., WORD id, ...)
{
    ... CreateWindow(..., id /*hMenu*/, ...); ...
}

/* OKNO GŁÓWNE */
enum MainWindowControlID {
   ...
   ID_MAIN_EDITOR = 100,
   ...
};

/* tworzenie kontrolki */
CreateEditor(..., ID_MAIN_EDITOR, ...);

/* pobieranie kontrolki */
HWND hEditor = GetDlgItem(hWnd, ID_MAIN_EDITOR);

1 użytkowników online, w tym zalogowanych: 0, gości: 1