Re[11]: сокрытие модального окна при загрузке. 2
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 13.03.02 15:19
Оценка:
Здравствуйте Игорь Вартанов,




В MFC у тебя и так вызывается CreateWindow. А проблем не было потому, что, скорее всего, главное окно не диалог было. Могу кинуть пример на АПИ и убедишься сам.

Вы писали:
ИВ>Почитал я весь thread и нахожусь в полном недоумении: сабж — это нечто вроде спортивного интереса или как? Помню, мне нужно было засунуть в трей прогу, управляющую сидюком через клаву. Диалог все-равно нужен (настройка, информация, то-се...). Побился-побился с модальником, после чего сделал через CreateDialog и message pump. Никаких проблем с кнопкой в таскбаре, морганием окна, стилями и проч. И главное! Модальность (или немодальность) его мне совершенно безразлична — я не собираюсь дисэйблить родительское окно (десктоп)
Re[11]: сокрытие модального окна при загрузке. 2
От: IT Россия linq2db.com
Дата: 13.03.02 15:28
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

ИВ>Почитал я весь thread и нахожусь в полном недоумении...


В данном случае мне нужен рабочий код и инструкция по шагам, а не советы. Самому разобраться — нет проблем, только я не хочу на это тратить больше 15 минут и ещё раз вникать в детали реализации DoModal из MFC.

И в этом смысле, решение Odi$$ey'я мне представляется наиболее привлекательным.

ShowWindow(SW_SHOWMINNOACTIVE) действительно работает безотказно, но окошко в таскбаре мне не нужно, как его можно убрать?

Так как насчёт Q&A?
Если нам не помогут, то мы тоже никого не пощадим.
Re[12]: сокрытие модального окна при загрузке. 2
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 13.03.02 20:15
Оценка: 6 (2)
Здравствуйте IT, Вы писали:

IT>И в этом смысле, решение Odi$$ey'я мне представляется наиболее привлекательным.


IT>ShowWindow(SW_SHOWMINNOACTIVE) действительно работает безотказно, но окошко в таскбаре мне не нужно, как его можно убрать?


IT>Так как насчёт Q&A?


Итак, для MFC


1. В OnInitDialog помещаем след код

  CWnd* wnd = new CWnd;
  wnd->CreateEx(0,"#32770","Hidden Window",0,0,0,0,0,0,0);
  SetParent(wnd);
  ShowWindow(SW_SHOWMINNOACTIVE);


Для прятания самого окна также подойдет код Одиссея.

2. Для Апи немного отличается. Тут окошки прячутся почемуто не до конца с
ShowWindow(SW_SHOWMINNOACTIVE); — Нужно копать создание диалога в MFC и сравнивать.

CreateWindow

 g_hiddenWnd = CreateWindow("#32770",0,0,0,0,0,0,0,0,0,0);
 g_dlgWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),g_hiddenWnd,&DialogProc);


Чтоб не показывался — убрать стиль WS_VISIBLE или Вызвать ShowWindow(SW_HIDE);

3. Для АПИ DialogBox
Подойдет все, что для CreateWindow
но Диаложек будет присутствовать в минимизированном виде на десктопе — нужно перехватить какоето сообщение (хучь таймер, хучь еще что) и сделать ShowWindow(SW_HIDE);
Re[13]: сокрытие модального окна при загрузке. 2
От: IT Россия linq2db.com
Дата: 13.03.02 20:17
Оценка:
Здравствуйте Hollander, Вы писали:

H>Итак, для MFC


Ok, а что делать, чтобы окно показать?
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: сокрытие модального окна при загрузке. 2
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 13.03.02 20:33
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Hollander, Вы писали:


H>>Итак, для MFC


IT>Ok, а что делать, чтобы окно показать?


Эта, блин, ты что, прикалываешься ?

ShowWindow(SW_SHOW)

Я не понял, тебе это надо или нет ?
А то я, блин, все отложил, чтоб это все перепроверить...
Re[15]: сокрытие модального окна при загрузке. 2
От: IT Россия linq2db.com
Дата: 13.03.02 20:50
Оценка:
Здравствуйте Hollander, Вы писали:

H>>>Итак, для MFC


IT>>Ok, а что делать, чтобы окно показать?


H>Эта, блин, ты что, прикалываешься ?




H>ShowWindow(SW_SHOW)


Я так и знал.

H>Я не понял, тебе это надо или нет ?

H> А то я, блин, все отложил, чтоб это все перепроверить...

Надо, сегодня вечером буду это дело прикручивать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: сокрытие модального окна при загрузке. 2
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.03.02 06:55
Оценка:
Здравствуйте IT, Вы писали:


H>>ShowWindow(SW_SHOW)


IT>Я так и знал.


H>>Я не понял, тебе это надо или нет ?

H>> А то я, блин, все отложил, чтоб это все перепроверить...

IT>Надо, сегодня вечером буду это дело прикручивать.


А где твое спасибо ? (участие в рейтинге то бишь)
Re[12]: сокрытие модального окна при загрузке. 2
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 15.03.02 21:06
Оценка: 3 (1)
Поправлено форматирование текста. — SchweinDeBurg

Здравствуйте Hollander, Вы писали:

H>В MFC у тебя и так вызывается CreateWindow. А проблем не было потому, что, скорее всего, главное окно не диалог было.


Продолжаю находиться в недоумении — откуда ты это взял. Во-первых, я написал ясно, что делал диалог, во-вторых, создавал я его посредством CreateDialog. Нету в MFC такого метода ни в одном классе. Следовательно писал я на API.

H>Могу кинуть пример на АПИ и убедишься сам.


Дело в том, что я именно тот Игорь Вартанов, который пишет на MFC по очень большим праздникам, предпочитая все остальное время писать на API. Примеров на API мне кидать не надо, я тебе сам могу их кинуть. Вот прям сейчас и займусь — вот полный код проги, которая запускается и садит себя в трей:

#include "stdafx.h"
#include "NotifyIcon.h"
#include "resource.h"

#pragma comment(lib, "user32")

BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static CNotifyIcon* pni = NULL;

    if( pni )
        pni->Dispatch(hDlg, msg, wParam, lParam);

    switch(msg)
    {
    case WM_INITDIALOG:
        pni = new CNotifyIcon( hDlg, IDR_NI );
        break;
    case WM_COMMAND:
        switch( wParam )
        {
        case IDOK:
        case ID_QUIT:
            SendMessage(hDlg, WM_CLOSE, 0, 0);
            break;
        case IDCANCEL:
            ShowWindow( hDlg, SW_HIDE );
            break;
        case ID_POP:
            ShowWindow( hDlg, IsWindowVisible(hDlg)? SW_HIDE : SW_SHOW );
            break;
        }
        break;
    case WM_CLOSE:
        delete pni;
        pni = NULL;
        DestroyWindow(hDlg);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hIn, HINSTANCE hPr, LPSTR szCmd, INT nShow)
{
    MSG  msg;
    HWND hWnd = CreateDialog(
                    hIn, MAKEINTRESOURCE(IDD_TRAYED_DIALOG), 
                    HWND_DESKTOP, (DLGPROC)DlgProc );
    while( GetMessage( &msg, NULL, 0, 0 ) )
    {
        
        if( IsDialogMessage( hWnd, &msg ) ) continue;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

Как видишь, никаких невидимых окон и модальных диалогов — обходимся одним диалогом, вот только немодальным.

А теперь посмотрим, как будет выглядеть данная концепция в преломлении MFC (масленица сейчас — праздник :-) ):

///////////////////////
// Trayed.h

#include "TrayedDlg.h"

class CTrayedApp : public CWinApp
{
public:
    CTrayedApp();

    //{{AFX_VIRTUAL(CTrayedApp)
    public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
    //}}AFX_VIRTUAL

    CTrayedDlg* m_pDlg;

    //{{AFX_MSG(CTrayedApp)
        // NOTE - the ClassWizard will add and remove member functions here.
        //    DO NOT EDIT what you see in these blocks of generated code !
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};


///////////////////////
// Trayed.cpp

BOOL CTrayedApp::InitInstance()
{
#ifdef _AFXDLL
    Enable3dControls();         // Call this when using MFC in a shared DLL
#else
    Enable3dControlsStatic();   // Call this when linking to MFC statically
#endif

    m_pDlg = new CTrayedDlg;
    m_pDlg->Create( CTrayedDlg::IDD );
    m_pMainWnd = m_pDlg;
    return TRUE;   // закручиваем message loop
}

int CTrayedApp::ExitInstance() 
{
    delete m_pDlg;
    return CWinApp::ExitInstance();
}

///////////////////////
// TrayedDlg.cpp

BOOL CTrayedDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);         // Set big icon
    m_pni = new CNotifyIcon( m_hWnd, IDR_NI );
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTrayedDlg::OnOK() 
{
    PostQuitMessage(0);
    CDialog::OnOK();
}

LRESULT CTrayedDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    if( m_pni ) 
        m_pni->Dispatch( m_hWnd, message, wParam, lParam );

    return CDialog::WindowProc(message, wParam, lParam);
}

void CTrayedDlg::OnPop() 
{
    ShowWindow( IsWindowVisible() ? SW_HIDE : SW_SHOW );
}

void CTrayedDlg::OnQuit() 
{
    OnOK(); 
}

Теперь покажи мне — где здесь "В MFC у тебя и так вызывается CreateWindow"?
То, что в вижуале отсутствует мастер приложения на немодальном диалоге совершенно не означает, что его нельзя сделать в принципе. И для данной задачи совершенно нет необходимости корячиться через DoModal(), о чем я и имел честь сообщить всей честной компании в предыдущем послании.
---
С уважением,
Игорь
Re[12]: сокрытие модального окна при загрузке. 2
От: Алекс Россия http://wise-orm.com
Дата: 18.03.02 08:45
Оценка:
Здравствуйте Hollander, Вы писали:

shr eax,8 — занимает 3 байта
Re[13]: сокрытие модального окна при загрузке. 2
От: Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.03.02 12:13
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

H>>Могу кинуть пример на АПИ и убедишься сам.

Я заюзал твой пример.

1. Ресурс диалога ты не привел — какие стили — скорее всего VS_VISIBLE выключен, а если включен — почему твоя прога моргать не станет ?
2. Ты не показал код, откуда шлется WM_COMMAND с ID_POP — как проверить моргание ?
3. Кнопка в таскбаре у тебя будет видна, пока виден диалог, если ты не юзаешь стиль WS_EX_TOOLWINDOW — вот для исправления этого я и юзаю невидимое окно.


ИВ>Продолжаю находиться в недоумении — откуда ты это взял. Во-первых, я написал ясно, что делал диалог, во-вторых, создавал я его посредством CreateDialog. Нету в MFC такого метода ни в одном классе. Следовательно писал я на API.


Эта функция(не совсем — CreateDialogIndirect) вызывается примерно из DoModal. Модальный диалог в MFC на самом деле немодальный, но модальность организутся вручную. Можешь заглянуть в исходники или, на худой конец, в Call Stack.


ИВ>Дело в том, что я именно тот Игорь Вартанов, который пишет на MFC по очень большим праздникам, предпочитая все остальное время писать на API. Примеров на API мне кидать не


А я тот самый Павел, который с детства писал на ассемблере, Си и, иногда, на Паскале для своих друзей. И в MSDN заглядываю тогда, когда мне влом порыться в исходниках...

Ты в примере привел примерно такой же код как и у меня, и что ты хотел этим сказать ? То что написал его на год раньше ?




ИВ> что в вижуале отсутствует мастер приложения на немодальном диалоге совершенно не означает, что его нельзя сделать в принципе.


Кудато тебя понесло не туда, причем здесь Визард ?
Немодальные диаложки — это моя страсть !
Re[13]: сокрытие модального окна при загрузке. 2
От: Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.03.02 12:21
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте Hollander, Вы писали:


А>shr eax,8 — занимает 3 байта


Это в 8086 — shr eax,8 ?
Ты не обкурился ?

... а еще в 8086 конструкция shr xxx,n заменится на n shr xxx,1
А команда DIV займет в этом случае не меньше 100 тактов (а то и 180) — исключение — если число в регистре будет много меньше делителя.
Re[14]: сокрытие модального окна при загрузке. 2
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 18.03.02 15:17
Оценка:
Здравствуйте Dutchman, Вы писали:

D> 1. Ресурс диалога ты не привел — какие стили — скорее всего VS_VISIBLE выключен, а если включен — почему твоя прога моргать не станет ?


Выключен. Не станет.

D> 2. Ты не показал код, откуда шлется WM_COMMAND с ID_POP — как проверить моргание ?


См. CNotifyIcon

D> 3. Кнопка в таскбаре у тебя будет видна, пока виден диалог, если ты не юзаешь стиль WS_EX_TOOLWINDOW — вот для исправления этого я и юзаю невидимое окно.


Это на здоровье. Я, собственно, встрял лишь чтоб помочь IT отфильтровать поток о сабже. По имеющейся у меня информации он меня услышал. Больше меня ничего не интересует.

D>Эта функция(не совсем — CreateDialogIndirect) вызывается примерно из DoModal. Модальный диалог в MFC на самом деле немодальный, но модальность организутся вручную.


Cool.

Можешь заглянуть в исходники или, на худой конец, в Call Stack.

Ладно, как-нибудь взгляну.

D>А я тот самый Павел, который с детства писал на ассемблере, Си и, иногда, на Паскале для своих друзей. И в MSDN заглядываю тогда, когда мне влом порыться в исходниках...


Ты не в пример круче меня. Поздравляю.

D>Ты в примере привел примерно такой же код как и у меня, и что ты хотел этим сказать ? То что написал его на год раньше ?


См. сабж и мой исходник. Все, что я хотел сказать, это лишь что не нужно заставлять прятаться модальный диалог.

ИВ>> что в вижуале отсутствует мастер приложения на немодальном диалоге совершенно не означает, что его нельзя сделать в принципе.


D>Кудато тебя понесло не туда, причем здесь Визард ?

D>Немодальные диаложки — это моя страсть !

No comments.
---
С уважением,
Игорь
Re[15]: сокрытие модального окна при загрузке. 2
От: Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.03.02 17:06
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:


ИВ>Дело в том, что я именно тот Игорь Вартанов, который пишет на MFC по очень большим праздникам, предпочитая все остальное время писать на API.


D>>А я тот самый Павел, который с детства писал на ассемблере, Си и, иногда, на Паскале для своих друзей. И в MSDN заглядываю тогда, когда мне влом порыться в исходниках...


ИВ>Ты не в пример круче меня. Поздравляю.


Да ладно, считается, что каждый последующий, загнувший пальцы, в два раза менее крут, чем предыдущий. Так что мне до тебя далеко, тот самый Игорь Вартанов, который пишет на АПИ и, по праздникам, на MFC.

ИВ>См. сабж и мой исходник. Все, что я хотел сказать, это лишь что не нужно заставлять прятаться модальный диалог.


Сабж начинался с MFC и там _нужно_ было прятать. Читайте внимательно. А то чз неколько дней можно мы перейдем не только на АПИ, но и на WTL, или, еще лучше, на QT(2).
Re[4]: сокрытие модального окна при загрузке.
От: kero Россия  
Дата: 20.02.08 00:22
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>что поделать, это единственный известный мне способ скрыть окно модального диалога при его запуске.

OE>Кто знает другие — расскажите, мне тоже интересно.

Ну, вот еще способ (Win API).
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: сокрытие модального окна при загрузке.
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 20.02.08 04:05
Оценка:
Здравствуйте, kero, Вы писали:

OE>>Кто знает другие — расскажите, мне тоже интересно.

K>Ну, вот еще способ (Win API).

да вроде подсказали уже самый простой — Как спрятать окно ?
Автор: SuperSmile
Дата: 11.01.05
... << RSDN@Home 1.2.0 alpha rev. 788>>
Re[6]: сокрытие модального окна при загрузке.
От: kero Россия  
Дата: 21.02.08 02:30
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, kero, Вы писали:


OE>>>Кто знает другие — расскажите, мне тоже интересно.

K>>Ну, вот еще способ (Win API).

OE>да вроде подсказали уже самый простой — Как спрятать окно ?
Автор: SuperSmile
Дата: 11.01.05


Выше я просто продублировал свой ответ в другом форуме, где ссылались на данную ветку.
Суть способа — ShowWindow(SW_HIDE) на первое WM_NCPAINT. (Кстати, заодно это и пример, когда наличие/отсутствие WS_VISIBLE в RC-файле модального DialogBox — действительно важно).
Вряд ли это сложнее подавления флага SWP_SHOWWINDOW на каждое WM_WINDOWPOSCHANGING
Впрочем, такое подавления тоже может быть применено "точечно", однако номер нужного из приходящих WM_WINDOWPOSCHANGING — не первый, и даже не постоянный.
А вообще, если исходный вопрос поставить правильно (а именно: "Когда модальный диалог начинает быть видимым?") — то решение приходит автоматически.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.