000
19.09.2005, 22:09 Uhr
azag1
|
Hallo Liebe Forumgemeinde!
Ich habe in .Net 2003 eine Dialogbasierte Anwendung. Ich habe einen Hauptdialog der über die App mit DoModal aufgerufen wird und einen Unterdialog, der jedoch Nicht Modal ist, also über ->Create aufgerufen wird. Nun habe ich den Dialog als Childwindow deklariert (WS_CHILD) damit er nicht über den anderen Dialog beim minimieren herausragt, sondern mit abgeschnitten wird. Dies funktioniert auch soweit, jedoch ist der Dialog irgendwie disabled. ->EnableWindow(TRUE) hilft da auch nicht weiter. Man kann den Dialog bedienen, Buttons und Checkboxen funktionieren, aber z.B. eine EditBox funktioniert nicht, man kann dort nicht hereinschreiben und die Titelleiste ist grau hinterlegt, anstatt blau (bei einem aktiven Dialog). Setzte ich in den Eigenschaften die Titelleiste auf False und Übergeordnetes Steruerelement ebenfalls auf False, läuft auch die Editbox, jedoch kann ich logischerweise das Fenster nicht mehr bewegen, und das sollte nicht sein.
Woran mag das liegen, hab schon alle möglichen Einstellungen im Dialog ausprobiert, aber nichts half.
Ich würde mich freuen, wenn Ihr mir weiterhelfen könntet. Vielen Dank schonmal im Voraus.
Gruß,
Adam.
Anbei noch mein Quelllcode und ein Auszug aus der Ressource-Datei:
Header Hauptdialog:
| C++: |
// NonModalDlg.h : Headerdatei //
#pragma once #include "NonModal1.h"
// CNonModalDlg Dialogfeld class CNonModalDlg : public CDialog { // Konstruktion public: CNonModalDlg(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CNonModalDlg(); // Dialogfelddaten enum { IDD = IDD_NONMODAL_DIALOG };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
// Implementierung protected: HICON m_hIcon;
// Generierte Funktionen für die Meldungstabellen virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() private: CNonModal1* m_pCNonModalDlg; public: afx_msg void OnBnClickedOk(); };
|
cpp Hauptdialog:
| C++: |
// NonModalDlg.cpp : Implementierungsdatei //
#include "stdafx.h" #include "NonModal.h" #include "NonModalDlg.h" #include ".\nonmodaldlg.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// CNonModalDlg Dialogfeld
CNonModalDlg::CNonModalDlg(CWnd* pParent /*=NULL*/) : CDialog(CNonModalDlg::IDD, pParent) , m_pCNonModalDlg(NULL) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pCNonModalDlg = NULL; }
CNonModalDlg::~CNonModalDlg() { delete m_pCNonModalDlg; }
void CNonModalDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CNonModalDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDOK, OnBnClickedOk) END_MESSAGE_MAP()
// CNonModalDlg Meldungshandler
BOOL CNonModalDlg::OnInitDialog() { CDialog::OnInitDialog();
// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden ShowWindow(SW_MAXIMIZE); // TODO: Hier zusätzliche Initialisierung einfügen return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten }
// Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt.
void CNonModalDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext zum Zeichnen
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Symbol in Clientrechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }
// Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer // das minimierte Fenster mit der Maus zieht. HCURSOR CNonModalDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); }
void CNonModalDlg::OnBnClickedOk() { // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. if (m_pCNonModalDlg == NULL) { // Dialog-Objekt erstellen m_pCNonModalDlg = new CNonModal1(this); // Dialog erstellen und anzeigen m_pCNonModalDlg->Create(CNonModal1::IDD); m_pCNonModalDlg->ShowWindow(SW_NORMAL); }
//OnOK(); }
|
Header Childdialog:
| C++: |
#pragma once
// CNonModal1-Dialogfeld
class CNonModal1 : public CDialog { DECLARE_DYNAMIC(CNonModal1)
public: CNonModal1(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CNonModal1();
// Dialogfelddaten enum { IDD = IDD_DIALOG1 };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
DECLARE_MESSAGE_MAP() private: CWnd* m_pParent; };
|
Cpp Childdialog:
| C++: |
// NonModal1.cpp : Implementierungsdatei //
#include "stdafx.h" #include "NonModal.h" #include "NonModal1.h"
// CNonModal1-Dialogfeld
IMPLEMENT_DYNAMIC(CNonModal1, CDialog) CNonModal1::CNonModal1(CWnd* pParent /*=NULL*/) : CDialog(CNonModal1::IDD, pParent) , m_pParent(NULL) { m_pParent = pParent; }
CNonModal1::~CNonModal1() { }
void CNonModal1::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CNonModal1, CDialog) END_MESSAGE_MAP()
// CNonModal1-Meldungshandler
|
Auszug aus der Ressource-Datei
| C++: |
// Dialog // IDD_NONMODAL_DIALOG DIALOGEX 0, 0, 322, 201 STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE | WS_EX_APPWINDOW CAPTION "NonModal" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,265,7,50,16 PUSHBUTTON "Abbrechen",IDCANCEL,265,25,50,16 CTEXT "TODO: Dialogfeld-Steuerelemente hier positionieren.", IDC_STATIC,10,96,300,8 END
IDD_DIALOG1 DIALOGEX 0, 0, 186, 95 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CHILD | WS_CAPTION EXSTYLE WS_EX_CONTROLPARENT CAPTION "Nicht Modal" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,129,7,50,14 PUSHBUTTON "Abbrechen",IDCANCEL,129,24,50,14 EDITTEXT IDC_EDIT1,39,27,40,14,ES_AUTOHSCROLL END
|
Dieser Post wurde am 19.09.2005 um 22:13 Uhr von azag1 editiert. |