Существует ли идиоматический способ .net для реализации «справки по учебным карточкам»? - PullRequest
1 голос
/ 22 июля 2010

У нас есть приложение VB6, в котором реализован обработчик сообщений WM_TCARD из файла справки HTML.Он перемещается внутри приложения и открывает соответствующие экраны и т. Д.

Как это сделать в приложении WinForms?

Единственный способ, который я сразу вижу, - это обработать оконную процедуру и обработать сообщение WM_TCARD точно так же, как мы делали это для приложения VB6.сделать это?

1 Ответ

1 голос
/ 22 июля 2010

Вам придется обрабатывать сообщения самостоятельно. Тем не менее, довольно легко создать класс, который сделает это за вас. E.g.:

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();
}

Очевидно, вам нужно будет сделать все остальное самостоятельно. Но это должно начать вас.

...