Beispiel #1
0
        }// DialogProcHook

        //-------------------------------------------------
        // PropSheetDialogProc
        //
        // This function will handle all messages coming sent
        // to the property page
        //-------------------------------------------------
        internal bool PropPageDialogProc(IntPtr hwndDlg, uint msg, IntPtr wParam, IntPtr lParam)
        {
            m_pphWnd = hwndDlg;

            // See if we've been subclassed...
            if (m_dlgHook != null)
            {
                // If our hook handled the message, then we don't need to do
                // anything anymore. :)
                if (m_dlgHook(hwndDlg, msg, wParam, lParam))
                {
                    return(true);
                }
            }
            switch (msg)
            {
            case WM.NOTIFY:

                // lParam really is a pointer to a NMHDR structure....
                NMHDR nm = new NMHDR();
                nm = (NMHDR)Marshal.PtrToStructure(lParam, nm.GetType());

                switch (nm.code)
                {
                case PSN.SETACTIVE:
                    SetWindowLong(hwndDlg, 0, WizSetActive(hwndDlg));
                    return(true);

                case PSN.WIZBACK:
                    SetWindowLong(hwndDlg, 0, WizBack(hwndDlg));
                    return(true);

                case PSN.WIZNEXT:

                    StartWaitCursor();
                    SetWindowLong(hwndDlg, 0, WizNext(hwndDlg));
                    EndWaitCursor();

                    return(true);

                case PSN.WIZFINISH:
                    SetWindowLong(hwndDlg, 0, WizFinish(hwndDlg));
                    return(true);
                }
                break;

            default:
                // We didn't handle this message
                return(false);
            }
            return(false);
        }// PropPageDialogProc
        }// DialogProcHook

        //-------------------------------------------------
        // PropSheetDialogProc
        //
        // This function will handle all messages coming sent
        // to the property page
        //-------------------------------------------------
        internal bool PropPageDialogProc(IntPtr hwndDlg, uint msg, IntPtr wParam, IntPtr lParam)
        {
            try
            {
                // See if we've been subclassed...
                if (m_dlgHook != null)
                {
                    // If our hook handled the message, then we don't need to do
                    // anything anymore. :)
                    if (m_dlgHook(hwndDlg, msg, wParam, lParam))
                    {
                        return(true);
                    }
                }
                switch (msg)
                {
                case WM.INITDIALOG:
                    BeginInsertPropSheetPageControls(hwndDlg);
                    return(true);

                case WM.DESTROY:

                    // We're not going to make changes to this
                    m_fChanges = false;

                    // tell MMC that we're done with the property sheet
                    if (m_iCookie != -1)
                    {
                        CNodeManager.GetNode(m_iCookie).FreePropertySheetNotifyHandle();
                        return(true);
                    }
                    // If we don't belong to a specific node, then we can't handle
                    // this message
                    return(false);

                case WM.PAINT:
                    // WinForms has problems repainting managed controls on an unmanaged
                    // form. We'll intercept every paint message and force all the
                    // managed controls to repaint themselves. This will create a little
                    // flicker, but it's better (for now) than having controls not show
                    // up at all.
                    if (m_uc != null)
                    {
                        m_uc.Refresh();
                    }
                    return(false);

                case WM.NOTIFY:

                    // lParam really is a pointer to a NMHDR structure....
                    NMHDR nm = new NMHDR();
                    nm = (NMHDR)Marshal.PtrToStructure(lParam, nm.GetType());

                    // We're about to lose focus of this property page. Make sure the data
                    // is valid before we allow that
                    //
                    // We only want to do validation though if they've made changes
                    if (nm.code == PSN.KILLACTIVE && m_fChanges)
                    {
                        if (!ValidateData())
                        {
                            // The data on the page had errors
                            SetWindowLong(hwndDlg, 0, 1);
                        }
                        return(true);
                    }

                    // If we're being told to apply changes made in the property pages....
                    else if (nm.code == PSN.APPLY)
                    {
                        // We'll only run through the Validate/Apply if the user made changes
                        if (m_fChanges)
                        {
                            // First, call a validate on the current page
                            if (!ValidateData() || !ApplyData())
                            {
                                // There were errors on this page...
                                // Set the appropriate return code here.
                                SetWindowLong(hwndDlg, 0, (int)PSNRET.INVALID_NOCHANGEPAGE);
                            }
                            else
                            {
                                m_fChanges = false;
                            }

                            return(true);
                        }
                    }
                    else if (nm.code == PSN.QUERYCANCEL)
                    {
                        // Ok, so this may look odd. Why do we send an WM_INITDIALOG right
                        // after we get a QUERYCANCEL?
                        //
                        // Well, our dialogs expect WM.INITDIALOG to be sent to them each time
                        // they are shown. Well, unfortunately, that doesn't seem to be the case
                        // now. It is sent once, when it is first shown. Now, we'll make
                        // sure it gets send again.
                        PostMessage(hwndDlg, WM.INITDIALOG, 0, 0);
                    }
                    break;

                default:
                    // We'll let the default windows message handler handle the rest of
                    // the messages
                    return(false);
                }
            }
            catch (Exception)
            {
                // We encountered an exception... let's just swallow the error and
                // hope everything will be ok.
                //
                // If we let this exception continue, it will kill the thread that's pumping
                // messages for the property page. This will cause MMC to hang. Not what we want.
            }
            return(false);
        }// PropPageDialogProc