2010-01-20 28 views
0

當試圖更改「受保護」文本時,EN_PROTECTED通知消息被髮送到富編輯控件的父級。這適用於我,我已經用richedit20和richedit50來試用它。對此受保護文本的任何更改都會立即觸發EN_PROTECTED消息。 (它的設置有點複雜,但我已經正確完成了。)EN_PROTECTED和RichEdit

但是,該文檔說明,如果父對EN_PROTECTED消息返回非零值,它將防止保護文本被更改。這不適合我。

+0

你可以將源代碼發佈到你的EN_PROTECTED處理程序嗎? – Ruddy 2010-01-20 22:37:24

回答

0

(紅光滿面:代碼示例如下,如果它揭示了什麼)

我最終只是從EN_PROTECTED處理程序中做了PostMessage的(HWND,EM_UNDO ...),這就是我不得不做的就是這個爲我工作。返回TRUE從來沒有完成任何事情,雖然我知道處理程序正在被擊中,只有受保護的文本。 (下面的ODS函數是OutputDebugString)。

但我在網上看到過多個例子(其中大多數是MFC,或者有時候是DELPHI或其他東西),只是在EN_PROTECTED處理程序中返回TRUE來阻止更改。

實際上,我的Rich Edit Control是在一個對話框中,但是使用CreateWindowEx創建的,所以我嘗試通過RC文件初始化它,但它沒有區別。 (我正在做的一些東西有點老派 - 對此很遺憾。)但是實際上,我嘗試了一切努力,使EN_PROTECTED像它的記錄一樣工作,沒有任何工作 - 奇怪。

哦,EM_UNDO來自EN_PROTECTED處理函數,所以我猜我會堅持。

原代碼(與添加的EM_UNDO調用):

case WM_NOTIFY: { 

    NM_UPDOWN* nm = (NM_UPDOWN*)lParam; 
    if ((nm->hdr.code == UDN_DELTAPOS) && (nm->hdr.idFrom == ID_UPD_ERR)) { 
    int e = nm->iPos + nm->iDelta; 
    SetWindowText(xml2->hStatMsg[1],xml2->ErrMsg(1,e)); 
    SetWindowText(xml2->hStatMsg[2],xml2->ErrMsg(2,e)); 
    } 
    else if (wParam == ID_EDIT_A) { 
    if (((LPNMHDR)lParam)->code == EN_PROTECTED) { 
     ODS("EN_PROTECTED", (int)((ENPROTECTED*)lParam)->msg); 
     PostMessage(xml2->hImgXml2,EM_UNDO,0,0); 
     return TRUE; 
    } 
    if (((LPNMHDR)lParam)->code == EN_SELCHANGE) { 
     anchors_adjsel(xml2->hImgXml2); 

    }  
    } 

} 
break; 
1

我創建了一個簡單的測試對話框中測試應用程序,使用MFC - 通過對話框編輯添加RichEdit控件,在應用程序中添加調用AfxInitRichEdit初始化,在對話框中添加一些代碼,將文本放入控件中(SetWindowText),選中第二個單詞,應用CFE_PROTECTED效果,然後在EN_PROTECTED中添加處理程序,在處理程序中我只設置*pResult = TRUE

當我運行應用程序時,它一切正常;因爲我是而不是能夠修改受保護的詞,但我可以修改其餘的文本。

不幸的是,我們無法確定您的代碼爲什麼不起作用 - 從我所看到的看起來正確。可能是我認爲RichEdit20 dll的版本 - 我的是5.31.23.1224