2010-07-22 2 views
1

우리는 HTML 도움말 파일에서 WM_TCARD 메시지에 대한 처리기를 구현 한 VB6 응용 프로그램을 가지고 있습니다. 응용 프로그램 내에서 탐색하고 관련 화면을 엽니 다."훈련 카드 도움말"을 구현하는 관용적 인 .net 방법이 있습니까?

WinForms 응용 프로그램에서 어떻게합니까?

내가 볼 수있는 유일한 방법은 창 프로 시저를 처리하고 VB6 응용 프로그램과 똑같은 방법으로 WM_TCARD 메시지를 처리하는 것입니다.

더 많은 .net 방법이 있습니까?

답변

1

메시지를 직접 처리해야합니다. 그러나, 당신을 위해 이것을하는 클래스를 만드는 것은 꽤 쉽습니다. 예컨대 :

public class HelpCards : IMessageFilter { 
    const int WM_TCARD = 0x52; 
    const int ID_NOTIFICATION = 4242; 

    public enum TCardAction: int { 
     IDOK = 1, 
     IDCANCEL = 2, 
     IDABORT = 3, 
     IDRETRY = 4, 
     IDIGNORE = 5, 
     IDYES = 6, 
     IDNO = 7, 
     IDCLOSE = 8, 
     IDHELP = 9, 

     HELP_TCARD = 0x8000, 
     HELP_TCARD_DATA = 0x0010, 
     HELP_TCARD_OTHER_CALLER = 0x0011, 
     HELP_TCARD_OTHER_NEXT = 0x0011, 
    } 

    public HelpCards() { 
     Application.AddMessageFilter(this); 
    } 

    public delegate void OKReceived(); 
    public event OKReceived OnOKReceived; 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == WM_TCARD && (int)m.WParam == ID_NOTIFICATION) { 
      switch ((TCardAction)m.LParam) { 
       case TCardAction.IDOK: 
        if (OnOKReceived != null) { 
         OnOKReceived(); 
        } 
        break; 
        // etc. 
      } 

      return true; // true means message was handled 
     } 

     return false; 
    } 
} 

그런 다음 (어딘가에 아마 당신의 형태로)에 가입 할 장소에

hc = new HelpCards(); 
hc.OnOKReceived += new OKReceived(hc_OnOKReceived); 

사용하고 폼의 클래스 정의에 정의 hc 있습니다. 그래서

HelpCards hc; 

그리고 어딘가에 처리 기능이 같이 :

void hc_OnOKReceived() { 
    throw new NotImplementedException(); 
} 

은 분명히 당신은 나머지를 직접 수행해야합니다. 하지만 그렇게하면 시작할 수 있습니다.

+0

고마워요. 그럴 것이라고 생각했지만 HelpProvider 또는 메시지 처리가 필요하지 않음을 의미하는 무언가를 놓치기를 바랬다. –

+0

아, 클래스가 삭제 될 때 메시지 필터를 제거하려고합니다. . 그리고 이벤트 위임자에 void()가 아닌 EventHandler를 사용하려고합니다. –

관련 문제