PC Camera 开发日志(八)------ 通用多属性页对话框制作(General Setting Dialog)

上次主界面已经完成了。

然后先做了点击选项设置会跳出来的对话框。该对话框采用的风格与Manager的风格一样。

问题一:

界面上的按钮和静态文本有点丑。我还没有找到方法美化。找到的有些方法必须需要对应的图。我的美术功底不好。自己画图的话达不到我要的效果。

不过可以先记下界面上左边的CTreeCtl的使用:

1.如果单纯的只是构造一个Tree的目录。那么为加入的ACTIVEX控件TreeControl加入成员变量CTreeCtrl:m_treeCtrl;

加入父节点:

m_treeCtrl.InsertItem("首选项",0,0,TVI_ROOT);

参数为TVI_ROOT;

如果要为加入的节点添加子节点的话:

 HTREEITEM hTree;
 hTree =m_tctlSettings.InsertItem("首选项",0,0,TVI_ROOT);
 m_tctlSettings.InsertItem("界面设置",1,1, hTree);

这个时候“界面设置”就成为“首选项”的子节点。第二个和第三个参数可以先不用管。如果TreeControl没有关联的ImageList的话。

2.要为节点插入图标(BMP/ICON)都可以

插入BMP节点

 CImageList          *pImageList;
 CBitmap             bitmap;
 UINT                nID;
 pImageList = new CImageList();
 ASSERT(pImageList != NULL);    // serious allocation failure checking

// 18*18 为节点显示图片的大小;ILC_COLOR24为加载的图片的位图格式,最好和原始图对应
 pImageList->Create(18, 18, ILC_COLOR24, 5, 5);

 for (nID = IDB_BMTREEFIRST; nID <= IDB_BMTREELAST; nID++)  // load bitmaps 
 {
        bitmap.LoadBitmap(nID);
        pImageList->Add(&bitmap, (COLORREF)0x000000);
        bitmap.DeleteObject();
 }

 m_tctlSettings.SetImageList(pImageList, LVSIL_NORMAL);


 HTREEITEM hTree;

// 0,0 表示图片选择ImageList中的第几张图片;第一个0表示没有选中时图片,第二个0表示节点选中时图片
 hTree =m_tctlSettings.InsertItem("首选项",0,0,TVI_ROOT);
 m_tctlSettings.InsertItem("界面设置",1,1, hTree);

 hTree =m_tctlSettings.InsertItem("高级设置", TVI_ROOT);
 m_tctlSettings.InsertItem("驱动设置",2,2,hTree);
 m_tctlSettings.InsertItem("版权信息",3,3,TVI_ROOT);

 m_tctlSettings.InsertItem("关于",4,4,TVI_ROOT);

这些完成后就达到上面Tree的效果。

如果使用的是ICON图片的话。这些只写LoadIcon的方法

// pImageList->Add(AfxGetApp()->LoadIcon(IDI_FOLDER));
//pImageList->Add(LoadIcon(IDI_ICONLIST2));

问题二:

点击树中不同节点,右边要显示不同的内容。

我使用的方法是:我放置一个GroupBox在右边区域。然后放置一个对话框作为GroupBox的Child。该对话框是非模态对话框。在Initial主Dialog的时候创建Create,然后在点击树节点后才Show。

创建一个对话框控件:IDD_INFORMATION

其属性设置

利用ClassWinzard创建相应的类。InfoDialog.h和InfoDialog.cpp

然后在主对话框头文件中包含,在主对话框类COptionDialog中声明成员变量: CInfoDialog infoDlg;

在类COptionDialog::OnInitDialog() 里面创建

 CWnd *outBorder = GetDlgItem(IDC_OUTBORDER);
 infoDlg.Create(IDD_INFORMATION,outBorder);

// outBorder就是指向对话框中GroupBox对象的指针;

在树节点的DBClick响应函数中ShowDialog

void COptionDialog::OnDblclkSettingtree(NMHDR* pNMHDR, LRESULT* pResult)
{
 // TODO: Add your control notification handler code here
 CString name;
 HTREEITEM hItem = m_tctlSettings.GetSelectedItem();

    name = m_tctlSettings.GetItemText(hItem);
 if(name == "关于")
 {
  infoDlg.ShowWindow(SW_SHOW);
 } 
 *pResult = 0;
}

问题三:一般来说,在VC6的MFC中自己拖进来的控件,都有一个灰灰的背景。在我的有了皮肤的主对话框上CInfoDialog infoDlg很丑。

我刚开始的解决方法是把放入的Dialog的背景色改掉。(其实后面换了种方法)

记录改变控件背景的方法一

重载CWnd的WM_ERASEBKGND函数

BOOL CInfoDialog::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default

 CBrush   brush,   *oldBrush;  
 RECT   rect;  
 this->GetWindowRect(&rect);  
   
 brush.CreateSolidBrush(RGB(233,252,239));  
 oldBrush   =   pDC->SelectObject(&brush);  
 pDC->PatBlt(0,0,   rect.right-rect.left,rect.bottom-rect.top,   PATCOPY);  
 pDC->SelectObject(oldBrush);  
 brush.DeleteObject();   
    

  return   0;  

 //return CDialog::OnEraseBkgnd(pDC);
}

然后我发现我要在对话框上写字,这样这些静态文本也有灰灰的背景。很丑,这个时候找到另外一个方法去掉这个BKGND。这个方法同时解决了我主对话框上所以控件自动带灰背景的问题。

Groupbox里面的IDD_INFORATIONDIALOG控件

在类CInfoDialog中重载WM_CTRLCOLOR函数

HBRUSH CInfoDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
 // TODO: Change any attributes of the DC here
 if (nCtlColor == CTLCOLOR_STATIC)
 {
  pDC->SetBkMode(TRANSPARENT);
 }
 if(nCtlColor == CTLCOLOR_DLG)
 {
  pDC->SetBkMode(TRANSPARENT);
 }
 // TODO: Return a different brush if the default is not desired
 return hbr;
}

在MSDN中发现可以被控制的窗口上的控件有:

nCtlColor

Contains one of the following values, specifying the type of control:

  • CTLCOLOR_BTN   Button control

  • CTLCOLOR_DLG   Dialog box

  • CTLCOLOR_EDIT   Edit control

  • CTLCOLOR_LISTBOX   List-box control

  • CTLCOLOR_MSGBOX   Message box

  • CTLCOLOR_SCROLLBAR   Scroll-bar control

  • CTLCOLOR_STATIC   Static control

Tips:在设置这个的时候如果要达到透明效果。

Static对象的Styles里面必须选择 "Simple";

Dialog对象中Style里面选择

 问题四:如何把静态文本做成超链接。可以访问公司主页。

自己写个类继承了CStatic。然后处理一些事情就可以了。在这个超链接的类里面我们可以自己设置静态文本的不同状态显示不同颜色。然后鼠标移动到上面会有自定义的Cursor出现。

最后做成的效果

光标样子:

原代码请参考我上载的资源中:Skinned Dialog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值