Dialog tworzony podczas działania programu

2014-10-22 11:34
0

Witam. utworzyłem dialog wedlug poradnika http://cpp0x.pl/kursy/Kurs-Wi[...]stawy/Okna-dialogowe-cz-7/190.

gdy tworze dialog modalny funkcją:

DialogBoxIndirect( hThisInstance,( DLGTEMPLATE * ) hgbl, hwnd,( DLGPROC ) DialogProc );

widze swój dialog, jednak ja potrzebuje niemodalnego dialogu. Z poprzednich kursów CreateDialog() wywoływało dialog niemodalny, więc spróbowałem funkcji z powyższego kursu:

CreateDialogIndirect( hThisInstance,( DLGTEMPLATE * ) hgbl, hwnd,( DLGPROC ) DialogProc );

Niestety teraz nie widzę żadnego dialogu jakbym w ogóle go nie wyświetlał. Macie jakies pomysły?

Tutaj tworze okno dialogu i go wyświetlam:


{ /// okno pulpitu
                WINDOWINFO Info;
                Info.cbSize = sizeof(WINDOWINFO);
                GetWindowInfo(GetDesktopWindow(), &Info);
                int x = Info.rcClient.right   -150 -0;
                int y = Info.rcClient.bottom  -23  -30;

                hgbl = GlobalAlloc( GMEM_ZEROINIT, 1024 );
                pdt =( DLGTEMPLATE * ) GlobalLock( hgbl );

                pdt->style = WS_POPUP;
                pdt->cdit = 1;

                RECT rcDlg = { x, y, 150, 23 };
                PixelsToDialogUnits( rcDlg );

                pdt->x =( short ) rcDlg.left;
                pdt->y =( short ) rcDlg.top;
                pdt->cx =( short ) rcDlg.right;
                pdt->cy =( short ) rcDlg.bottom;

                pw =( WORD * )( pdt + 1 );
                * pw++ = 0x0; // brak menu
                * pw++ = 0x0; // predefiniowana klasa dialogu

                pws =( LPWSTR ) pw;
                nchar = 1 + MultiByteToWideChar( CP_ACP, 0, "Dodaj wpis...", - 1, pws, 50 );
                pw += nchar;

                pw = lpwAlign( pw );
                pdit =( DLGITEMTEMPLATE * ) pw;
/// EDIT
                pw = lpwAlign( pw );
                pdit =( DLGITEMTEMPLATE * ) pw;

                RECT rcEdit = { 25, 10, 150, 25 };
                PixelsToDialogUnits( rcEdit );

                pdit->x =( short ) rcEdit.left;
                pdit->y =( short ) rcEdit.top;
                pdit->cx =( short ) rcEdit.right;
                pdit->cy =( short ) rcEdit.bottom;

                pdit->id = 1000;
                pdit->style = WS_CHILD | WS_VISIBLE | WS_BORDER;

                pw =( WORD * )( pdit + 1 );
                * pw++ = 0xffff;
                * pw++ = 0x0081; // edit box

                pws =( LPWSTR ) pw;
                nchar = 1 + MultiByteToWideChar( CP_ACP, 0, "Tekst", - 1, pws, 50 );
                pw += nchar;
                * pw++ = 0; // brak dodatkowych danych

 }

a po wyświetleniu głównego okna próbuje wywołac dialog:


        ShowWindow (hwnd, nCmdShow);

        GlobalUnlock( hgbl );
        CreateDialogIndirect( hThisInstance,( DLGTEMPLATE * ) hgbl, hwnd,( DLGPROC ) DialogProc );
        GlobalFree( hgbl );
edytowany 1x, ostatnio: gswidwa, 2014-10-22 11:36

Pozostało 580 znaków

2014-10-22 11:38
Zięć
0

Spróbuj użyć DialogBoxParam()

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2014-10-22 11:45
0

Strzelasz czy wiesz?

http://msdn.microsoft.com/en-[...]op/ms645465%28v=vs.85%29.aspx

Bo tu pisze, że to tworzy dialog modalny w dalszym ciągu z ta róznicą, że mozna podac argument lParam który można wykorzystac w WM_INITDIALOG.

usunięcie znacznika <code class="cpp"> - @furious programming

edytowany 1x, ostatnio: furious programming, 2014-10-22 15:45
Nie wstawiaj linków w znaczniki - daj możliwość klikania; - furious programming 2014-10-22 15:45

Pozostało 580 znaków

2014-10-22 13:41
0

Przecież jest dialog tylko pokręciłeś z jego rozmiarami i pozycją na ekranie to tego styl tylko WS_POPUP (takie okno nie ma ramki, menu ani paska tytułu) a za chwilę ustawiasz tytuł to chyba nie było zamierzone...


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2014-10-22 14:12
0
  1. Tak, tytuł moge usunąć bo chodzi mi o sam edit bez niczego ;)
  2. Jeśli chodzi o dialog modalny wyswietla mi się w prawidłowej pozycji, natomiast jest problem z pojawieniem sie na ekranie dialogu niemodalnego.

I nasuwam kolejne pytanie:
jak uzyskać wskaźniki do kontrolek w tymże dialogu? po identyfikatorach da się? Bo nie chce nic namieszać ;c

edytowany 1x, ostatnio: gswidwa, 2014-10-22 14:25

Pozostało 580 znaków

2014-10-22 16:01
0

Aby zrobić niemodalny to możesz użyć funkcji CreateDialogIndirect tylko aby był widoczny styl zrób WS_POPUP | WS_VISIBLE
Uchwyty kontrolek uzyskasz za pomocą funkcji GetDlgItem (jako drugi parametr podajesz ID kontrolki które podałeś w templatce).


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: furious programming, 2014-10-22 16:20

Pozostało 580 znaków

2014-10-23 08:44
0

Wszystkie poprzednie problemu są rozwiązane. Dziekuje wszystkim, którzy pomogli.

nastepny kłopot:
Przekierowuje komunikaty z kontrolki Edit znajdującej się w dialogu do procedury:


g_OldWndProc2 =( WNDPROC ) SetWindowLong( GetDlgItem(hwnd, ID_PULPITEDIT), GWL_WNDPROC,( LONG ) ListWndProc2 );

LRESULT CALLBACK ListWndProc2( HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam )
{
    switch( mesg )
    {
        case WM_KEYDOWN:
        {
            MessageBox(0, "enter", "", MB_OK);
            switch(LOWORD(wParam))
            {
                case VK_RETURN:{
                    MessageBox(0, "", "", MB_OK);
                    int dlugosc = GetWindowTextLength(GetDlgItem(hwnd, ID_PULPITEDIT));
                    if(dlugosc == 0)
                    {
                        SendMessage(hLista, LB_SETCURSEL, -1, 0);
                        break;
                    }
                    char *tekst = new char[dlugosc+1];
                    GetWindowText(GetDlgItem(hwnd, ID_PULPITEDIT), tekst, dlugosc+1);
                    f_DodajNumer(tekst);
                    delete tekst;
                    break;
                }
            }
        }
        break;
    }
    return CallWindowProc( g_OldWndProc2, hwnd, mesg, wParam, lParam );
}

W identyczny sposób przekierowuję komunikaty z kontrolki edit znajdującej się w głównym oknie. Problem polega na tym, że wykrywanie nacisniecia przycisku "ENTER" w polu tekstowym w dialogu mi nie działa (a w głównym oknie owszem). Natomiast działa np. wcisnięcie "CTRL" (wyświetla się MessageBox() po WM_KEYDOWN).

Podejrzewam, że może byc to spowodowane obsługą Tabu przez dialog, ale nie jestem pewien i nie wiem jak go wylączyć, bo w sumie nie jest mi ani troche potrzebny.

Aby wstawić w poście linię poziomą, daj na początku linii cztery znaki podkreślenia - ____ - spróbuj sobie; - furious programming 2014-10-23 16:00

Pozostało 580 znaków

2014-10-23 10:12

Niemożliwe coś ścieniasz jeżeli dialog nie jest modalny (czyli np. utworzony funkcją CreateDialogIndirect) to musi działać chyba ze coś poknociłeś w kodzie:

LRESULT CALLBACK EditWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_KEYDOWN: {
                         switch (LOWORD(wParam))
                         {
                         case VK_RETURN:
                             OutputDebugString(L"ENTER\n"); //To się wykonuje!
                             break;
                         }
    }
    }
    return CallWindowProc(g_OldEditProc, hwnd, msg, wParam, lParam);
}

BOOL CALLBACK DialogProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_INITDIALOG:
      g_OldEditProc = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, ID_PULPITEDIT), GWL_WNDPROC, (LONG)EditWndProc);
      return true;
        //ciach

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2014-10-23 10:31
0

@kAzek przez nieuwage pozostawiłem modalny dialog. Zmieniłem na niemodlany, dodałem flage WS_VISIBLE i smiga wszystko. Również ENTER teraz chodzi ! Dziekuje i miłego dnia. temat zamkniety.

Ehhh jeszcze jedno:

Jak mam utworzony dialog i w nim sam "Edit" jak zrobić, żeby po ShowWindow(hDialog); mozna było od razu wpisywac tekst bez klikania wpierw na edita?
Próbowałem SetFocus(hEdit); ale dzieki temu mryga kursor w edicie. Wpisywać moge dopiero po kliknięciu na niego.

Edit1:
Wychodzi na to, że chyba Edit jest aktywowany, a Dialog nie. próbowałem SW_RESTORE bo ta flaga według dokumentacji ma też aktywować okno, niestety nie dziala jak należy.

Pozostało 580 znaków

2014-10-23 12:54
0

Wywołaj SetActiveWindow(hDialog); a w procedurze Dialogu:

    case WM_ACTIVATE:
        if (wParam > 0) {
            SetFocus(hEdit);
        }
        break;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2014-10-23 13:20
0

Ewentualnie przetłumacz sobie to na C++ albo używaj konstrukcji z deklaracji tej procedury:

procedure SetDialogFocus(DialogHandle, ControlHandle : HWND);
begin
  SendMessage(DialogHandle, WM_NEXTDLGCTL, ControlHandle, 1);
end;

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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