Avatar billede egoselv Nybegynder
20. august 2003 - 17:02 Der er 10 kommentarer og
1 løsning

Undgå EndDialog ved "Enter" i EditBox

Haves:
Property Sheet med flere Property Pages
I nogle Pages findes der "EditBox"e, når der her trykke "Enter" i disse forlades DoModal dialogen og det er ikke tilsigtet.

Ønsker:
En CPropertyPage::OnOK() metode som i lighed med CDialog::OnOK() kan fange "Enter" tasten.
Avatar billede bertelbrander Novice
20. august 2003 - 17:33 #1
Giv dine eidt boxe ES_MULTILINE og ES_WANTRETURN style.
Avatar billede egoselv Nybegynder
21. august 2003 - 16:31 #2
Det er gjort og nu kan der trykkes "Enter", men jeg mangler en message handler!
Eksempelvis denne, som aldrig bliver kaldt!
void CItemPage::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
   
// TODO: Add your control notification handler code here
   
}
Denne bliver ej helle kaldt.
BOOL CItemPage::OnInitDialog()
{
BOOL bResult = CDialog::OnInitDialog();

long EventMask = CRichEditCtrl().GetEventMask();
EventMask |= ENM_CHANGE;
CRichEditCtrl().SetEventMask(EventMask);

return bResult;
}
Så det virker ikke, -endnu!
Avatar billede bertelbrander Novice
21. august 2003 - 17:53 #3
Har du en "virtual BOOL OnInitDialog();" i CItemPage definitionen?

Jeg går ud fra at CItemPage er afledt af CPropertyPage?

Er din edit en rich edit?

Har du sat et entry for OnChangeEdit1 ind i message map'en for CItemPage?
Avatar billede egoselv Nybegynder
21. august 2003 - 19:05 #4
1.
//{{AFX_VIRTUAL(CItemPage)
protected:
virtual void OnOK();
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
virtual BOOL OnInitDialog();
//}}AFX_VIRTUAL
2. Ja, (class CItemPage : public CPropertyPage)
3. Det går jeg ud fra, -ved det ikke!
4.
// Generated message map functions
//{{AFX_MSG(CItemPage)
afx_msg void OnChangeEdit1();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
Sådan ser verden ud!
Avatar billede bertelbrander Novice
21. august 2003 - 20:10 #5
1: Jeg synes at det er lidt mystisk at OnInitDialog ikke bliver kaldt, men jeg har ingen gode forklaringer.
3: Hvis ikke du har bedt om at få en rich edit tror jeg ikke at det er en rich edit, men det ville være rart at finde ud af.
4: Det jeg var ville vide var hvad der stod mellem BEGIN_MESAGE_MAP() og END_MESSAGE_MAP() for CItemPage, dvs hvilken besked det er du ønsker at fange.

5: Hvad er det helt præsist der skal ske når du trykke på enter i din edit?

Hvis du er meget intereseret kan jeg godt prøve at lave et lille demo project senere i aften.
Avatar billede egoselv Nybegynder
21. august 2003 - 20:28 #6
1. Det syntes jeg også, men måske har jeg rodet lidt formeget for at få det til at virke, jeg vil prøve at lave et enkelt testprogarm på OnInitDialog.
3. Begrebet rich edit har jeg sprunget let hen over for at bevare focus.
4. Ja, du har kun set indholdet af header filen
BEGIN_MESSAGE_MAP(CItemPage, CPropertyPage)
    //{{AFX_MSG_MAP(CItemPage)
    ON_EN_CHANGE(IDC_ITEMEDIT1, OnChangeItemedit1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
5. Når jeg trykke enter skal jeg gå til næste editbox.
De skal editeres i en bestemt række følge og de ikke editerbare skal dimmes.
Jeg har skrevet følgende funktion til at fange messages:
BOOL CALLBACK PageDialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    WPARAM wID = LOWORD(wParam);       
    switch (message) {
    case WM_COMMAND:
        switch (wID) {
            case IDC_ITEMEDIT1:
                    MessageBox (NULL, "Message 1","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDC_ITEMEDIT2:
                    MessageBox (NULL, "Message 2","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDC_ITEMEDIT3:
                    MessageBox (NULL, "Message 3","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDC_STATUSEDIT1:
                    MessageBox (NULL, "Message 4","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDOK:
                    MessageBox (NULL, "Message 5-IDOK","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            }
        break;
        case WM_NOTIFY:
                    MessageBox (NULL, "Message 6 WM_NOTIFY","Info", MB_ICONEXCLAMATION | MB_OK);
        break;
    }
    return FALSE;
}
Den indsættes således:
// Set The Page Procedure
    g_pTheSheet->m_pItemPage->m_psp.pfnDlgProc = PageDialogProc;
Det var min alternative metode til at fange ænderinger på de forskellige Pages,
men jeg kan ikke fange "Enter" -tasten.

6. Mange tak, jeg er meget intresseret i at forstå hvad der er der sker/!sker, når der editeres/ændres i de forskellige editboxe, senere vil de også gælde andre controller.
Med mindre du er meget hook på at genere et eksempel så vil jeg hellere have ideer som jeg kan arbejde med.
Status nu er jeg kan fange WM_COMMAND og WM_NOTIFY, men ikke bruge det til ovenstående problematik.
Avatar billede egoselv Nybegynder
21. august 2003 - 22:56 #7
Jeg har modificeret CALLBACK proceduren så jeg nu fanger strengen, men stadig ikke "Enter" tasten.
BOOL CALLBACK PageDialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char theText[128];
LPTSTR lpString = theText;

WPARAM wID = LOWORD(wParam);
WPARAM wNF = HIWORD(wParam);

switch (message) {
    case WM_COMMAND:
        switch (wID) {
            case IDC_ITEMEDIT1:
                if (wNF==EN_CHANGE) {
                    GetDlgItemText(hwnd,IDC_ITEMEDIT1,lpString, 30);
                    MessageBox (NULL, "Message 1",lpString, MB_ICONEXCLAMATION | MB_OK);
                }
            break;
            case IDC_ITEMEDIT2:
                if (wNF==EN_CHANGE)
                    MessageBox (NULL, "Message 2","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDC_ITEMEDIT3:
                if (wNF==EN_CHANGE)
                    MessageBox (NULL, "Message 3","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDC_STATUSEDIT1:
                if (wNF==EN_CHANGE)
                    MessageBox (NULL, "Message 4","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            case IDOK:
                if (wNF==EN_CHANGE)
                    MessageBox (NULL, "Message 5-IDOK","Info", MB_ICONEXCLAMATION | MB_OK);
            break;
            }
        break;
        case WM_NOTIFY:
            CString String.Format("wID %d", wID);
            LPCTSTR pStr = String.GetBuffer(10);
            MessageBox (NULL, "Message 6 WM_NOTIFY", pStr , MB_ICONEXCLAMATION | MB_OK);
        break;
    }
    return FALSE;
}
Avatar billede bertelbrander Novice
23. august 2003 - 01:07 #8
Jeg har vist været lidt fraværende, og har vist også misforstået et par ting.
Du ønsker IKKE at lave dine edit-boxe multi-line, men ønsker at hoppe til en anden edit box når brugeren trykker enter, rigtigt?
I så fald skal du IKKE give dine eidt boxe ES_MULTILINE ellse ES_WANTRETURN styles.
Det var måske en ide at starte forfra, med noget lidt simplere. Lav en simpel dialogbox baseret app og få det til at virke her. Bagefter kan du så flytte koden over i EN property page i et property sheet. Bagefter kan du så lave flere property pages.
Avatar billede egoselv Nybegynder
26. august 2003 - 14:57 #9
Tak for din deltagelse Bertelbrander.
Jeg har løst problemet på følgende måde:

class CMenuSheet : public CPropertySheet

BOOL CMenuSheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
WPARAM wID = LOWORD(wParam);
WPARAM wNF = HIWORD(wParam);
// TODO: Add your specialized code here and/or call the base class
BOOL bResult = CPropertySheet::OnCommand(wParam, lParam);

if (!bResult) {
    switch (wID) {
        case IDOK:
            bResult = 1;
        break;
        case IDCANCEL:
            bResult = 1;
        break;
    }
}
return bResult;
}
Hvordan lukke man dette spørgsmål?
Avatar billede bertelbrander Novice
26. august 2003 - 17:48 #10
Da du selv har fundet løsningen på dit problem og der ikke er andre der har lavet et svar bliver du nødt til selv at lave et svar:
1: Skriv f.ex Svar i boxen herunder
2: Vælg Svar i boxen til venstre
3: Tryk på "Udfør"
4: Når siden er loadet igen får du mulighed for at trykke afslutte spørgsmålet ved at trykke på "Acceptere" knappen.
Avatar billede egoselv Nybegynder
26. august 2003 - 23:03 #11
Spørgsmålet lukkes!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester