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/