Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters
Register

Reply
 
LinkBack Thread Tools
Old 08.08.2003, 12:11   #1
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default невидимый модальный диалог

как его добиться? т.е. чтобы я его запускал по CDialog:: DoModal, а он не был виден на экране. не надо удивляться, зачем мне такое надо. просто посоветуйте как
спасибо
Reply With Quote
Old 08.08.2003, 12:54   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

я override - нул WM_PAINT в своем диалоге и вызвал там ShowWindow(SW_HIDE). Больше я этот диалог не видел...
Reply With Quote
Old 08.08.2003, 13:01   #3
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

если ты используешь .net то тебе нечего делать просто надо поставить стиль Transparent = TRUE ... и дело с концом )
Reply With Quote
Old 08.08.2003, 13:03   #4
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally posted by Agregat
я override - нул WM_PAINT в своем диалоге и вызвал там ShowWindow(SW_HIDE). Больше я этот диалог не видел...
looooooool, класс
ладно, уточню вопрос: как отложить его появление до того момента, когда я сам это закажу (но он должен существовать, т. е. иметь валидный описатель, с самого начала. и должен быть модальным).
Reply With Quote
Old 08.08.2003, 13:04   #5
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

Quote:
Originally posted by Agregat
я override - нул WM_PAINT в своем диалоге и вызвал там ShowWindow(SW_HIDE). Больше я этот диалог не видел...

не думаю что еффект модал-а может быть получен таким путем ... хотя можно попробовать ...
Reply With Quote
Old 08.08.2003, 13:05   #6
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally posted by spawn
если ты используешь .net то тебе нечего делать просто надо поставить стиль Transparent = TRUE ... и дело с концом )
пишу под обычный mfc. кстати, а такая прозрачность разве не отнесется только к диалогу, оставив его элементы видимыми?
Reply With Quote
Old 08.08.2003, 13:08   #7
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

делаешь так.

PHP Code:
CTestDlg::OnPaint()
{
    
CPaintDC dc(this); // device context for painting
                
if (m_bNotToShow)
         
ShowWindow(SW_HIDE);

А вот как ты его будешь показывать, когда тебе это понадобится - это уже сам решай
1. сделать здесь else ShowWindow(SW_SHOW), а откуда-то изменить эту переменную.
2. Изменить эту переменную где-то снаружи/другой функции и вызвать там же ShowWindow(SW_SHOW).

Да, в конструкторе или в переезднутой функции DoModal()
m_bNotToShow = true;

вот...
Reply With Quote
Old 08.08.2003, 13:09   #8
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

Quote:
пишу под обычный mfc. кстати, а такая прозрачность разве не отнесется только к диалогу, оставив его элементы видимыми?
нет ... прозрачным становиться все ...

если под простой mfc то щас посмотрим ...
Reply With Quote
Old 08.08.2003, 13:15   #9
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Quote:
не думаю что еффект модал-а может быть получен таким путем ... хотя можно попробовать ...
не, вроде выходит... кроме одной вещи - он реагирует на нажатие клавиш, но это тоже можно с помощью PreTranslateMessage отловить и обработать.
Reply With Quote
Old 08.08.2003, 13:20   #10
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

да ... интересный результат ... )

если в OnPaint написать ShowWindow(SW_HIDE) получается вот что ...

диалог при каждой перерисовке ... т.е. также после WM_ACTIVATE получает WN_PAINT и пытается перерисоваться ... так как он модальный то при каждом Hide, Show, MouseClick и т.д. он будет пытаться перерисоваться ... а значит он зациклиться и в результате Not Responding ... )

да я прав ... нифига ... никаких отзывов ... со стороны программы ...

все таки думаю тебе следует попробовать не hide-нуть диалог а сделать его Transparent... не помню как это делалось в mfc ... но кажется через CPaintDC это можно устроить ... будет время попробую ...
Reply With Quote
Old 08.08.2003, 13:25   #11
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

PHP Code:

MFC Library Reference   

CWnd
::ModifyStyleExSee Also

CWnd Overview 
| Class Members Hierarchy Chart CWnd::ModifyStyle CreateWindowEx

Call this member 
function to modify a window's extended style.

BOOL ModifyStyleEx(
   DWORD dwRemove,
   DWORD dwAdd,
   UINT nFlags = 0 
);

Parameters
dwRemove 
Specifies extended styles to be removed during style modification. 
dwAdd 
Specifies extended styles to be added during style modification. 
nFlags 
Flags to be passed to SetWindowPos, or zero if SetWindowPos should not be called. The default is zero. See the Remarks section for a list of preset flags. 
Return Value
Nonzero if style was successfully modified; otherwise, 0.

Remarks
Styles to be added or removed can be combined by using the bitwise OR (|) operator. See the topics Extended Window Styles in this book and CreateWindowEx in the Platform SDK for information about the available extended styles

If nFlags is nonzero, ModifyStyleEx calls the Windows API function SetWindowPos and redraws the window by combining nFlags with the following four preset flags: 

SWP_NOSIZE   Retains the current size. 
SWP_NOMOVE   Retains the current position. 
SWP_NOZORDER   Retains the current Z order. 
SWP_NOACTIVATE   Does not activate the window. 
To modify windows using regular window styles, see ModifyStyle.

Example
// This example would make the dialog box transparent by
// changing the dialog window'
s extended styles.

int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct
{
   if (
CDialog::OnCreate(lpCreateStruct) == -1)
      return -
1;
   
   
ModifyStyleEx(0WS_EX_TRANSPARENT);   
   
   return 
0;
}
See Also
CWnd Overview 
| Class Members Hierarchy Chart CWnd::ModifyStyle CreateWindowEx



--------------------------------------------------------------------------------

Send feedback to Microsoft

© 2001 Microsoft Corporation
All rights reserved
намного легче )
Reply With Quote
Old 08.08.2003, 13:36   #12
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

у меня подобной проблемы не возникло
Я как сделал. У меня диалог аппликасьон. В нем сделан еще один диалог, который собственно и запускается через DoModal(). Метод pаint запускается всего один раз... вот...


следующий код прекрасно работает... правда я не знаю подходит ли он для нужных целей... Через 10 секунд окно появляется и работает как надо
PHP Code:
static UINT MyControllingFunctionLPVOID pParam)
{
    
CTestDlg pDlg = (CTestDlg *) pParam;
    
Sleep(10000);
    
pDlg->m_bShow false;
    
pDlg->ShowWindow(SW_SHOW);    
    return 
0;
}
void CTestDlg::OnPaint() 

{
    
CPaintDC dc(this); // device context for painting
    
if (m_bShow)
    {
        
ShowWindow(SW_HIDE);
        
AfxBeginThread(MyControllingFunctionthis0000);
    } 
Reply With Quote
Old 08.08.2003, 13:41   #13
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Извиняюсь покорно, сэр, но ваш код не сработал. По крайней мере на моем vc6 с вынь2000 картинка прилагается
Reply With Quote
Old 08.08.2003, 13:43   #14
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

сори моя ошибка ...

но все таки я б предпочел сделать диалог невидимым а не hide-ать его ... не знаю почему но мне не нравиться вариант ShowWindow(SW_HIDE) в OnPaint ... сори ...
Reply With Quote
Old 08.08.2003, 13:45   #15
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

Quote:
Originally posted by Agregat
Извиняюсь покорно, сэр, но ваш код не сработал. По крайней мере на моем vc6 с вынь2000 картинка прилагается
PHP Code:
static UINT MyControllingFunctionLPVOID pParam)
{
    
CTestDlg pDlg = (CTestDlg *) pParam;
    
Sleep(10000);
    
pDlg->m_bShow false;
    
pDlg->RedrawWindow();    
    return 
0;
}
void CTestDlg::OnPaint() 

{
    
CPaintDC dc(this); // device context for painting
    
if (m_bShow)
    {
        
ShowWindow(SW_HIDE);
        
AfxBeginThread(MyControllingFunctionthis0000);
    } 
видимо не все скопировалось

PHP Code:
    else
    {
          
ShowWindow(SW_SHOW);
    }

как минимум
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 05:26.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.