吕鑫MFC学习系列七

接着上一节的知识点继续学习MFC的一些重要函数,因为函数设计MFC的基础。

第一步,创建一个MFC工程,然后再将上一节的两个功能添加进来,通过类向导添加DestroyWindow(),第二个按钮通过create()创建list菜单,前面也学习过这一知识点,后面会对这个知识点进阶。

第二步,实现获取窗口句柄按钮,代码见OnBnClickedButton3:
a)pWnd->m_hWnd:直接调用前最好判断一下指针是否为空。
b)operator HWND():自动类型转换,将对象转换为句柄。
c)GetSafeHwnd():可以避免的a方法,因为指针为空造成的软件崩溃。

第三步,实现由句柄转为CWnd对象的几个按钮,代码见OnBnClickedButton4、OnDestroy、OnBnClickedButton5:
a)CWnd::FromHandle:生成一个临时性窗口类指针,只限于在当前函数内使用。
b)Attach和Detach:为一个CWnd对象嫁接和移除窗口句柄。

a),b)这两条知识点在原来窗口下直接进行实现,而下面的c),d)需要添加两个CMyButton类、CMyList类,原来m_dest和m_list类型是窗口CWnd类型后面修改为CMyButton、CMyList,这样可以获取子类窗口的消息。实现需要在TestDlg.h中添加

    CMyList m_list;

    CWnd m_edit;

    CMyButton m_dest;
c)SubclassWindow和UnsubclassWindow:子类化和反子类化,还能通过子类接收窗口消息。
d)SubclassDlgItem:子类化指定ID对应的控件窗口,还能通过子类接收窗口消息。

第四步,实现获取和设置窗口信息,见代码OnBnClickedButton6、OnBnClickedButton7:
a)GetWindowText和SetWindowText:获取和设置窗口的标题文字。
b)GetStyle和ModifyStyle:获取和设置窗口的基础风格。
c)GetExStyle和ModifyStyleEx:获取和设置窗口的扩展风格

如果用vc++6.0时需要具体按照吕鑫老师实现,如果是vs的话则有许多地方做修改了,可以参考我的代码,尤其是在CListCtrl的CreateEx函数实现上,有参数的变化和类型的变化。

结果:


这里我就直接贴我的.h和.cpp代码:

// TestWinDlg.h : 头文件
//

#if _MSC_VER > 1000
#pragma once
#endif

#include "MyButton.h"
#include "MyList.h"
// CTestWinDlg 对话框
class CTestWinDlg : public CDialogEx
{
// 构造
public:
	CTestWinDlg(CWnd* pParent = NULL);	// 标准构造函数

	CMyList m_list;
	CWnd m_edit;
	CMyButton m_dest;
	CMyButton m_cret;
// 对话框数据
	enum { IDD = IDD_TESTWIN_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton5();
	afx_msg void OnEnChangeEdit1();
	afx_msg void OnDestroy();
	afx_msg void OnBnClickedButton6();
	afx_msg void OnBnClickedButton7();
};
// TestWinDlg.cpp : 实现文件
#include "stdafx.h"
#include "TestWin.h"
#include "TestWinDlg.h"
#include "MyButton.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTestWinDlg 对话框



CTestWinDlg::CTestWinDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CTestWinDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestWinDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTestWinDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CTestWinDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CTestWinDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CTestWinDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CTestWinDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, &CTestWinDlg::OnBnClickedButton5)
	ON_EN_CHANGE(IDC_EDIT1, &CTestWinDlg::OnEnChangeEdit1)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BUTTON6, &CTestWinDlg::OnBnClickedButton6)
	ON_BN_CLICKED(IDC_BUTTON7, &CTestWinDlg::OnBnClickedButton7)
END_MESSAGE_MAP()


// CTestWinDlg 消息处理程序

BOOL CTestWinDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_EDITLABELS | LVS_REPORT;
	m_list.CreateEx(WS_EX_CLIENTEDGE, dwStyle, CRect(30, 110, 300, 260), this, 8921);
	m_list.InsertColumn(0, _T("工号"), 0, 100);
	m_list.InsertColumn(1, _T("姓名"), 0, 100);
	m_list.InsertColumn(2, _T("工资"), 0, 100);

	HWND hWnd = ::GetDlgItem(m_hWnd, IDC_EDIT1);
	m_edit.Attach(hWnd);
	hWnd = ::GetDlgItem(m_hWnd, IDC_BUTTON1);
	m_dest.SubclassWindow(hWnd);
	m_cret.SubclassDlgItem(IDC_BUTTON2, this);
	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	ShowWindow(SW_MAXIMIZE);

	// TODO:  在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTestWinDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CTestWinDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTestWinDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
void CTestWinDlg::OnBnClickedButton1()
{
	DestroyWindow();
}


void CTestWinDlg::OnBnClickedButton2()
{
/*
	if (!m_list)
		m_list.CreateEx(WS_EX_CLIENTEDGE,_T("SysListView32"), NULL, WS_VISIBLE | WS_CHILD|LVS_REPORT, CRect(30, 110, 300, 260), this, 8921);*/
}
void CTestWinDlg::OnBnClickedButton3()
{
	CWnd * pWnd = GetDlgItem(IDOK);
	if (pWnd)
	{
		HWND hWnd = pWnd->GetSafeHwnd();
		if (pWnd)
			pWnd->DestroyWindow();
	}
}

void CTestWinDlg::OnBnClickedButton4()
{
	HWND hWnd=::GetDlgItem(m_hWnd, IDOK);
	CWnd *p = CWnd::FromHandle(hWnd);
	p->SetWindowText(L"临时对象");
}

void CTestWinDlg::OnBnClickedButton5()
{
	m_edit.SetWindowTextW(L"长期有效");
}
void CTestWinDlg::OnEnChangeEdit1()
{

}

void CTestWinDlg::OnDestroy()
{
	CDialogEx::OnDestroy();
	m_dest.UnsubclassWindow();
	m_edit.Detach();
	
}


void CTestWinDlg::OnBnClickedButton6()
{
	DWORD dwStyle = m_list.GetStyle();
	m_list.ModifyStyle(0, LVS_NOSORTHEADER | LVS_SHOWSELALWAYS);
}
void CTestWinDlg::OnBnClickedButton7()
{
	DWORD dwExStyle = m_edit.GetExStyle();
	m_edit.ModifyStyleEx(dwExStyle,0);
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、问题描述 课题1:排序。要求从键盘上输入若干个人名,当输入完毕后,能显示正确的顺序。 课题2:编写一个似于TT的英文打字测试程序。要求输入的字符能在屏幕上显示并报告所用时间。 二、设计思想 课题1:排序。程序分3个部分 (1) 等待用户输入数个人名,即输入字符串。本程序设定输入人名数为5到15个,运用了2个函数(input1,input2)实现。 定义 data1 db 21,0,22 dup('$') ;用于存放第一个字符串 data2 db 21,0,22 dup('$') ;用于存放第二个字符串 data3 db 21,0,22 dup('$') ;用于存放第三个字符串 data4 db 21,0,22 dup('$') ;用于存放第四个字符串 data5 db 21,0,22 dup('$') ;用于存放第五个字符串 data6 db 21,0,22 dup('$') ;用于存放第六个字符串 data7 db 21,0,22 dup('$') ;用于存放第个字符串 data8 db 21,0,22 dup('$') ;用于存放第八个字符串 data9 db 21,0,22 dup('$') ;用于存放第九个字符串 dataa db 21,0,22 dup('$') ;用于存放第十个字符串 datab db 21,0,22 dup('$') ;用于存放第十一个字符串 datac db 21,0,22 dup('$') ;用于存放第十二个字符串 datad db 21,0,22 dup('$') ;用于存放第十三个字符串 datae db 21,0,22 dup('$') ;用于存放第十四个字符串 dataf db 21,0,22 dup('$') ;用于存放第十五个字符串 input1实现前五个字符串的输入,调用0A号功能实现输入,当用户没有输入字符而直接回车时,程序会判断为输入错误,直到输入字符为止,此时按下回车,会转到下个字符串的输入。 input2实现后10个字符串的输入,调用0a号功能实现输入,当用户没有输入字符而直接回车时,程序会判断用户选择结束输入,跳转出input2函数。实现了用户连续按两下回车(注意:第一个回车为前一个字符串的结束回车,此后再按一次回车就表示退出),直接退出输入的功能。 (2)人名排序,即字符串排序。 采用冒泡排序的方法,进行双重循环,内循环实现字符串的比较交换,若前一 个字符串大则跳转去交换,小或者相等则跳转去比较下两个字符串。 外循环是在内部循环结束后继续从第一个字符串开始跳转到内部循环,保证顺序排好。 另外字符串本身的比较也是一重循环,以字符串结尾符号'$'控制比较次数。 交换部分则是两个存储单元的完全交换(从第一个字符到最后一个字符)。 (3)输出排序好的人名 最后将排序好的字符串依次输出在屏幕上。 三、课程设计体会 在此次课程设计,我与吕鑫等人一组,我们综合利用了80X86汇编语言程序设计这门课所学的所有知识,实践操作了多种指令的功能,丰富了用汇编语言编程的经验。也从体会到了用汇编编程的难处。 在以小组为单位的课程设计制作过程,我与其他组员相互讨论、配合,最后共同完成了2个课题要求的程序编写,极大提升了我团队共同合作的编程经验,受益匪浅。也提高了我分析问题、解决问题的能力。 课题2:TT英文打字测试程序要求程序有3功能 (1)在屏幕上输出一条字符串; 在程序定义几段字符串 STR1 DB 'ABCD EFGH IJKL MNOP QRST UVWX YZ.' STR2 DB 'THERE ARE SOME NEWSPAPERS ON THE TABLE.' STR3 DB 'THERE ARE SOME CLOUDS IN THE SKY.' STR4 DB 'SHE ALWAYS EATS HER LUNCH AT NOON.' STR5 DB 'I DO NOT LIKE AUTUMN AND WINTER.' 运行时,在屏幕上依次输出这几段字符串,每输出一段字符串,便开始等待用户从键盘输入字符。 (2)从键盘上读入字符,并显示在屏幕上,以回车键结束输入; 首先用 INT 21H 从键盘读入一个字符,将读入的字符放入AL,判断该字符是否是回车,若不是回车则马上用INT 10H 在当前光标位置上显示AL的字符,若是回车则结束从键盘上读入字符。 (3)对从键盘上读入字符的过程计时,并在输入结束后,将输入用时显示在屏幕上。 定义 SEC DW 0 ;sec表示秒钟 MIN DW 0 ;min表示分钟 HOURS DW 0 ;hours表示小时 将它们初始化为0。 输入字符结束后,依次将hours、min、mours赋值给ax,并输出在屏幕上,以分号隔开。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值