按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
…………………………………………………………Page 189……………………………………………………………
在WM_SYSMAND消息中,参数nID的低4位由Windows内部使用,当应
用程序测试nID的值时,必须使用按位与(bitwise…AND)操作符组合值
0xFFF0和nID来得到正确的结果。
应用程序可以在任何时候通过传递一个WM_SYSMAND消息给成员函
数OnSysmand来执行任何系统命令。
已被定义为用来选择控制菜单项的加速键 (快捷键)消息将解释为
OnSysmand的调用,其它快捷键将翻译为WM_MAND消息。
l 注意:
l 控制菜单项可以通过成员函数GetSystemMenu、AppendMenu、
InsertMenu以及ModifyMenu来进行修改。修改了控制菜单的应用
程序必须处理WM_SYSMAND消息,所有未被应用程序处理的消息
必须传递给成员函数OnSysmand。由应用程序添加的命令值必
须由应用程序处理,而不能传递给函数OnSysmand。
l 该成员函数由框架所调用,以允许应用程序处理Windows消息。传
递给函数的消息代表了当获得消息时由框架获得的参数。如果你
调用了基类的实现,该实现将使用消息最初传递的参数,而不是
由函数提供的参数。
成员函数OnPaint是消息WM_PAINT的处理函数,它当窗口客户区需要
重绘时被调用。
成员函数OnQueryDragIcon对应于消息WM_QUERYDRAGICON,它也是由
框架在最小化窗口而没有为类定义一个图标时调用。系统通过对该函
数的调用来获得当用户拖动被最小化的窗口时用来显示的光标。
如果应用程序返回了一个图标名光标的句柄,系统将其转换了黑白
的。该句柄必须标识一个与显示驱动程序分辨率相兼容的单色光标或
图标。应用程序可以调用CWinApp::LoadCursor或CWinApp::LoadIcon
成员函数来从它的可执行文件中的资源内加载一个光标或图标并获得
其句柄。
下面给出类CDialogDemoDlg的实现文件DialogDemoDlg。cpp的清单:
// DialogDemoDlg。cpp : 实现文件
//
#include 〃stdafx。h〃
…………………………………………………………Page 190……………………………………………………………
#include 〃DialogDemo。h〃
#include 〃DialogDemoDlg。h〃
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE'' = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg 用于 App About 的对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// 由 ClassWizard 生成的虚函数重载
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
//}}AFX_VIRTUAL
// 实现
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
…………………………………………………………Page 191……………………………………………………………
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg; CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// 没有消息处理函数
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDialogDemoDlg 对话框
CDialogDemoDlg::CDialogDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDialogDemoDlg::IDD; pParent)
{
//{{AFX_DATA_INIT(CDialogDemoDlg)
// 注意:ClassWizard 将在此添加成员初始化
//}}AFX_DATA_INIT
…………………………………………………………Page 192……………………………………………………………
// 注意在 Win32 中 LoadIcon 不需要一个相应的 DestroyIcon
m_hIcon = AfxGetApp()…》LoadIcon(IDR_MAINFRAME);
}
void CDialogDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialogDemoDlg)
// 注意:ClassWizard 将在此添加 DDX 和 DDV 调用
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDialogDemoDlg; CDialog)
//{{AFX_MSG_MAP(CDialogDemoDlg)
ON_WM_SYSMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDialogDemoDlg 消息处理函数
BOOL CDialogDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 添加 〃About。。。〃 菜单项到系统菜单
// IDM_ABOUTBOX 必须在系统命令范围之内
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX 《 0xF000);
…………………………………………………………Page 193……………………………………………………………
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu。LoadString(IDS_ABOUTBOX);
if (!strAboutMenu。IsEmpty())
{
pSysMenu…》AppendMenu(MF_SEPARATOR);
pSysMenu…》AppendMenu(MF_STRING; IDM_ABOUTBOX; strAboutMenu);
}
}
// 该当前对话框设置图标。当应用程序主窗口不为对话框时由框架自动完成该任务
SetIcon(m_hIcon; TRUE); // 设置大图标
SetIcon(m_hIcon; FALSE); // 设置小图标
// TODO: 在此添加额外初始化
return TRUE; // 除非将焦点设置为某一控件,否则返回 TRUE
}
void CDialogDemoDlg::OnSysmand(UINT nID; LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout。DoModal();
}
else
{
…………………………………………………………Page 194……………………………………………………………
CDialog::OnSysmand(nID; lParam);
}
}
// 如果你向对话框添加了一个最小化按钮,你将需要下面的代码来绘制图标。
// 对于使用文件/视模型的 MFC 应用程序,这一步由框架自动完成。
void CDialogDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 重绘设备上下文
SendMessage(WM_ICONERASEBKGND; (WPARAM) dc。GetSafeHdc(); 0);
// 在窗户区矩形中居中图标
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect。Wid