Avatar billede challenge Praktikant
08. november 2009 - 13:28 Der er 1 kommentar og
1 løsning

Win32 Property Sheet problem

Hej alle,

Jeg er forholdsvis grøn på Win32-området, og har kastet mig ud i Property Sheets. Jeg har nedenstående kode:

int APIENTRY MyPropSheetDlgProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
    PROPSHEETHEADER    m_PropSheet;
    PROPSHEETPAGE m_psp[2];
    static PROPSHEETPAGE * ps;

    memset(m_psp, 0, sizeof(m_psp));
    memset(&m_PropSheet, 0, sizeof(m_PropSheet));

    m_psp[0].dwSize = sizeof(PROPSHEETPAGE);
    m_psp[0].dwFlags = PSP_DEFAULT|PSP_USETITLE;
    m_psp[0].hInstance = zhInstance;
    m_psp[0].pszTemplate = (LPCSTR)IDD_DIALOG2;
    m_psp[0].pszTitle = "Page 1";

    m_psp[1].dwSize = sizeof(PROPSHEETPAGE);
    m_psp[1].dwFlags = PSP_USETITLE;
    m_psp[1].hInstance = zhInstance;
    m_psp[1].pszTemplate = (LPCSTR)IDD_DIALOG3;
    m_psp[1].pszTitle = "Page 2";

    m_PropSheet.dwSize = sizeof(PROPSHEETHEADER);
    m_PropSheet.dwFlags = PSH_PROPSHEETPAGE;
    m_PropSheet.hInstance = zhInstance;
    m_PropSheet.pszCaption = (LPSTR) "Cell Properties";
    m_PropSheet.nPages = 2;
    m_PropSheet.nStartPage = 0;
    m_PropSheet.ppsp = (LPCPROPSHEETPAGE)m_psp;

    switch (message)
    {
        case WM_INITDIALOG:   

            // Save the PROPSHEETPAGE information.
            ps = (PROPSHEETPAGE *)lParam;
            return true;

        case WM_NOTIFY:
            switch (((NMHDR FAR *) lParam)->code)
            {
                case PSN_SETACTIVE:
                    break;

                case PSN_APPLY:
                    SetWindowLong(hwnd, DWL_MSGRESULT, true);
                    break;

                case PSN_KILLACTIVE:
                    SetWindowLong(hwnd, DWL_MSGRESULT, false);
                    return 1;
                    break;

                case PSN_RESET:

                    // Reset to the original values.
                    SetWindowLong(hwnd, DWL_MSGRESULT, false);
                    break;
        }
    }

    PropertySheet(&m_PropSheet);

    return 0;
}

--og--

            case WM_COMMAND:
                // Begin Menu Commands
                switch(LOWORD(wParam))
                {
                    case ID_FILE_EXIT:
                        PostMessage(hwnd, WM_CLOSE, 0, 0);
                    break;
                    case ID_OPEN_DIALOG:
                          // Initializing dialog box
                          int ret = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, MyPropSheetDlgProc);
                          // returning error if dialog box failed to open
                          if(ret == -1){
                              MessageBox(hwnd, "Dialog failed!", "Error", MB_OK | MB_ICONINFORMATION);
                          }
                        break;
                }
                // End Menu Commands
                break;

Mit problem er, at starter jeg min application og klikker på menupunktet for mit property sheet, åbner den ikke kun én dialog men bliver ved med at åbne nye, hver gang jeg foretager mig noget.

Hvad gør jeg forkert?
Avatar billede challenge Praktikant
08. november 2009 - 15:45 #1
Fandt problemet - første del af min kode skulle nid under min WIMPAIN procedure...

Et andet spørgsmål kom dog frem i processen; De forskellige sheets i min dialog har samme baggrundsfarve som en dialog plejer at have - baggrundsfarven passer altså ikke i tab-controllen hvis baggrund er lys grå med gradient overgang.
Hvorledes sørger jeg for at min dialog har samme farve (eller at baggrunden er "gennemsigtig") således at det visuelt passer sammen?
Avatar billede challenge Praktikant
08. november 2009 - 17:56 #2
nevermind...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester