Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать диалоговое окно на основе API? Без использования ресурсных файлов. 
V
    Опции темы
KaraKum
  Дата 27.5.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Доброе время суток.
Подскажите, как создать диалоговое окно к работающей программе на основе только API функций, то есть без ресурсных файлов и, соответственно, визуального редактора окон от Visual C++?
Пробовал так, но окно так и не создаётся:
Код

WNDCLASS wc;
wc.lpfnWndProc = DialogProc;
wc.hInstance = hGlobalInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszClassName = TEXT("Dialog box");
    
RegisterClass(&wc);
CreateWindowEx(NULL, TEXT("Dialog box"), TEXT("Dialog box"), WS_VISIBLE | WS_CHILD | WS_DLGFRAME, 10, 10, 500, 500, hWnd, (HMENU)1, hInstance, NULL);

Что я делаю не так?
PM MAIL WWW   Вверх
Andrey44
Дата 27.5.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



WS_CHILD - не надо


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Rififi
Дата 27.5.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



Цитата(KaraKum @  27.5.2008,  12:58 Найти цитируемый пост)
Что я делаю не так? 

не проверяешь на наличие ошибок.
PM MAIL   Вверх
KaraKum
  Дата 27.5.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Ошибка 1407: Cannot find window class.
Почему? Ведь он создан и зарегестрирован.

P.S.: окно создаётся в WndProc() главного окна внутри кода сообщения WM_LBUTTONDOWN:...
PM MAIL WWW   Вверх
KaraKum
  Дата 27.5.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Цитата

не проверяешь на наличие ошибок. 

Проверил - помогло. Заменил "wc.style = NULL" на "wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;" и заработало без ошибок, но окно не прорисовывается - рисуется только половина верхей части рамки - что вроде этого, но выполненией родительского окна прекращается, то есть работает правильно, но почему не прорисовывается?
PM MAIL WWW   Вверх
586
Дата 27.5.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(KaraKum @  27.5.2008,  17:44 Найти цитируемый пост)
Заменил "wc.style = NULL" на "wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;" и заработало без ошибок, но окно не прорисовывается - рисуется только половина верхей части рамки - что вроде этого, но выполненией родительского окна прекращается, то есть работает правильно, но почему не прорисовывается? 

У тебя с оконной процедурой что-то не то.
PM   Вверх
KaraKum
  Дата 27.5.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Цитата

У тебя с оконной процедурой что-то не то. 

Полностью скопировал из книги Петзольда:
Код

switch (message)
{
case WM_INITDIALOG :
     return TRUE ;
          
case WM_COMMAND :
     switch (LOWORD (wParam))
     {
     case IDOK :
     case IDCANCEL :
          EndDialog (hDlg, 0) ;
          return TRUE ;
     }
     break ;
}
return FALSE ;

Всё тоже самое. И, кстати, еле-прорисованное диалоговое окно должно закрываться при нажатии Esc, но этого не делается.
Что не так?
PM MAIL WWW   Вверх
586
Дата 27.5.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Там требуется оконная процедура а не диалоговая.
Код
switch(message)
{
case WM_COMMAND:
    break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

По поводу создания диалога без использования ресурсов, посмотри описание функций CreateDialogIndirect, DialogBoxIndirect.
PM   Вверх
KaraKum
Дата 27.5.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Заработало.
Спасибо за помощь.  smile 
PM MAIL WWW   Вверх
KaraKum
  Дата 28.5.2008, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Цитата

По поводу создания диалога без использования ресурсов, посмотри описание функций CreateDialogIndirect, DialogBoxIndirect. 

Сделал так:
Код

DLGTEMPLATE dt;
dt.style = WS_CAPTION;
dt.dwExtendedStyle = NULL;
dt.cdit = 0;
dt.x = 10;
dt.y = 10;
dt.cx = 500;
dt.cy = 500;

CreateDialogIndirectParam(hGlobalInstance, &dt, hWnd, DialogProc, NULL;

Ошибка 1813: The specified image file did not contain a resource section.
Причём здесь ресурсы?
Что не так?

Это сообщение отредактировал(а) KaraKum - 28.5.2008, 09:31
PM MAIL WWW   Вверх
586
Дата 28.5.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
 /*
typedef struct {
    WORD dlgVer;
    WORD signature;
    DWORD helpID;
    DWORD exStyle;
    DWORD style;
    WORD cDlgItems;
    short x;
    short y;
    short cx;
    short cy;
    sz_Or_Ord menu;
    sz_Or_Ord windowClass;
    WCHAR title[titleLen];
    WORD pointsize;
    WORD weight;
    BYTE italic;
    BYTE charset;
    WCHAR typeface[stringLen];
} DLGTEMPLATEEX;*/

#pragma pack (push, 1)
typedef struct {
    WORD dlgVer;        // = 1
    WORD signature;     // = 0xFFFF
    DWORD helpID;       // = 0
    DWORD exStyle;      // = xxxxxxxx
    DWORD style;        // = xxxxxxxx
    WORD cDlgItems;     // = 0
    short x;            // = xxxx
    short y;            // = xxxx
    short cx;           // = xxxx
    short cy;           // = xxxx
    wchar_t menu[1];         // = 0
    wchar_t windowClass[1];  // = 0
    wchar_t title[1];
    // title
    // ...
    // ...
    WORD pointSize;     // = 0   // к этим полям по имени не обращаться!
    WORD weight;        // = 0
    BYTE italic;        // = 0
    BYTE charset;       // = 0
    wchar_t typeface[1];
} DLGTEMPLATEEX;
#pragma pack (pop)

int DialogBoxWindow(HINSTANCE hinst, LPCWSTR title, DWORD style, DWORD exstyle,
        int x, int y, int w, int h, HWND hWndParent, DLGPROC dlgProc, long initParam)
{
    DWORD size = sizeof(DLGTEMPLATEEX);
    if(title) size += wcslen(title)*2;
    DLGTEMPLATEEX *p = (DLGTEMPLATEEX*)alloca(size);
    memset(p, 0, size);
    p->dlgVer = 1;
    p->signature = 0xFFFF;
    p->exStyle = exstyle;
    p->style = style;
    p->x = x;
    p->y = y;
    p->cx = w;
    p->cy = h;

    if(title) wcscpy(p->title, title);
    else p->title[0] = 0;

    return DialogBoxIndirectParam(hinst, (DLGTEMPLATE*)p, hWndParent, dlgProc, initParam);
}

INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    switch(uMsg)
    {
    case WM_LBUTTONDOWN:
        hdc = GetDC(hWnd);
        TextOut(hdc, 5, 5, "ABCD", 4);
        ReleaseDC(hWnd, hdc);
        break;
    case WM_CLOSE: EndDialog(hWnd, 0); break;
    default: return 0;
    }
    return 1;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    DialogBoxWindow(HInstance, L"PREVED!", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 200, 200, 320, 50,
        Handle, DialogProc, 0);
}


Это сообщение отредактировал(а) 586 - 28.5.2008, 12:44
PM   Вверх
KaraKum
Дата 28.5.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Работает.
Огромное спасибо.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.