1、今天做了个类似于GUI_WINZIP工程的工程。做法和需要注意的地方如下(9月15日):首先在FRAME类的头文件中声明如下类型的对象:
CXTToolBar m_wndHighColorTB1;//toolbar对象
CImageList m_ilHighColor1Gray;//在本例中用于存储那些灰的图标
CBitmap  m_bmpHighColor1Gray;//CImageList对象的创建需要用CBitmap对象来初始化
然后在OnCREA TE函数中进行初始化工作:
// create the first high color toolbar
if (!m_wndHighColorTB1.CreateEx(this, TBSTYLE_FLA T, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(0, 0, 0, 0)) || !m_wndHighColorTB1.LoadToolBar(IDR_HIGHCLR1))//创建CXTToolBar 对象,并
//用IDR_HIGHCLR1资源进
//行初始化。此处需要注意的是,IDR_HIGHCLR1
/
/资源是插入的toolbar资源,图需要自己画,并不
//能用res文件夹里的bmp文件来初始化。在画控
//件按钮的同时,还要添加相应的消息相应函数,
//不然生成的按钮是灰的。
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
//照着复制就行
m_wndHighColorTB1.SetWindowText(_T("High Color Toolbar 1"));
m_wndHighColorTB1.SetDropCommandWithText(true);
m_wndHighColorTB1.SetCustomBar(true);
//设置Disable状态时的toolbar图标
if ( CreateDisabledImageLists( ) )//CreateDisabledImagelist()函数通过在位图资源中
//的位图来创建一个CBITMAP对象,并用CBITMAP对象初始
//化CImageList对象;详见CreateDisabledImagelist函数的定义,
//在后面。
{
m_wndHighColorTB1.SetImageList(m_ilHighColor1Gray, FALSE);//该语句设置了
//Toolbar在
//disabled状态下
//的图标,用参数
/
resize函数c++/False表示。
}
// add text to
int iButton; //tb1TEXTMAP[IBUTTON]是一个结构体数组,存放了
//各toolbar按钮的ID和相对应的TEXT字符串。
for (iButton = 0; iButton < _countof(tb1TextMap); ++iButton)
{
m_wndHighColorTB1.SetButtonText(m_wndHighColorTB1.CommandToIndex( tb1TextMap[iButton].nCmdID), tb1TextMap[iButton].lpszText);
}
//用Classwizard设置各toolbar按钮的状态。
void CMainFrame::OnUpdateHighcolorNew(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable( 0 );
}
//最后给出CreateDisabledImageLists函数的定义。
bool CMainFrame::CreateDisabledImageLists()
{
if ( !m_ilHighColor1Gray.Create( 42, 35, ILC_MASK|ILC_COLOR24, 8, 1 ) )//CImageList 对象的创建
{
TRACE0( "Failed to create image list.\n" );
return false;
}
m_bmpHighColor1Gray.LoadBitmap( IDB_HIGHCLR1_GRAY );//加载位图资源
m_ilHighColor1Gray.Add( &m_bmpHighColor1Gray, RGB( 0x00,0xff,0x00 ) );//用位图资
//源初始化CImageList。
return TRUE;
}
至此,运行程序即可显示出窗口,虽然有点丑~
2、今天下午又模仿做了一个BrowerDialog工程,用于实现选择文件夹对话框的实现:
首先说一下:example工程中的CXXXDlg类都是从CXTResizeDialog类派生出来的,而我自己生成的DialogBased对话框则是从CDialog类派生出来的,因此要做的第一件事就是#define CDialog CXTResizeDialog
CXTResizeDialog is a multiple inheritance class derived from CDialog and CXTResize. CXTResizeDialog is used to create a resizable CDialog type object that allows its dialog items to be resized or moved dynamically.(由此可见CXTResizeDialog类与CDialog 类的主要区别就是能够使对话框中的控件动态的跟随对话框的大小变化而变化)。
再说下面两个函数,分别是用来将对话框的位置和大小信息插入到注册表中,下次打开时会保存相应的信息。
SavePlacement(_T("CBrowseDialogDlg"));//应该放到OnDestory()函数中去、
LoadPlacement(_T("CBrowseDialogDlg"));//应该放到OnInitDialog()函数中去。
除了在OnInitDialog() 函数中加入LoadPlacement(_T("CBrowseDialogDlg"));语句之外,还应该加入这样的代码,用来实现resize功能的设置:
// Set control resizing.
SetResize(IDC_EDIT2, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_EXIT, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
SetResize(IDC_Browse, SZ_BOTTOM_RIGHT, SZ_BOTTOM_RIGHT);
SetResize(IDC_STA TIC, SZ_TOP_LEFT, SZ_TOP_RIGHT);
// prevent vertical resizing,这个可有可无。
SetFlag(SZ_NOVERTICAL);
UpdateData()函数的用法:
当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)
在OnBrowse() 函数(也就是对Browse按钮的消息响应函数)应该如下写代码:
if(UpdateData(TRUE))
{
CXTBrowseDialog dlg;
dlg.SetTitle(_T("Select Y our Directory"));
if (!m_strDirectory.IsEmpty())
{
TCHAR path[_MAX_PA TH];
_tcscpy(path, m_strDirectory);
dlg.SetSelPath(path);//该函数设置了初始化的路径。
}
if (dlg.DoModal() == IDOK)
{
m_strDirectory = dlg.GetSelPath();
UpdateData(FALSE);
}
}
OnExit()函数是Exit按钮的消息响应函数,在其中调用CDialog::DestroyWindow()即可。
3、顺便把BrowseEdit的模拟也给做了吧~(9月15日下午4点半)
在上一个例子中,用的主要是CXTBrowseDialog类,来实现文件夹选择对话框。在该例子中,主要是用一个叫CXTBrowseEdit类来实现文件、文件夹或是POPUP菜单的选择。
首先对该类做一个简单的介绍:
CXTBrowseEdit is a CXTEdit derived class. This class also has a push button associated with it. The control can be used to search for directories and files, or activate a popup menu.
由此可见,若要使用此类,则需要在对话框上画一个EditBox控件(当然前提是DialogBased 工程),然后将该控件关联到一个CEdit类中,然后修改程序使之成为一个CXTBrowseEdit 对象。如果是一个SDI工程,则需要自己用CWnd ::Create()函数来手动创建一个控件了(因为CEdit和CXTBrowseEdit 都是CWnd的派生类)。
要做的第一步就是:
在对话框中添加三个EditBox控件,用Classwizard分别为其创建变量,并定义为CEdit类。在头文件声明中将CEdit替换为CXTBrowseEdit。
第二步:
如果你编辑的控件如果想让其对PopUp菜单有所相应的话,那么第二步就是在资源中插入一个POPUP Menu资源。
第三步:在CXXXDlg类的构造函数中添加如下代码(经过试验添加到OnInitDialog()函数中也是可行的,添加到OnCreate函数中也没啥问题,都是可行的):
m_editMenu.SetBrowseStyle(BES_XT_POPUPMENU, IDR_POPUP);//用来选择popup菜
//单的控件m_editDir.SetBrowseStyle(BES_XT_CHOOSEDIR);//用来选择文件夹的控件
m_editFile.SetBrowseStyle(BES_XT_CHOOSEFILE);//用来选择文件的控件
在OnInitDialog()函数中初始化控件的resize属性:
// Set control resizing.
SetResize(IDC_EDIT1, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_EDIT2, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_EDIT3, SZ_TOP_LEFT, SZ_TOP_RIGHT);
// prevent vertical resizing.
SetFlag(SZ_NOVERTICAL);
至此,虽然我们没有做什么,但是选择文件和文件夹的控件已经初始化完毕了,而且可以使用了,选择一个文件或者文件夹,可以自动的添加到了控件中去。
至于对于POPUP菜单的控件,还需要进一步的设置各个子菜单的消息响应函数才行。
比如:
void CBrowseEditDlg::OnPopup1()
{
m_editMenu.SetWindowText(_T(""));
}
4、2010年9月16上午9:30左右开始模拟Button工程:
囧~做的时候和老婆聊太多了结果没做好~
但说些基础的也还是可以的:
首先说说Radio Button控件的使用方法吧:
Radio Button成组使用时,只需保证在添加控件时资源号连续(也就是说是连续添加的,打开对话框窗口并按CTRL+D即可看到并修改序号),并且第一个Radio Button的属性中Group被选中。这样就可以给这一组控件添加成员变量使用:
例:
1.建立一个基于对话框的应用程序,添加三个Radio Button,
选中第一个Radio Button属性中的Group 。然后给打开classwarizd为raido1关联一个int型变量(同样需要先分组)m_state,打开对话框构造函数,你会发现有:
m_state = -1;m_state 别赋值-1表示哪个都没有选上。如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_state 的值为1 就是第二个被选上了。
然后对三个radio button分别添加其对鼠标单击消息的响应函数,函数名应一致。
在消息响应函数中获取状态(UpdateData(TRUE))后判断m_state 的值即可。UpdateData();
switch(m_state)
{
case 0:
MessageBox("state 0");
break;
case 1:
MessageBox("state 1");
break;
case 2:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。