Dlaczego dialog tworzony w WinAPI nie pojawia się?

0

hejka. Możecie mnie naprowadzić, dlaczego po wykonaniu owego kodu nie pojawia mi się dialog?

 
/// DIALOGI
void PixelsToDialogUnits( RECT & rc );
BOOL CALLBACK Procedura_DodajGracza( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam );
void f_CreateDialog();

///======================================
HGLOBAL hgbl;
DLGTEMPLATE * pdt;
DLGITEMTEMPLATE * pdit;
WORD * pw;
LPWSTR pws;
int nchar;

void PixelsToDialogUnits( RECT & rc ){
    LONG base = GetDialogBaseUnits();
    int baseX = LOWORD( base );
    int baseY = HIWORD( base );

    rc.left = MulDiv( rc.left, 4, baseX );
    rc.right = MulDiv( rc.right, 4, baseX );
    rc.top = MulDiv( rc.top, 8, baseY );
    rc.bottom = MulDiv( rc.bottom, 8, baseY );
}
WORD * lpwAlign( WORD * in ){
    ULONG_PTR ul =( ULONG_PTR ) in;
    ul += 3;
    ul >>= 2;
    ul <<= 2;
    return( WORD * ) ul;
}
///======================================

BOOL CALLBACK Procedura_DodajGracza( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ){
    switch( Msg )
    {
        case WM_INITDIALOG:
        {
        }
        break;
        case WM_COMMAND:
        {
        }
        break;
        default: return FALSE;
    }
    return TRUE;
}
void f_CreateDialog(){
    GlobalUnlock( hgbl );
    DialogBoxIndirect( *hInstance,( DLGTEMPLATE * ) hgbl, hwnd,( DLGPROC ) Procedura_DodajGracza );
    GlobalFree( hgbl );
}
  1. main.cpp - tworzenie dialogu
 
        hgbl = GlobalAlloc( GMEM_ZEROINIT, 1024 );
        pdt =( DLGTEMPLATE * ) GlobalLock( hgbl );

        pdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
        pdt->cdit = 2;

        RECT rcDlg = { 10, 10, 200, 150 };
        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 Gracza", - 1, pws, 50 );
        pw += nchar;

        pw = lpwAlign( pw );
        pdit =( DLGITEMTEMPLATE * ) pw;
        ///--------------------------------------------------------------------------------------
        RECT rcBtn = { 50, 100, 100, 25 };
        PixelsToDialogUnits( rcBtn );

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

        pdit->id = IDOK;
        pdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;

        pw =( WORD * )( pdit + 1 );
        * pw++ = 0xffff;
        * pw++ = 0x0080; // przycisk

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

        ///----------------------------------------------------------------------------

        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
0

wywal wszystko co nie potrzebne i daj kod taki, by nadawał się do skompilowania i uruchomienia.

nie twórz template'a dialogu w ten sposób. albo zrób go po ludzku, w pliku .rc, albo daj pusty template a kontrolki dodawaj przez CreateWindow.

0

Najczęstszą przyczyną w tak tworzonych dialogach są błędne wyrównania, upewnij się, że WSZYSTKO co ma być wyrównane - jest wyrównane do poprawnych wartości.

0

W pliku rc. byłoby super prosto, ale codeblock nie ma chyba kompilatora plikow rc. Próbowałem też za pomocą resedit, ale nie bardzo wiem jak dołączyć plik do projektu.

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