2014-11-18 2 views
1

Может ли кто-нибудь помочь мне в создании скрытого окна, расширив класс CWnd. Я новичок в программировании Windows. Я попытался создать его, но проблема в том, что код разбивается при попытке зарегистрировать класс окна или создать окно.Как создать скрытое окно, расширяя класс CWnd в visual C++

class HiddenWindow : public CWnd 
{ 
public: 
    HiddenWindow(); 
    ~HiddenWindow(); 
protected: 
    afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam); 
    DECLARE_MESSAGE_MAP() 

}; 
This is my .cpp file 

HiddenWindow::HiddenWindow() 
{ 
    CString wcn = ::AfxRegisterWndClass(NULL);//code fails here because of AfxGetInstanceHandle() 
    BOOL created = this->CreateEx(0, wcn, _T("YourHiddenWindowClass"), 0, 0, 0, 0, NULL,HWND_MESSAGE,0); 
} 


HiddenWindow::~HiddenWindow() 
{ 
} 

BEGIN_MESSAGE_MAP(HiddenWindow, CWnd) 
ON_MESSAGE(WM_USER + 1, DoNOOP) 
END_MESSAGE_MAP() 

LRESULT HiddenWindow::DoNOOP(WPARAM wParam, LPARAM lParam) 
{ 
    AfxMessageBox(_T("Test")); 
    return LRESULT(true); 
} 
+1

Создание скрытого окна, как правило, просто не отображает его в первую очередь (например, не вызывая 'ShowWindow'). Пожалуйста, покажите код, если у вас есть особые проблемы. –

+0

@JonathanPotter: привет Джонатан, я отправил свой код, который я пробовал, он терпит неудачу в AfxRegisterWndClass (NULL), потому что он внутренне утверждается. – Juseeth

+0

Скажите, вы получили ASSERT! – xMRi

ответ

1

Я делал это в MFC с помощью переопределения Создать конструктор является слишком рано Try:

BOOL HiddenWindow::Create() 
{ 
    if (!CWnd::CreateEx(0, AfxRegisterWndClass(0), 
     _T("HiddenWindow Notification Sink"), 
     WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL)) 
    { 
     TRACE0("Warning: unable to create HiddenWindow window!\n"); 
     return FALSE; 
    } 
    return TRUE; 
} 
+0

@ Kjell Gunnar: моя проблема заключалась в том, что настройки моей визуальной студии были неправильными, я смог ее решить, создав новый проект MFC. – Juseeth

+0

@suj рад услышать вашу проблему! Однако вы не должны делать то, что может произойти в конструкторе, потому что нет способа вернуть плохой статус. –

+0

Это очень неправильный совет, Kjell: конструктор может выйти из строя и сообщить об ошибке, выбросив исключение. Любая система, следующая за идиомой RAII, будет иметь класс с металическими конструкторами. – IInspectable

0

вы не

«расширение класса CWnd»

Вы используете C++ не C# , следовательно, вы находитесь , производя класс.

Вам не обязательно делать это, если вам нужны базовые функции. Просто вызовите созданные стили окон, которые вам нужны, без WS_VISIBLE, как и вы. Однако вы должны предоставить класс окна в качестве аргумента, поскольку ваше окно не является дочерним окном.

Если вам нужно обрабатывать сообщения или выполнять различные по умолчанию поведения, вы должны получить собственный класс, но все же вам не нужно переопределять элемент Create.

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