📄 9922.txt
字号:
class CSimpleBrowseView : public CView/*CListView*/
{
...
// Attributes
public:
CThumbListCtrl m_ThumbListCtrl; // use thumb list control
// Operations
public:
void FormatList(CString csPath);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSimpleBrowseView)
protected:
virtual void OnInitialUpdate(); // called first time after construct
//}}AFX_VIRTUAL
...
// Generated message map functions
protected:
//{{AFX_MSG(CSimpleBrowseView)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
...
};
(1)将其父类由CListView改为CView,原因和上面的类似。
(2)加入CThumbListCtrl类的成员变量m_ThumbListCtrl,文件列
表的具体内容就是由它实现的。
(3)增加消息响应函数OnCreate(),在其中把m_ThumbListCtrl创
建起来,并初始化为缩图显示风格。
(4)增加消息响应函数OnSize(),使m_ThumbListCtrl总是占满
CSimpleBrowseView的区域。
(5)在OnInitialUpdate()中创建文件列表的栏目,调用
CThumbListCtrl::BuildColumns()。
(6)增加函数FormatList(),它被CLeftView::OnSelchanged()调
用,它则转而调用CThumbListCtrl::BrowseFolder()。点击左边的目
录树,右边的文件列表跟着改变,就是通过这一个函数来实现的。
具体修改请看源文件simplebrowseview.h和
simplebrowseview.cpp,都很简单。
3.其它事项CShellTree和CThumbListCtrl都是在MFC扩展类库中
实现的,要使用它们,必须:在编译阶段要有相应的.h文件,在连接
阶段要有相应的.lib文件,在运行阶段要有相应的.dll文件。因此还
要做一些配置:在leftview.h中加入#include "ShellTree.h",在
simplebrowseview.h中加入#include "ThumbListCtrl.h";选菜单项
Project->Settings,转到Link面板,在Object/library modules中加
入CJ60Lib.lib和thl.lib;将CJ60Lib.dll,thl.dll和
simplebrowse.exe放在同一目录下,注意thl.dll又使用到其它dll如
Convert20.dll,JPEG.dll,TIFF60.dll等,也要放在同一目录下。
第五步:编译、运行Rebuild All,Execute SimpleBrowse.exe,
一款简洁实用的图片浏览器浮出水面...大功告成!
制作心得:
我对这款图片浏览器的评价是:简洁,实用,值得一玩。
说其简洁,是因为我编写的代码不超过100行,调用的函数不超
过10个。这得归功于CJ60Lib.dll和thl.dll,它们都内置有强大的功
能,而外壳封装却十分简单。
说其实用,是因为这款图片浏览器实现了图片浏览的基本功能,
缩图相当好看,浏览速度够快,能浏览的图片格式也挺多。
用不超过100行的代码就搞出了这么一款简洁实用的图片浏览器,
DIY,乐趣无穷!
有兴趣的朋友,可到泰来公司网站www.thalia.com.cn下载
SimpleBrowse及其源码。
***********************************************************
如何在VC5中控制工具条的停靠位置
辽宁 宋立波
在VC5 中开发大型应用程序时,工具条通常是程序中必不可少的重要
功能因素,其中工具条在整个窗口中的停靠位置尤其关键,它直接影响到
程序界面的外观形象。下面针对笔者实际开发中各类工具条停靠位置的控
制过程,详细阐述其实现技巧。
一、标准工具条停靠位置的控制
VC5 应用程序向导生成的框架代码中,都具有普通工具条的控制方法。
正常情况下工具条类CToolBar是控制条类CControlBar 的派生类,其显示
的初始停靠位置是通过调用继承的函数CControlBar::EnableDocking(DWORD dwStyle)
来确定的,其参数dwStyle用来指定停靠具体位置,与本文有关的风格如下
(其余请参阅VC5的联机文档):
CBRS_ALIGN_TOP 停靠在框架窗口客户区域顶部
CBRS_ALIGN_BOTTOM 停靠在框架窗口客户区域底部
CBRS_ALIGN_LEFT 停靠在框架窗口客户区域左边
CBRS_ALIGN_RIGHT 停靠在框架窗口客户区域右边
CBRS_ALIGN_ANY 停靠在框架窗口客户区域任何位置
在利用应用程序向导AppWizard 生成的应用程序中,其控制代码默认
的停靠位置控制风格为CBRS_ALIGN_ANY,即允许停靠在框架窗口客户区域
的任何边上。工具条在正常显示时为停靠在窗口客户区域的顶部,控制指
令为EnableDocking(CBRS_ALIGN_ANY)或m_wndToolBar
。EnableDocking(CBRS_ALIGN_ANY) ,注意,在实际程序控制时前者
必须处于所有其它控制代码的前面,否则浮动工具条或特殊工具条等部分
代码可能无法奏效。具体控制方法请参考利用应用程序向导生成的任何一
个程序实例的框架代码部分中的建立函数ONCREATE()。
应用程序的单文档和多文档的窗口框架类均为CFrameWnd 的派生类,
其指定工具条的停靠位置均是通过调用继承的函数
CFrameWnd::EnableDocking(DWORD dwDockStyle)来实现的,其可选的参数
除上述五种之外,还增加了CBRS_FLOAT_MULTI参数,这个参数主要是为设
计浮动工具条而增加的,其用来确定一个框架窗口中允许存在多个浮动工
具条。同样,利用应用程序向导AppWizard 生成的应用程序,其默认的停
靠位置也是CBRS_ALIGN_ANY,即允许工具条停靠在框架窗口的任何边上,
其默认的初始位置为框架窗口的顶部,即为EnableDocking(CBRS_ALIGN_ANY)
或m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY)。
二、浮动工具条停靠位置的控制
如果在一个框架窗口中存在多个标准或浮动工具条时,需要利用函数
void DockControlBar(CControlBar *pBar,UINT nDockBarID=0,LPCRECT lpRect= NULL)
来确定要控制停靠位置的工具条,它也是CFrameWnd类的成员函数,其中
参数pBar用来指向被控制停靠位置的工具条对象指针,参数nDockBarID用
来确定工具条停靠在框架窗口的哪条边上,其控制风格的具体取值为:
AFX_IDW_DOCKBAR_TOP 停靠在框架窗口的顶部
AFX_IDW_DOCKBAR_BOTTOM 停靠在框架窗口的底部
AFX_IDW_DOCKBAR_LEFT 停靠在框架窗口的左边
AFX_IDW_DOCKBAR_RIGHT 停靠在框架窗口的右边
当参数nDockBarID的取值为0时,则工具条可以停靠在框架窗口中的
任何一个可停靠的边上,其默认的初始位置为窗口顶部。
三、并列工具条停靠位置的控制
很多大型应用程序中都存在这样的工具条,将多个工具条同时并列停
靠在某窗口的某一条边上。对于这种停靠方法,利用上述工具条控制函数
DockControlBar的lpRect参数,通过控制工具条的停靠矩形区域的方法可
以实现。如笔者实现的函数如下:
(一)在实现文件MainFrm.h中增加如下成员函数定义
void DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf);
(二)在实现文件MainFrm.cpp中增加如下成员函数
void CMainFrame::DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf)
{ //设置工具条并列停靠在同一条边上
CRect rect; //矩形区域定义
DWORD dw;
UINT n=0;
RecalcLayout();//重新显示
LeftOf->GetWindowRect(&rect);
rect.OffsetRect(1,0);//设置偏移值以停靠在同一边上
dw=LeftOf->GetBarStyle();
n=(dw&CBRS_ALIGN_TOP)?AFX_IDW_DOCKBAR_TOP:n;
n=(dw&CBRS_ALIGN_BOTTOM&&n==0)?AFX_IDW_DOCKBAR_BOTTOM:n;
n=(dw&CBRS_ALIGN_LEFT&&n==0)?AFX_IDW_DOCKBAR_LEFT:n;
n=(dw&CBRS_ALIGN_RIGHT&&n==0)?AFX_IDW_DOCKBAR_RIGHT:n;
DockControlBar(Bar,n,&rect);
}
在这个函数中应注意对RecalcLayout()函数和OffsetRect()函数的调用,
前一个函数用来重新显示被调整的客户区和工具条,后一个函数用来重新确
定矩形区域,这相当于利用鼠标将第二个工具条窗口拖动到前一个工具条上
然后释放。
(三)修改应用程序建立函数OnCreate()中的相应DockControlBar()函
数为DoctControlBarOf()函数,并正确设置工具条对象的指针,如笔者实现
程序中的控制代码如下:
EnableDocking(CBRS_ALIGN_ANY);//停靠位置必须在最前面
......//工具条建立函数
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndTestToolBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar,AFX_IDW_DOCKBAR_TOP);
//使两个工具条并列停靠
DockControlBarLeftOf(&m_wndTestToolBar,&m_wndToolBar);
四、工具条顶部停靠位置的控制
工具条的最后一种停靠位置控制方法是,如何控制定制工具条的停靠位
置,如具有通用控制功能工具条的停靠位置等。这主要实现左右两侧定制工
具条与顶部工具条之间谁靠近框架窗口边的位置关系。如笔者实现程序中的
控制步骤如下:
(一)打开菜单资源增加顶部位置控制菜单项IDD_DLGBARTOP;
(二)在实现文件MainFrm.h中增加成员控制变量m_bDialogTop;
BOOL m_bDialogTop;
并在构造函数中为其设置初始值;
(三)利用类向导ClassWizard为菜单项设置响应函数;
(四)在实现文件MainFrm.cpp中通过充分利用SetWindowPos( )成员完
善消息映射功能。
void CMainFrame::OnButtonDlgbartop()
{ //定制工具条顶部位置控制函数
if (m_bDialogTop) m_wndDlgBar.SetWindowPos(
&m_wndStatusBar,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
//顶部工具条停靠在窗口边,左右工具条停靠其下
else m_wndDlgBar.SetWindowPos(&wndTop,0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE);//停靠在最顶部
RecalcLayout(); //重新显示窗口
m_bDialogTop=!m_bDialogTop;//改变变量标志
}
void CMainFrame::OnUpdateButtonDlgbartop(CCmdUI* pCmdUI)
{ //设置菜单项检查状态更新函数
pCmdUI->SetCheck(m_bDialogTop);
}
这样,就可以利用菜单项来控制定制工具条的顶部停靠位置。
***********************************************************
如何在VB中判断Windows9x的运行模式
创意软件工作室 植国贤
在Windows下编程,经常发现有不少功能Windows系统已经做了,如果能
够直接调用,就可省去不少程序的编写,并能提高程序的运行效率。在很多
情况下,我们都可以用“Ctrl + X”、“Ctrl + C”、 “Ctrl + V”和
“Ctrl + Z”分别进行“剪切”、“复制”、“粘贴”和“撤消”操作,
由此想到,如果我们能够在程序中调用系统的这些功能,就无需为如何实现
这些操作而操心了。经过不断的探索,终于发现SendMessage和PostMessage
能够担此重任,真是如获至宝,于是迫不及待地把它们介绍给各位朋友。
用VB5的“API浏览器”可以很容易地找到这两个API 函数:
Declare Function SendMessage Lib “user32” Alias
“SendMessageA” _(ByVal hwnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, _lParam As Any) As Long
Declare Function PostMessage Lib “user32” Alias
“PostMessageA” _(ByVal hwnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, _ByVal lParam As Long) As Long
这两个函数的功能几乎是一样的,只是SendMessage是直接调用Windows
函数来发送消息,只有这个消息完全被处理后此函数才返回,而PostMessage
则给窗体的消息队列增加一个消息,这个消息将在未来某个时候进行正常事
件处理时得到处理。以下仅以SendMessage为例。
函数中虽然有四个参数,但关键的是前两个:hwnd 和wMsg。Hwnd是句柄,
Microsoft Windows应用程序中的每个窗体和控件都拥有一个句柄,通过句柄
可以指明函数的操作对象;wMsg是一个十六进制数,代表了函数要发送的具
体消息。
下面以具体例子说明如何用SendMessage实现“剪切”、“复制”、“粘
贴”、“撤消” 和“删除”功能:
在窗体中放置一个文本框Text1和五个按钮,分别执行以上五种功能,编
写以下程序。
Option Explicit
Private Declare Function SendMessage Lib “user32” Alias
“SendMessageA” _(ByVal hwnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, _lParam As Any) As Long
Const WM_CUT = &H300
Const WM_COPY = &H301
Const WM_PAST = &H302
Const WM_CLEAR = &H303
Const WM_UNDO = &H304
Dim fb As Long
Private Sub cmdClear_Click()
fb = PostMessage(Text1.hwnd, WM_CLEAR, 0, 0)
End Sub
Private Sub cmdCopy_Click()
fb = SendMessage(Text1.hwnd, WM_COPY, 0, 0)
End Sub
Private Sub cmdCut_Click()
fb = SendMessage(Text1.hwnd, WM_CUT, 0, 0)
End Sub
Private Sub cmdPast_Click()
fb=SendMessage(Text1.hwnd, WM_PAST, 0, 0)
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -