MFC--1.初始化对话框位置与大小

笔者以前接触过MFC界面程序的开发,不过以前主业主要是底层芯片内的程序开发,用MFC开发的PC软件也只是个调试的手段,做的时候也只在乎功能是否具备,对一些稍微基础的知识并未去学习,现在正好有个机会要开发个客户端软件,基础的知识还是要补习一下的。。。

      以前用控件的话 也只是在VC6.0下,直接拖上去,然后添加消息函数,然后写消息处理函数,今天暂时用到用代码控制窗体和控件的大小以及摆放的位置,话不多说。。上图上代码:


MFC 程序的一般执行流程(抛开封装好的winmain),直接落实到工程中的代码,


1.首先声明一个全局的类对象:

// 唯一的一个 CMysqlClientApp 对象

CMysqlClientApp theApp;

2.然后进入自己的类初始化函数:

BOOL CMysqlClientApp::InitInstance()
{
//	AfxMessageBox(_T("CMysqlClientApp::InitInstance"));
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();

	AfxEnableControlContainer();

	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小,则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串,
	// 例如修改为公司或组织名
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

	CMysqlClientDlg dlg;
	m_pMainWnd = &dlg;

	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: 在此处放置处理何时用“确定”来关闭
		//  对话框的代码
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 在此放置处理何时用“取消”来关闭
		//  对话框的代码
	}

	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
	//  而不是启动应用程序的消息泵。
	return FALSE;
}
3.程序执行到深红色部分,自然开始调用CMysqlClientDlg类的构造函数:

CMysqlClientDlg::CMysqlClientDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMysqlClientDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
4.执行完构造函数后开始模态显示对话框(粉色部分),开始初始化主窗口:

// CMysqlClientDlg 消息处理程序

BOOL CMysqlClientDlg::OnInitDialog()
{


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

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

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

5.开始进行窗体重绘:

void CMysqlClientDlg::OnPaint()



整个流程是这个样子的,,那我们初始化主窗口大小位置放在哪个地方哪,,,

很显然 要么放在

BOOL CMysqlClientDlg::OnInitDialog()
函数中要么放在重绘函数OnPaint()中,,,之间的不同,,,很简单,,

使用CWnd类的MoveWindow函数很简单,,自适应各种分辨率的窗口防止函数如下:

/* 获取屏幕大小 */
	int xSize = ::GetSystemMetrics (SM_CXSCREEN);
	int ySize = ::GetSystemMetrics (SM_CYSCREEN);
	//设置窗口大小
	int cx = (xSize*2)/7;
	int cy = (ySize*3)/7;
	//设置显示位置
	int x = (xSize-cx)/2;
	int y = (ySize-cy)/2;

	//设置主窗口位置和大小
	CWnd::MoveWindow(CRect(x,y,cx+x,cy+y));

	
	//设置标题
	CWnd::SetWindowText(_T("LOG ON"));

	
	CWnd *pWnd;
	//设置静态文本
	//服务器地址
	pWnd = GetDlgItem(IDC_STATIC_SERVER_HOST);
	pWnd->MoveWindow(CRect(120,122,180,140));
	pWnd = GetDlgItem(IDC_EDIT_SERVER_HOST);
	pWnd->MoveWindow(CRect(190,120,330,140));

这部分代码,基本上可以满足一般控件放置要求了。。。。。





你可能感兴趣的:(MFC)