自定义“浏览文件夹”对话框 - 第二部分






3.60/5 (9投票s)
2003年4月27日
2分钟阅读

64746

1646
添加和子类化自定义控件
引言
这是我关于自定义“浏览文件夹”对话框主题的第二篇文章,在上一篇文章 (自定义“浏览文件夹”对话框 第一部分) 中,我们已经了解了如何在浏览文件夹对话框上添加标题和编辑框。
在之前的代码中,我们已经了解了如何在对话框上添加简单的控件,但是有些人无法添加自定义控件,例如“复选框”,“按钮”以及与它们交互,因此我专门写这篇文章来介绍如何与这些控件交互并将它们添加到对话框中。
逻辑
如果您熟悉 WIN32API,我认为下面给出的代码非常容易理解。该代码对控件进行子类化,然后我们可以通过我们的程序与它们交互。 该代码使用简单的函数,例如 SendWindowLong
来对对话框控件进行子类化。 一旦控件被子类化,一切都归您所有。 您可以像往常一样处理消息,然后可以像常规消息一样处理消息。
创建控件
为了创建控件,我使用了 CreateWindowEx
函数,但是在这里,对于复选框,类是“BUTTON”,标志是 BS_AUTOCHECKBOX
,这将创建复选框。代码如下所示...
edit=CreateWindowEx(0,"EDIT","Yogesh M Joshi.",WS_CHILD|WS_VISIBLE|WS_BORDER| ES_AUTOHSCROLL,0,100,100,50,hwnd,0,ghInstance,NULL); checkbox = CreateWindowEx(0,"BUTTON","Show the edit control.", WS_CHILD|WS_VISIBLE| WS_CLIPCHILDREN|BS_AUTOCHECKBOX,0,100,100, 50,hwnd,0,ghInstance,NULL);
在这里,edit 和 checkbox 给出了相应控件的句柄。
子类化控件
控件的子类化是非常重要的事情,因为我们正在与控件交互。实际上,我们没有浏览文件夹对话框的主对话框过程,因此,我在 BFFM_INITIALIZED
消息中对复选框进行子类化。 这为我们提供了一个更好的方法,因为控件只是正在被创建。 这里,WNDPROC
声明了必须返回的默认窗口过程,命名为 CBProc
。这将按以下方式进行。
// Subclass the checkbox control.
CBProc = (WNDPROC) SetWindowLong(checkbox,GWL_WNDPROC,
(LONG) CheckBoxSubclassProc);
这里的 CheckBoxSubClassProc
是将处理消息的子类过程。 如下面所显示...
// Subclass procedure LRESULT APIENTRY CheckBoxSubclassProc(HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam) { . . . . . return CallWindowProc(CBProc, hwnd, uMsg, wParam, lParam); }
处理消息
为了处理由“浏览文件夹”对话框的主窗口过程发布的消息,我们声明了上述过程。 然后将以下代码放入该过程。(我使用了 LBUTTONUP
消息,我没有得到 CLICK 消息的结果)。这里 ShowWindow
函数将通过 SW_HIDE
或 SW_SHOW
标志设置编辑控件的可见性。
if(uMsg==WM_LBUTTONUP) { if((SendMessage(hwnd,BM_GETCHECK,0,0))==1) { ShowWindow(edit,SW_HIDE); } else { ShowWindow(edit,SW_SHOW); } }
通过这种方式,我们可以添加和子类化“浏览文件夹”对话框上的控件。 我认为您将通过这段代码获得“WINAMP”风格的浏览文件夹对话框。 这还没有结束,请等待本文的第三部分。 单击以下链接与我联系或访问我的网站以获取 COOL 程序。给我发邮件:yogmj@hotmail.com。 访问我的网站:http://www.stechome.netfirms.com/