WINAPI PropSheetPage Example

这是一个关于如何使用WINAPI创建属性页的例子,包括设置对话框回调函数SheetProc、Page1DlgProc和Page2DlgProc,以及初始化对话框和处理用户交互。示例中涉及了多个页面和自定义回调,用于展示如何处理窗口消息和控制对话框元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//   Globals
PROPSHEETHEADER m_PropSheet;
PROPSHEETPAGE   m_psp[2];
LOGFONT   m_lfont;

LRESULT   CALLBACK SheetProc(HWND,   UINT,   WPARAM,   LPARAM);
LRESULT   CALLBACK Page1DlgProc(HWND,   UINT,   WPARAM,   LPARAM);
LRESULT   CALLBACK Page2DlgProc(HWND,   UINT,   WPARAM,   LPARAM);

int   APIENTRY   WinMain(HINSTANCE   hInstance,
                         HINSTANCE   hPrevInstance,
                         LPSTR           lpCmdLine,
                         int               nCmdShow)
{
    //...

    //   Property   Sheet
    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   =   hInstance;
    m_psp[0].pszTemplate   =   (LPCSTR)IDD_PAGE1;
    m_psp[0].pszTitle   =   "Page   1 ";
    m_psp[0].pfnDlgProc   =   (DLGPROC)Page1DlgProc;
    //m_psp[0].pfnCallback   =   (LPFNPSPCALLBACK)   Page1Proc;

    m_psp[1].dwSize   =   sizeof(PROPSHEETPAGE);
    m_psp[1].dwFlags   =   PSP_USETITLE;
    //m_psp[1].dwFlags   =   PSP_USETITLE   |   PSP_USECALLBACK;
    //m_psp[1].dwFlags   =   PSP_USECALLBACK;
    m_psp[1].hInstance   =   hInstance;
    m_psp[1].pszTemplate   =   (LPCSTR)IDD_PAGE2;
    m_psp[1].pszTitle   =   "Page   2 ";
    m_psp[1].pfnDlgProc   =   (DLGPROC)Page2DlgProc;
    //m_psp[1].pfnCallback   =   (LPFNPSPCALLBACK)   Page2Proc;

    m_PropSheet.dwSize   =   sizeof(PROPSHEETHEADER);
    m_PropSheet.dwFlags   =   PSH_PROPSHEETPAGE   |   PSH_USECALLBACK;
    //m_PropSheet.dwFlags   =   PSH_PROPSHEETPAGE   |   PSH_USECALLBACK   |   PSH_MODELESS;
    m_PropSheet.hInstance   =   hInstance;
    m_PropSheet.pszCaption   =   (LPSTR)   "Property   Sheet ";
    m_PropSheet.nPages   =   2;
    m_PropSheet.nStartPage   =   0;
    m_PropSheet.ppsp   =   (LPCPROPSHEETPAGE)m_psp;
    m_PropSheet.pfnCallback   =   (PFNPROPSHEETCALLBACK)   SheetProc;

    //...
}

LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)
{
    //...
    switch   (message) 
    {
    case   WM_COMMAND:
        wmId         =   LOWORD(wParam); 
        wmEvent   =   HIWORD(wParam); 
        //   Parse   the   menu   selections:
        switch   (wmId)
        {
        case   IDM_OPTION_PROPS:
            PropertySheet(&m_PropSheet);
            break;
            //... default:
            return   DefWindowProc(hWnd,   message,   wParam,   lParam);
        }
        break;
    case   WM_PAINT:
        hdc   =   BeginPaint(hWnd,   &ps);
        //   TODO:   Add   any   drawing   code   here...
        //RECT   rt;
        //GetClientRect(hWnd,   &rt);
        //DrawText(hdc,   szHello,   strlen(szHello),   &rt,   DT_CENTER);
        EndPaint(hWnd,   &ps);
        break;
    case   WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return   DefWindowProc(hWnd,   message,   wParam,   lParam);
    }
    return   0;

    //   callback   function   for   property   sheet
    LRESULT   CALLBACK   SheetProc(HWND   hDlg,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)
    {
        ShowWindow(GetDlgItem(hDlg,   IDOK),   SW_HIDE);
        ShowWindow(GetDlgItem(hDlg,   IDCANCEL),   SW_HIDE);
        //ShowWindow(GetDlgItem(hDlg,   ID_APPLY_NOW),   SW_HIDE);

        //PropSheet_GetTabControl(hDlg)   /
        //               (HWND)SNDMSG(hDlg,   PSM_GETTABCONTROL,   0,   0)

        //   set   a   bold   font   to   the   tabs
        m_lfont.lfHeight                   =   8;
        m_lfont.lfWeight                   =   FW_NORMAL;
        m_lfont.lfPitchAndFamily   =   DEFAULT_PITCH   |   FF_DONTCARE;
        strcpy(m_lfont.lfFaceName,   _T( "Arial "));
        HWND   hTabCtrl   =   PropSheet_GetTabControl(hDlg);
        SendMessage(hTabCtrl,   WM_SETFONT,   (WPARAM)&m_lfont,   0);

        switch(   message   )
        {
        case   WM_INITDIALOG:
            return   TRUE;

        case   WM_COMMAND:
            if   (LOWORD(wParam)   ==   IDOK   ||   LOWORD(wParam)   ==   IDCANCEL) 
            {
                EndDialog(hDlg,   LOWORD(wParam));
                return   TRUE;
            }
            break;
        }
        return   FALSE;
    }

    //   Dialog   proc   for   page   1
    LRESULT   CALLBACK   Page1DlgProc(HWND   hDlg,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)
    {

        switch   (message)
        {
        case   WM_INITDIALOG:
            {
                SetWindowText(GetDlgItem(hDlg,   IDC_EDITX),   "A   *   cos(u)   *   cos(v) ");
                SetWindowText(GetDlgItem(hDlg,   IDC_EDITY),   "A   *   sin(u)   *   cos(v) ");
                SetWindowText(GetDlgItem(hDlg,   IDC_EDITZ),   "A   *   sin(v) ");
                return   TRUE;
            }

        case   WM_COMMAND:
            if   (LOWORD(wParam)   ==   IDOK   ||   LOWORD(wParam)   ==   IDCANCEL) 
            {
                EndDialog(hDlg,   LOWORD(wParam));
                return   TRUE;
            }
            break;
        }
        return   FALSE;

    }//   Page1DlgProc(HWND,   UINT   WPARAM,   LPARAM)

    //   Dialog   proc   for   page   2
    LRESULT   CALLBACK   Page2DlgProc(HWND   hDlg,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)
    {
        switch   (message)
        {
        case   WM_INITDIALOG:
            return   TRUE;

        case   WM_COMMAND:
            if   (LOWORD(wParam)   ==   IDOK   ||   LOWORD(wParam)   ==   IDCANCEL) 
            {
                EndDialog(hDlg,   LOWORD(wParam));
                return   TRUE;
            }
            break;
        }
        return   FALSE;

    }//   Page2DlgProc(HWND,   UINT   WPARAM,   LPARAM)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值