Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание шаблона диалога в памяти

38K
28 октября 2008 года
AntonGr
3 / / 09.06.2008
Здравствуйте. Изучаю тему создания шаблона диалога в памяти. Принцип вроде понял, однако при написании функции на основе примера из MSDN при количестве элементов на диалоге больше 1 (переменная nItemCount) функция DialogBoxIndirect возвращает -1, а GetLastError 0.

Код:
static int nItemCount = 2;

HINSTANCE hInstance;

int CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_COMMAND:
        if(LOWORD(wParam)==IDCANCEL)
        {
            EndDialog(hwndDlg, (INT_PTR)0);
            PostQuitMessage(0);
            return TRUE;
        }
        if(LOWORD(wParam)==ID_ELSE)
        {
            MessageBox(hwndDlg, TEXT("test"), TEXT("test1"), MB_OK);
            return TRUE;
        }
        break;
    }
    return FALSE;
}

LPWORD lpwAlign(LPWORD lpIn)
{
    DWORD ul;
    ul = (DWORD)lpIn;
    ul +=3;
    ul >>=2;
    ul <<=2;
    return (LPWORD)ul;
}

INT_PTR fCreateDlg(HINSTANCE hInstance, BOOL bFirstStart)
{
    HGLOBAL hgbl;
    LPDLGTEMPLATE lpdt;
    LPDLGITEMTEMPLATE lpdit;
    LPWORD lpw;
    LPWSTR lpwsz;
    INT_PTR ret;
    int nchar;
   
    hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
    if (!hgbl)
        return -1;
   
    lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
   
   

    switch(bFirstStart)
    {
    case TRUE:

        // Определение диалогового окна
        lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION | DS_SETFONT | DS_CENTER;
        lpdt->x = 0; lpdt->y = 0;
        lpdt->cdit = nItemCount; // число элементов управления
        lpdt->cx = 100; lpdt->cy = 100;
        lpw = (LPWORD) (lpdt + 1);
        *lpw++ = 0; // меню нет
        *lpw++ = 0; // класс предопределенного диалогового окна (по умолчанию)
        lpwsz = (LPWSTR) lpw;
        //nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "Shelf Calculator", -1, lpwsz, 50);
        lpw += MultiByteToWideChar (CP_ACP, 0, "Shelf Calculator", -1, lpwsz, 50);
        lpw = lpwAlign(lpw);
        *lpw++ = 0x0008;
        lpwsz = (LPWSTR) lpw;
        lpw += MultiByteToWideChar (CP_ACP, 0, "Tahoma", -1, lpwsz, 50);
        // END Определение диалогового окна.

        break;

    case FALSE:
        break;
    }
   
    // Определение кнопки "еще"
    lpw = lpwAlign (lpw); // выравнивание DLGITEMTEMPLATE по границе DWORD
    lpdit = (LPDLGITEMTEMPLATE) lpw;
    lpdit->x = 3; lpdit->y = 3;
    lpdit->cx = 50; lpdit->cy = 14;
    lpdit->id = ID_ELSE; // идентификатор кнопки
    lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
    lpw = (LPWORD) (lpdit + 1);
    *lpw++ = 0xFFFF;
    *lpw++ = 0x0080; // класс кнопки
    lpwsz = (LPWSTR) lpw;
    lpw += MultiByteToWideChar (CP_ACP, 0, "Еще", -1, lpwsz, 50);
    lpw = lpwAlign (lpw); // выравнивание созданных данных по границе DWORD
    *lpw++ = 0x0000; // созданных данных нет
    // END Определение кнопки OK

    // определение надписи "Кол-во жил"
    lpw = lpwAlign (lpw); // выравнивание DLGITEMTEMPLATE по границе DWORD
    lpdit = (LPDLGITEMTEMPLATE) lpw;
    lpdit->x = 3; lpdit->y = 20;
    lpdit->cx = 50; lpdit->cy = 14;
    lpdit->id = ID_VEIN_S; // идентификатор текста
    lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
    lpw = (LPWORD) (lpdit + 1);
    *lpw++ = 0xFFFF;
    *lpw++ = 0x0082; // класс статического элемента
    lpwsz = (LPWSTR) lpw;
    lpw += MultiByteToWideChar (CP_ACP, 0, "Help", -1, lpwsz, 50);
    lpw = lpwAlign (lpw); // выравнивание созданных данных по границе DWORD
    *lpw++ = 0x0000; // созданных данных нет
    // END определение надписи "Кол-во жил"
   
    GlobalUnlock(hgbl);
    ret = DialogBoxIndirect(hInstance, (LPDLGTEMPLATE)hgbl, NULL, (DLGPROC)DialogProc);
    DWORD test = GetLastError();
    GlobalFree(hgbl);
    return ret;
}
38K
28 октября 2008 года
AntonGr
3 / / 09.06.2008
Спасибо за ответ. Проблема была в том, что внутри инициализации каждого элемента диалога производилось дополнительное выравнивание по границам DWORD. По DWORD выравнивается только шаблон самого элемента, а остальные параметры только по WORD.

Тема закрыта
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог