笔者以前接触过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("应用程序向导生成的本地应用程序"));
<span style="background-color: rgb(255, 0, 0);">CMysqlClientDlg dlg;</span>
m_pMainWnd = &dlg;
<span style="background-color: rgb(255, 204, 255);">INT_PTR nResponse = dlg.DoModal();</span>
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));
这部分代码,基本上可以满足一般控件放置要求了。。。。。