Member 13927859 Ответов: 2

Интерфейс входа в систему :от диалогового окна к главному окну


Привет , я пытаюсь получить доступ к главному окну из диалогового окна, которое является интерфейсом входа в систему.
Мой сценарий состоит в том ,чтобы проверить правильность psw, а затем он показывает оконную раму (SDI) (если PSW верен), нажав на клавиатуру "Enter" (а не кнопку OK).
Я буду работать с диалоговым окном и SDI .
Моя проблема заключается в том , как специально установить условие доступа, я работаю с двумя разными областями.
В моем диалоговом окне входа в систему мой код выглядит следующим образом :

Что я уже пробовал:

void CLoginDlg::OnLogin()
{
	UpdateData(TRUE);
	CWnd* pwndCtrl = GetFocus();

	int ctrl_ID = pwndCtrl->GetDlgCtrlID();
	CLoginDlg LoginDlg;
	switch (ctrl_ID)
	{
	case IDC_EDIT_PSW:
		UpdateData(TRUE);
		BOOL Access=FALSE ;
		if (m_Login == "123") // password
		{
			//AfxMessageBox(_T("Successful Login")); 
			return ;
		}
		else
		Access = false;
	//case IDOK :
	//OnOK();
	UpdateData(FALSE);

Member 13927859

затем в IntClient.cpp :

Jochen Arndt

Распространенным сценарием было бы отображение диалогового окна из InitInstance() перед созданием и отображением основного фрейма. Если диалоговое окно не возвращает IDOK, вернитесь из InitInstance() с FALSE, чтобы завершить работу приложения.

Ваш показанный код на самом деле не имеет смысла. Такой диалог входа в систему обычно имеет и поле ввода, и кнопки OK и Cancel. Переопределите обработчик OK по умолчанию. Внутри обработчика выполните проверку, прочитав текст поля ввода. Если это действительно, вызовите CDialog::OnOK() и вернитесь. В противном случае просто вернитесь без вызова CDialog::OnOK() или необязательно (например, после определенного количества попыток) вызовите CDialog::OnCancel().

Member 13927859

то , что я прошу , заключается в том, что даже psw неверен, я могу получить доступ к главному окну . как я могу установить psw в качестве ключа для доступа или отмены главного окна?
Ниже приведен код, который я написал в InitInstance.

KarstenK

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

2 Ответов

Рейтинг:
2

Member 13927859

Я пытаюсь с этим кодом , но также могу получить доступ ко второму интерфейсу с неправильным PSW.


void CLoginDlg::OnLogin()
{
	UpdateData(TRUE);
	CWnd* pwndCtrl = GetFocus();

	int ctrl_ID = pwndCtrl->GetDlgCtrlID();
	CLoginDlg LoginDlg;
	switch (ctrl_ID)
	{
	case IDC_EDIT_PSW:
		UpdateData(TRUE);
		BOOL Access=FALSE ;
		if (m_Login == "123") // password
		{
			AfxMessageBox(_T("Successful Login"));
			
			CDialog::OnOK();
			return;
		}
		else
			CDialog::OnCancel();
	//case IDOK :
	//OnOK();
	UpdateData(FALSE);


Рейтинг:
1

Member 13927859

BOOL CIntClientApp::InitInstance()
{
	// InitCommonControlsEx() est requis sur Windows XP si le manifeste de l'application
	// spécifie l'utilisation de ComCtl32.dll version 6 ou ultérieure pour activer les
	// styles visuels.  Dans le cas contraire, la création de fenêtres échouera.
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// À définir pour inclure toutes les classes de contrôles communs à utiliser
	// dans votre application.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinAppEx::InitInstance();


	// Initialiser les bibliothèques OLE
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}

	AfxEnableControlContainer();

	EnableTaskbarInteraction(FALSE);
	SetRegistryKey(_T("Applications locales générées par AppWizard"));
	LoadStdProfileSettings(4);  // Charge les options de fichier INI standard (y compris les derniers fichiers utilisés)


	InitContextMenuManager();

	InitKeyboardManager();

	InitTooltipManager();
	CMFCToolTipInfo ttParams;
	ttParams.m_bVislManagerTheme = TRUE;
	theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
		RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);

	// Inscrire les modèles de document de l'application.  Ces modèles
	//  lient les documents, fenêtres frame et vues entre eux
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CIntClientDoc),
		RUNTIME_CLASS(CMainFrame),       // fenêtre frame SDI principale
		RUNTIME_CLASS(CIntClientView));
	  //  RUNTIME_CLASS(CFormView);
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);
	//Affichage de la boite de dialogue "Login"
	CLoginDlg Dlg;
	Dlg.DoModal();
	//BOOL Access= FALSE;
	//if (Dlg.DoModal() == IDOK )//&& Access==TRUE)
	//{

	// Analyser la ligne de commande pour les commandes shell standard, DDE, ouverture de fichiers
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	// Commandes de dispatch spécifiées sur la ligne de commande.  Retournent FALSE si
	// l'application a été lancée avec /RegServer, /Register, /Unregserver ou /Unregister.
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
	// The main window has been initialized, so show and update it
		m_pMainWnd->ShowWindow(SW_SHOW);
	    m_pMainWnd->MoveWindow(400, 50, 1000, 800);
	    m_pMainWnd->UpdateWindow();
	
	//}
	return TRUE;
}


Afzaal Ahmad Zeeshan

Решает ли это проблему? Или это дополнительный код для поддержки вашего вопроса?

Richard MacCutchan

Вам нужно установить значение внутри вашего объекта CDialog, чтобы указать, что приложение должно делать по возвращении из DoModal.