VC++日记(非模态,自定义消息,窗体移动……)
2011年07月07日
1:如何做非模态对话框[/b]
1)非模态对话框就是要控制对话框,不让它接管所有的消息循环。而DoModal()函数事实上就是“劫持”了所有的消息循环,只要它没有返回,任何“非该对话框消息”都会被忽略。事实上,如果我们避开使用DoModal(),我们就避免了这一层限制。我们重载对话窗的
[b]BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 函数,在用到该对话窗的时候,像创建任意一个CWnd一样,使用Creat来创建就可以了。当然,如果这样的话,很多数据成员的初始化工作就最好放到这里了。另:注意要调用基类的Creat函数,下面是重载Creat的一个实例:
BOOL myDlg02::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
m_bCapture = FALSE;
CRect rect1;
m_pview->GetWindowRect(rect1);
m_pointToLeft = rect1.TopLeft();
m_sizeOffset = CSize(0,0);
return CDialog::Create(IDD, pParentWnd);
}
2)使用非模态对话框时候,必须注意对话框跟视图类的“对话”。所以,我们往往提供一个Cview指针成员,用来和拥有该对话框的视图“沟通”。下面是一个例子:
class myDlg02 : public CDialog
{
…[/b]
[b]…[/b]
[b]public:
myDlg02(CWnd* pParent = NULL); // standard constructor
myDlg02(CView* pview);
myDlg02(){m_pview=NULL;}
CSize m_sizeOffset;
CPoint m_pointToLeft;
BOOL m_bCapture;
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
protected:
CView* m_pview;[/b]
[b]…[/b]
[b]…[/b]
[b]}
同时呢,m_pview往往也是从对话框所发消息的目的地:
void myDlg02::OnOK()
{
if (m_pview!=NULL)
{
UpdateData(TRUE);
m_pview->PostMessage(WM_NICETOYOU,IDOK);
}
else
CDialog::OnOK();
}
void myDlg02::OnCancel()
{[/b]
[b] if (m_pview!=NULL)
m_pview->PostMessage(WM_GOODBYE,IDCANCEL);[/b]
[b] else[/b]
[b] CDialog::OnCancel();[/b]
[b]}[/b]
[b]上面的代码重载了OnOK和OnCancle函数,相当于控制了OK,Cancle按钮的行为――让该对话框的拥有者来控制它们好了~~
2:如何使用用户消息[/b]
先明白一点:消息是发送出去了,那么由谁来处理呢?――自然是接收消息的“客户”了啊。所以,消息响应函数必须由客户负责。那么,用户自定义消息的消息响应函数的格式是怎样的呢?――
[b]afx_msg void OnmyDlgGBOK(WPARAM wParam,LPARAM lParam);
afx_msg void OnmyDlgGBCancle(WPARAM wParam,LPARAM lParam);
(在视图类的头文件中声明之)[/b]
[b]还要在消息映射表中添加:[/b]
[b] ON_MESSAGE(WM_NICETOYOU,OnmyDlgGBOK)
ON_MESSAGE(WM_GOODBYE,OnmyDlgGBCancle)
(在视图的CPP文件的消息映射表中添加)[/b]
[b]其中WM_NICETOYOU 、WM_GOODBYE是消息识别号。[/b]
[b]这样,只要在必要的时候用视图的指针向视图发送消息,加上上面的链接,我们的消息响应函数就可以调用了。[/b]
[b]另:介绍一下BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 )和 [/b]
[b]LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 )这两个函数。首先,至于他们关于寄送和发送的区别就不谈了,关键要注意他们的参数。第一个参数是消息识别号,第二个和第三个参数是发给消息响应消息的参数,正好与消息响应函数的参数列表对应。WPARAM和LPARAM这两个类型其实际上是Long,也就是说,它们实质上是void指针,可以是任何类型的化身,可以根据实际情况灵活的运用它们。
3:如何动态控制窗体的位置和大小
MoveWindow(CRect(m_pointToLeft,size),TRUE);
那么,如何向在标题栏上一样对整个对话框或者窗体进行动态移动呢?
{
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
CSize m_sizeOffset;
CPoint m_pointToLeft;
BOOL m_bCapture;
}
{
void myDlg02::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
ClientToScreen(&point);
m_sizeOffset = point - m_pointToLeft;
m_bCapture = TRUE;
SetCapture();
CDialog::OnLButtonDown(nFlags, point);
}
void myDlg02::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bCapture = FALSE;
ReleaseCapture();
CDialog::OnLButtonUp(nFlags, point);
}
void myDlg02::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_bCapture)
{
ClientToScreen(&point);
m_pointToLeft = point - m_sizeOffset;
CRect rect;
GetWindowRect(rect);
CSize size(rect.Width(),rect.Height());
this->MoveWindow(CRect(m_pointToLeft,size),TRUE);
CDialog::OnMouseMove(nFlags, point);
}
}
BOOL myDlg02::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
m_bCapture = FALSE;
CRect rect1;
m_pview->GetWindowRect(rect1);
m_pointToLeft = rect1.TopLeft();
m_sizeOffset = CSize(0,0);
return CDialog::Create(IDD, pParentWnd);
}
}
不知道为什么,在做窗体的移动时候如果使用客户坐标,移动的窗体老是出现跳动和闪烁,而改成屏幕坐标,这个问题就神秘的解决了。[/b]
[b]4:如何控制窗体的初始化大小(最大,最小,默认)[/b]
vc++ 窗口最大化方法
一般的做法是在 C**App::InitInstance()中,修改成这样:
[b]{
//..
…[/b]
[b]m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();
return TRUE;..
}
或者,还在 CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,添加:
{
//...
cs.style |= WS_MAXIMIZE;
//...
}
但是,这种方法的最大化会体现出窗体的有效变大的过程,这个是因为在ShowWindow之前,还有地方显示了窗体,做法是:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
//在ParseCommandLine之后,ProcessShellCommand之前,添加这句!!!
m_nCmdShow = SW_SHOWMAXIMIZED;
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();
5:如何控制控件的层叠次序[b][/b]
Ctrl+d,单击控件,会看到控件上的代号会变化,代号小的更底层。
发表评论
-
Python GUI编程-了解相关技术[整理]
2012-01-20 09:39 1152Python GUI编程-了解相关技术[整理] 2011年0 ... -
Python笔记――python简介、特点、安装及helloworld
2012-01-20 09:39 666Python笔记――python简介 ... -
给C++程序员的Python初学指南 / Guide to Python for C++ Programmers
2012-01-20 09:39 737给C++程序员的Python初学指南 / Guide to P ... -
深入Python3 (Dive Into Python3)笔记11--文件
2012-01-20 09:39 936深入Python3 (Dive Into Python ... -
eclipse开发python+qt
2012-01-20 09:39 1106eclipse开发python+qt 2011年05月12日 ... -
穿越亚细亚行笺[18国家和地区旅行攻略]-转
2012-01-19 14:42 939穿越亚细亚行笺[18国家 ... -
外贸找客户的几十种方法,总有一种适合你
2012-01-19 14:42 1702外贸找客户的几十种方法,总有一种适合你 2011年08月20 ... -
办签证
2012-01-19 14:42 493办签证 2011年11月17日 去越南属于出国,必须办理 ... -
告别光棍有新法
2012-01-19 14:42 542告别光棍有新法 2011年02月28日 越 ... -
MFC消息处理和消息映射的概念
2012-01-17 04:27 652MFC消息处理和消息映射的概念 2011年08月25日 ... -
Windows SDK编程(Delphi版) 之 消息处理
2012-01-17 04:27 502Windows SDK编程(Delphi版) ... -
VC消息映射
2012-01-17 04:27 578VC消息映射 2010年08月14 ... -
在.net中基于Windows消息的IPC实现
2012-01-17 04:27 535在.net中基于Windows消息的IPC实现 2011年0 ... -
根在故乡
2012-01-16 03:17 659根在故乡 2011年12月06日 ... -
我心中完美男人的形象
2012-01-16 03:17 556我心中完美男人的形象 2011年12月18日 一 ... -
■反击关于盗墓一点也不腐つ
2012-01-16 03:17 595■反击关于盗墓一点也不腐つ 2012年01月07日 首先 ...
相关推荐
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果
VC非模式对话框
VC中模态对话框和非模态对话框的编程
VC++ 非模态对话框的实现实例+源代码VC++ 非模态对话框的实现实例+源代码
详解VC++模态对话框和非模态对话框
使用VC++环境创建模态对话框的源代码,打开既能运行。
非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本代码将从主框架窗口创建一个简单的非模态...
非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本例将从主框架窗口创建一个简单的非模态...
通过VC实现创建模态对话框的设计,供初学者参考。
…………………… 非显示区域鼠标消息 …………………… 程序中的命中测试 …………………… 拦截鼠标 …………………… 鼠标滑轮 8. 定时器 …………………… 定时器入门 …………………… 定时器的使用:...
1、主对话框启动后,以非模态方式调出子对话框; 2、在子对话框输入数据,点击“确定” 3、数据回传到主对话框的Edit,并显示。 4、完成回传。
…………………… 非显示区域鼠标消息 …………………… 程序中的命中测试 …………………… 拦截鼠标 …………………… 鼠标滑轮 8. 定时器 …………………… 定时器入门 …………………… 定时器的使用:...
一个对话框自定义消息,用来接收另一个对话框的消息。在vs2008下编译执行通过.
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果 .rar
…………………… 非显示区域鼠标消息 …………………… 程序中的命中测试 …………………… 拦截鼠标 …………………… 鼠标滑轮 8. 定时器 …………………… 定时器入门 …………………… 定时器的使用:三...
这个自定义的Delphi报表预览窗体是为了实现套打功能而弄的,预览时先调用这个自定义的,实际打印时再调用默认的。这需要2个frxReport,其中一个的Preview属性需设为自定义的这个,另一个默认就行,然后在自定义那个...
模态子窗体可以调用父窗体的任何函数方法,相当于在一个界面操作一样,超强的,顶!
消息驱动机制是Windows操作系统的根本,模态对话框消息处理又是不同于一般消息处理的特殊形式。通过分析这种消息机制的原理,可用来处理类似的程序设计要求。