自己对DialogBox的封装 [转]

来源:互联网 发布:windows 10 whql是什么 编辑:程序博客网 时间:2024/05/05 22:22

Smartphone上的DialogBox非得用modal dialog,而且,Parent Wnd Handle必须是NULL。封装的时候,把this用Set/GetWindowLong来存取,还好。还有,如果想不给LoadString一个有效的Buffer,直接得到资源字符串的静态地址,需要老老实实的给资源编译器加-n参数。
=================
头文件:
=================
#pragma once

#include <windows.h>

class CMyDialogBox
{
public:
    CMyDialogBox(WORD wResID, UINT uMenuID, LPCTSTR szTitle);
public:
    virtual ~CMyDialogBox(void);
public:
    int ShowModalDialog(HINSTANCE hInst, HWND hwndParent);
protected:
    WORD m_wResID;
    static BOOL DialogFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
    virtual BOOL InitDialog(HWND hwnd);
    HWND m_hwnd;
    HINSTANCE m_hInstance;
    UINT m_uMenuID;
    HWND m_hwndMenu;
    LPCTSTR m_szTitle;
    virtual BOOL InitComponents(void) = 0;
    virtual BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtrl) = 0;
};

==================
源文件:
==================
#include "StdAfx.h"
#include "MyDialogBox.h"

#include <tpcshell.h>
#pragma comment(lib, "aygshell.lib")

CMyDialogBox::CMyDialogBox(WORD wResID, UINT uMenuID, LPCTSTR szTitle)
: m_uMenuID(0)
{
    this->m_wResID = wResID;
    this->m_uMenuID = uMenuID;
    this->m_szTitle = szTitle;
}

CMyDialogBox::~CMyDialogBox(void)
{
}

int CMyDialogBox::ShowModalDialog(HINSTANCE hInst, HWND hwndParent)
{
    this->m_hInstance = hInst;
    return DialogBoxParam(
        hInst,
        MAKEINTRESOURCE(m_wResID),
        hwndParent,
        DialogFunc,
        (LPARAM)this);
}

BOOL CMyDialogBox::DialogFunc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    BOOL bProcessedMsg = TRUE;
    CMyDialogBox * this_ptr = (CMyDialogBox *) GetWindowLong(hWnd, DWL_USER);

    switch (Msg) {
        case WM_HOTKEY:
            if(HIWORD(lParam) == VK_TBACK)
                SHSendBackToFocusWindow(Msg, wParam, lParam);
            break;
        case WM_INITDIALOG:
            this_ptr = (CMyDialogBox *) lParam;
            SetWindowLong(hWnd, DWL_USER, (LONG) this_ptr);
            if (FALSE == this_ptr->InitDialog(hWnd)) {
                EndDialog(hWnd, -1);
            }
            break;
        case WM_ACTIVATE:
            if (WA_INACTIVE != LOWORD(wParam)) {
                SetFocus(hWnd);
            }
            break;
        case WM_CLOSE:
            EndDialog(hWnd, 0);
            break;
        case WM_COMMAND:
            bProcessedMsg = this_ptr->OnCommand(
                HIWORD(wParam),
                LOWORD(wParam),
                (HWND) lParam);
            break;
        default:
            bProcessedMsg = FALSE;
    }
    return bProcessedMsg;
}

BOOL CMyDialogBox::InitDialog(HWND hWnd)
{
    this->m_hwnd = hWnd;

    // initialize dialog box, specifying that it should stretch full screen
    SHINITDLGINFO sid;
    ZeroMemory(&sid, sizeof(sid));
    sid.dwMask  = SHIDIM_FLAGS;
    sid.dwFlags = SHIDIF_SIZEDLGFULLSCREEN;
    sid.hDlg    = hWnd;

    // initialize menubar
    SHMENUBARINFO mbi;
    ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
    mbi.cbSize      = sizeof(SHMENUBARINFO);
    mbi.hwndParent  = hWnd;
    mbi.nToolBarId  = this->m_uMenuID;
    mbi.hInstRes    = this->m_hInstance;

    if (FALSE == SHCreateMenuBar(&mbi)) {
        return FALSE;
    }
    this->m_hwndMenu = mbi.hwndMB;

    // initialize the dialog
    if (FALSE == SHInitDialog(&sid)) {
        return FALSE;
    }

    // show menubar
    ShowWindow(this->m_hwndMenu, SW_SHOW);

    // override back-key
    SendMessage(this->m_hwndMenu, SHCMBM_OVERRIDEKEY, VK_TBACK,
        MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
        SHMBOF_NODEFAULT | SHMBOF_NOTIFY));

    // set the title bar
    SetWindowText(hWnd, this->m_szTitle);

    return this->InitComponents();
}

come from: http://richarddzh.blog.163.com/blog/static/112179155200941625141729/

原创粉丝点击