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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не работает диалог в WinMain? Проблемы с созданием диалога в WinMain. 
:(
    Опции темы
Edik
Дата 2.10.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



вот следующий код. первое окно "Enter" появляеться, потом его задержка по программе как положено, потом оно исчезает, а второе окно "My"- появиться, блымнет и быстро исчезает. что мне делать.
Код


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
     {
    HWND hDlg;
    hDlg =CreateDialog (hInstance, "Enter", 0, EnterDlgProc) ;    ShowWindow (hDlg, iCmdShow) ;
    UpdateWindow(hDlg);
    Sleep(500);
    EndDialog (hDlg, 0) ;

    hDlg = CreateDialog (hInstance, "My", 0, MyDlgProc ) ;
    ShowWindow (hDlg, iCmdShow) ;
    UpdateWindow(hDlg);

    InitCommonControls();

    return 0;
     }



PM MAIL   Вверх
neosapient
Дата 2.10.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 4



Глупая мысль, тут на днях делал диалоговое окно, в котором кроме прочих стандартных окон был прогрессбар. Так вот поскольку я не произвел инициализацию коммонконтролов, то окошко не появлялось. 
Попробуй так:
Код

#include <windows.h>
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
InitCommonControls();
// а теперь текст программы, (порядок строк может оказаться важнее)
}

надеюсь поможет

Это сообщение отредактировал(а) neosapient - 2.10.2006, 11:15
PM MAIL   Вверх
Pulse69
Дата 2.10.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

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



Ты просто показал немодальный диалог, потом программа завершилась и всё.
Используй модальные диалоги ( ф-ция DialogBox ),  или помести в WinMain цикл обработки сообщений

Код

HWND hDlg;
MSG msg;
while( GetMessage( &msg, 0,0,0 ) )
{
   if(! IsDialogMessage( hDlg, &msg) )
  {
     TranslateMessage( &msg );
      DispatchMessage( &msg );
  }
}

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
neosapient
Дата 2.10.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 4



Люди, мой глюк - почему диалог не закрывается.
Собственно не хочу создавать окно через CreateWindow, а хочу подгрузить диалог из ресурсов. 
Сделать такой простой пример - типа "Hello, World" -  в котором есть весь минимальный каркас обработки сообщений и ничего лишнего.

Код

#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")
#define MAX_LOADSTRING 100

HINSTANCE hInst;    
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_ANALYSHDD, szWindowClass, MAX_LOADSTRING);

    InitCommonControls();

    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_ANALYSHDD);
    
    HWND hDlg = CreateDialog(hInst, (LPCTSTR)IDD_DIALOG1, NULL, (DLGPROC)AnalysHDD);
    ShowWindow(hDlg,SW_SHOW);

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (IsDialogMessage( hDlg, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    
    return (int) msg.wParam;
}

LRESULT CALLBACK AnalysHDD(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        if(LOWORD(wParam)== IDM_EXIT)
        {
            DestroyWindow(hDlg);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return FALSE;
}


Собственно исправьте все, что можно.
Особенно обратить внимание на то, что при нажатии на крестик в правом верхнем углу, окно зарывается, а процесс нет.
PM MAIL   Вверх
Gwendolen
Дата 2.10.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Смотри мой пример на http://forum.vingrad.ru/index.php?showtopic=112618
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
neosapient
Дата 3.10.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 4



Gwendolen, спасибо за ответ...
Иными словами когда создаешь не модальный диалог надо создавать структуру класа окна которого никогда не будет   smile . Единственное, что надо операционке от этой структуры - это указатель на CALLBACK функцию, которая как решето пропускает все кроме сообщения WM_DESTROY. Эта функция неявно используется в цикле обработки сообщений. А далее функциональная часть - создаем не модальный диалог с помощью CreateDialog, и передаем ему в параметры CALLBACK функцию, в  которой расположена вся функциональная часть (извеняюсь за тавтологию). А в цикле обработки сообщений ставишь фильтр из IsDialogMessage, который перенаправляет все сообщения из первой CALLBACK-заглушки, во вторую функциональную CALLBACK процедуру.

Надеюсь я правильно разобрался. 
А теперь бонусный вопрос - зачем так усложнять жизнь созданием не используемого класса для родительского окна, которое никогда не появиться и у которого есть единственный дочерний диало? И зачем делать функцию заглушку для родительского класса, если поток сообщений мы "льем на мельницу" функции обработки дочернего диалога?

А что если при регистрации класса родительского окна, там зарегистрировать в качестве функции обработки сообщений колбек от единственного дочернего диалога? Надо будет попробовать... Коректно ли оно будет работать и закраваться.

Вот с модальным диалогом все вроде логичнее (
Код

#include <windows.h>
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

// Global Variables:
HINSTANCE hInst;
szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];

LRESULT CALLBACK ExampleProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDCANCEL:
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        case IDC_BUTTON:
            ;
            break;
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return FALSE;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    HACCEL hAccelTable;

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_EXAMPLE, szWindowClass, MAX_LOADSTRING);

    InitCommonControls();

    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_EXAMPLE);
    
    return    DialogBox(hInst, (LPCTSTR)IDD_EXAMPLEDIALOG, NULL, (DLGPROC)ExampleProc);
}



Это сообщение отредактировал(а) neosapient - 3.10.2006, 11:58
PM MAIL   Вверх
Gwendolen
Дата 3.10.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(neosapient @  3.10.2006,  11:54 Найти цитируемый пост)
Вот с модальным диалогом все вроде логичнее

Согласен, для простых случаев сгодится (открыл, чтото сделал быстро закрыл), но у тебя нет цикла сбора сообщений
Код

while( GetMessage( &msg, 0,0,0 ) )
{
     TranslateMessage( &msg );
      DispatchMessage( &msg );

Возможны проблемы с получением сообщений.

У меня было приведено два примера (в одном исходнике и не работают одновременно) не модальных ГЛАВНЫХ окон. Вот пример главного окна без класса:

"rc.rc"
Код

1000 DIALOGEX 6,6,194,102
CAPTION "FORM"
FONT 8,"MS Sans Serif"
STYLE 0x10CF0000
EXSTYLE 0x00000000
BEGIN
  CONTROL "BOTTON",1001,"Button",0x50010000,38,16,114,63,0x00000000
END

"main.c"
Код

#include <windows.h>

BOOL CALLBACK MainDlgProc( HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam )
  {
     switch( msg )
      {
         case WM_DESTROY :
             PostQuitMessage(0);
             return TRUE;
         break;
         case WM_SYSCOMMAND:
            if (wParam == SC_CLOSE)
              {
                 //EndDialog(wnd, 0);
                 //PostQuitMessage(0);
                 DestroyWindow(wnd);
                 return TRUE;
              }
         break;
      }
     return FALSE;
  } 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
     MSG msg;    
     HWND MainWnd;
     
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, MainDlgProc);
     ShowWindow(MainWnd, SW_SHOW );
     
     while (GetMessage(&msg,0,0,0) )
        {
         if (MainWnd!=0)
            {
             if (IsDialogMessage(MainWnd, &msg))
               {continue;}
            }
         TranslateMessage(&msg);
         DispatchMessage(&msg);
        }
     return msg.wParam;
  }

А теперь пример главного окна с классом:

"rc.rc"
Код

1000 DIALOGEX 6,6,194,102
CAPTION "FORM"
CLASS "MY_EXCLUSIVE_CLASS"
FONT 8,"MS Sans Serif"
STYLE 0x10CF0000
EXSTYLE 0x00000000
BEGIN
  CONTROL "BOTTON",1001,"Button",0x50010000,38,16,114,63,0x00000000
END

"main.c"
Код

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
  {
      switch( msg )
      {
         case WM_DESTROY :
             PostQuitMessage(0);
             return 0;
         break;     
      }    
      return DefWindowProc(wnd,msg,wParam,lParam);
  }    

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
     MSG msg;    
     HWND MainWnd;
     WNDCLASSEXA wc;
     
     wc.cbSize = sizeof(WNDCLASSEXA);
     wc.style = CS_HREDRAW | CS_VREDRAW;
     wc.lpfnWndProc = (WNDPROC)WindowProc;
     wc.cbClsExtra = 0;
     wc.cbWndExtra = DLGWINDOWEXTRA;
     wc.hInstance = hInstance;
     wc.hIcon = LoadIcon(NULL, IDI_QUESTION);
     wc.hCursor = LoadCursor(NULL,IDC_ARROW);
     wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
     wc.lpszMenuName = NULL;
     wc.lpszClassName = "MY_EXCLUSIVE_CLASS";
     wc.hIconSm = NULL;
     
     RegisterClassEx(&wc);
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, NULL);
     ShowWindow(MainWnd, SW_SHOW );

     
     
     while (GetMessage(&msg,0,0,0) )
        {
         if (MainWnd!=0)
            {
             if (IsDialogMessage(MainWnd, &msg))
               {continue;}
            }
         TranslateMessage(&msg);
         DispatchMessage(&msg);
        }
     return msg.wParam;
  }


Обрати внимание на различие LRESULT CALLBACK WindowProc и BOOL CALLBACK MainDlgProc. 
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
Gwendolen
Дата 4.10.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(neosapient @  3.10.2006,  11:54 Найти цитируемый пост)
Вот с модальным диалогом все вроде логичнее

Согласен, для простых случаев сгодится (открыл, чтото сделал быстро закрыл), но у тебя нет цикла сбора сообщений
Код

while( GetMessage( &msg, 0,0,0 ) )
{
     TranslateMessage( &msg );
      DispatchMessage( &msg );

Возможны проблемы с получением сообщений.

У меня было приведено два примера (в одном исходнике и не работают одновременно) не
PM MAIL   Вверх
Edik
Дата 11.10.2006, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



ребятя- че это вы тут залезли ко мне, обсуждаете левые темы? может вам еще кофе сделать? smile  smile  smile  smile  smile 
PM MAIL   Вверх
neosapient
Дата 11.10.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 4



Извени, сначала темы были правыми  smile , затем очень правыми  smile , потом супер правыми smile  , ну и наконец занесло и развернуло на 180 градусов  smile .
А вообще закрывай эту ветку форума,.. Я ... более мение разобрался.
Сорри за оффтоп.

[off topic]
Э, идея.
Обращение к разработчикам форума:
Во есть кнопка "КОД", кнопка полезная. Сделайте кнопку "ОФФТОП". Текст помещеный между тегами будет либо отображаться, либо нет. Чтоб любой посетитель мог просматривать ветку форума определить нужны ему оффтопы или нет. А те кто пишут , должны сами решать что оффтоп а что нет.
И если мое предложение примут к рассмотрению, то надо бы просеять содержимое всего форума.
[/off topic]
PM MAIL   Вверх
Edik
Дата 23.10.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



не мне понравилось- можете писать дальше smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0911 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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