20. august 2003 - 17:02Der 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.
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);
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.
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.
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.
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?
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.
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.