博文

转自绘按钮控件属性自绘属性的保持(2008-02-27 17:39:00)

摘要:由于标准的按钮控件在样式上比较单调,因此,在很多时候,我们都需要对标准按钮控件实行自画,以满足特定的需求。为了能让按钮控件支持自画,需要设置按钮的BS_OWNERDRAW风格,一般情况下,我们可以在PreSubclassWindow中进行设置:
class CxxxButton : public CButton
{
...
};

void CxxxButton::PreSubclassWindow()
{
     ModifyStyle( 0, BS_OWNERDRAW);
    CButton::PreSubclassWindow ();
}
这样,我们就可以重载DrawItem,从而按照自己的意愿对按钮进行自画。

        但是,在实际环境中,我们经常发现这样的bug:我们明明已经对某个按钮控件进行了子类化了,并且开始的时候,该按钮也确实是自画的,可以满足当前的需求。但是在进行了一些其它的操作之后,发现该按钮有变为了标准的按钮了,自画属性已经不翼而飞了!这可不是我们所希望的。
       那么,该如何让按钮在不管进行了什么操作之后,还能保持自画的风格呢?从MSDN中找到了解决的方法:截获BM_SETSTYLE的消息。从MSDN中,可以了解到,应用程序在改变按钮的风格的时候,会给按钮发送BM_SETSTYLE的消息。我们在按钮处理该消息之前截获它,然后修改消息参数为符合自己需求的风格,这样就不怕应用程序在暗地里捣鬼了。部分代码如下:

1、消息声明:
afx_msg LRESULT OnSetStyle ( WPARAM wParam, LPARAM lParam );

2、消息映射:
ON_MESSAGE ( BM_SETSTYLE, OnSetStyle )

3、实现修改风格:
LRESULT CxxxButton::OnSetStyle ( WPARAM wParam, LPARAM lParam )......

阅读全文(2214) | 评论:0

【原】按钮的自绘(2008-01-30 16:55:00)

摘要:OnDrawItem 注意如果在CButton基础上有虚函数 在类内直接通过该消息修改外观 有了hDC,CDC也有了,CDC有了,自绘还会远吗? void CTestDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 CDC ButtonDC;
 CBitmap bitmapTrans;
 BITMAP bmp;
 CRect rc;
 CDC mem;  ButtonDC.Attach(lpDrawItemStruct->hDC);
 mem.CreateCompatibleDC(&ButtonDC);
 rc=lpDrawItemStruct->rcItem;
 UINT state = lpDrawItemStruct->itemState;
 if(state & ODS_FOCUS)
 {
  bitmapTrans.LoadBitmap(IDB_GETFOCUS);
  bitmapTrans.GetBitmap(&bmp);
  CBitmap  * old=mem.SelectObject(&bitmapTrans);
  ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
  mem.SelectObject(old);
  bitmapTrans.DeleteObject();
  ButtonDC.SetBkMode(TRANSPARENT);
  ButtonDC.DrawText("已选中",&a......

阅读全文(2579) | 评论:0

CSpinButtonCtrl使用说明(2007-11-27 13:39:00)

摘要:CSpinButtonCtrl使用说明 2007/05/11 14:01 CSpinButtonCtrl使用起来比较特殊,使用起来,需要注意一些地方.实际的教程也比较少.为了让后人少走弯路,这里写这篇文章以说明.
1.添加EDIT控件
2.添加Spin控件
如果不是这样的顺序的话,使用ctrl+D改变Tab顺序,使spin紧靠edit后面
3.在EDIT控件上面设置group属性(特别注意)
4.在Spin控件上设置
Auto Buddy 为 true
Set Buddy Integer 为 true
Alignment 为 Right Align
5.添加Edit控件 int 变量 m_nNumK;
这个时候点击向下应该可以增加数值
6.在OnInitDialog中添加以下语句
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1))->SetRange(-100, 100);
这个时候向上的箭头为增加,向下的箭头为减小. 大功告成.欢迎留言.     http://hi.baidu.com/dayet/blog/item/75ed0046524c28086b63e51f.html......

阅读全文(5911) | 评论:4

转CListCtrl使用指南有排序(2007-11-26 18:24:00)

摘要:CListCtrl使用指南 2007-06-05 17:24 创建图形列表并和CListCtrl关联:
m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192));
m_image_list.SetBkColor( GetSysColor( COLOR_WINDOW ) );
m_caller_list.SetImageList( &m_image_list, LVSIL_SMALL);
为报表添加4列:
   char *szColumn[]={"昵称","IP地址","登陆时间","状态"};
   int widths[]={100,98,70,55};
   LV_COLUMN lvc;
   lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
   lvc.fmt=LVCFMT_LEFT;
   for(int i=0;i<4;i++) {//插入各列
    lvc.pszText=szColumn[i];
    lvc.cx=widths[i];
    lvc.iSubItem=i;
    m_caller_list.InsertColumn(i,&lvc);
   }
为报表添加两项,以附加方式添加:
char* data[4];
data[0]="所有人";
data[1]="0.0.0.0";
data[3]="在线";
data[2]=new char;
CTime now=CTime::GetCurrentTime();
        CString temp = now.Format("%H:%M:%S");
......

阅读全文(4715) | 评论:0

转CListCtrl应用与排序(2007-11-26 17:59:00)

摘要: http://cache.baidu.com/c?word=vc%2Cclistctrl%3B%C8%E7%BA%CE%3B%C5%C5%D0%F2&url=http%3A//www%2Ezixi%2Enet/article/show%2Easp%3Fid%3D32246%26Page%3D1&p=9f63861e85cc4aff57efcd6f4e&user=baidu#baidusnap1 编程环境VC

初始化:
 DWORD dwStyle;
 dwStyle = m_bzlist.GetStyle();
 dwStyle = LVS_EX_GRIDLINES LVS_EX_FULLROWSELECTLVS_SHOWSELALWAYS ;
 m_bzlist.SetExtendedStyle(dwStyle);
 m_bzlist.SetBkColor(RGB(0xec,0xf1,0xfd));
 m_bzlist.SetTextBkColor(RGB(0xfe,0xFF,0xc6));
插入一列:
 m_bzlist.InsertColumn(0,"编号");
 m_bzlist.SetColumnWidth(0,50);
插入一行:
方法1:
 LV_ITEM lvitem;
 lvitem.pszText="";
 lvitem.mask=LVIF_TEXT;
 lvitem.iSubItem=0;
 lvitem.iItem=0;
 m_jbxxlist.InsertItem(&lvitem);
 m_jbxxlist.SetItemText(0,0,xh);
 m_jbxxlist.SetItemText(0,1,xm);
 m_jbxxlist.SetItemText(0,2,nj);
 方法2:
 m_yktlist.InsertItem(i,"2");
 m_y......

阅读全文(2600) | 评论:0

V转C++ CMenu使用总结(2007-11-21 13:57:00)

摘要:CMenu类
LoadMenu()可以从资源中加载菜单 AppendMenu()是在菜单的末尾添加一个菜单项,第二个参数可以使该菜单项对应的命令ID,如ID_FILE_OPEN,也可以使一个弹出菜单的句柄 菜单是个树状结构,对于MFC主界面的菜单,第一级是那种没有ID的菜单项,没有消息处理函数的,如常见的"文件",其他就是子菜单,也就是弹出菜单 给菜单加位图,采用SetMenuBitMaps(), 要求位图数据不能是局部的
......

阅读全文(3066) | 评论:0

转VC中Radio控件的用法(2007-10-24 11:38:00)

摘要: 先为对话框加上2个radio button,分别是Radio1和Radio2。 问题1:如何让Radio1或者Radio2默认选上?如何知道哪个被选上了?

关键是选上,“默认”只要放在OnInitDialog()即可。三种方法可以让它选上,
第一种:
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上
((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上
第二种:
关联一个congtrol型变量(子类化),好ctrl+W(即打开classwizard),点开 Member Variables,咦?怎么没有IDC_RADIO1这个ID?原来是没有分组。因为radio button通常都是成组使用的,在一组里面是互斥的。取消,回到对话框资源面板,右键Radio1查看属性把Group选上,那么,Radio1和Radio2就是一组了(怎么知道他们是一组的?后面说)。此时,就可以为Radio1增加一congtrol型变量m_ctrlRadio1了。如下:
m_ctrlRadio1.SetCheck(TRUE);
同样可以使用GetCheck()获取状态。
第三种:
关联一个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:
m_nRadio1 = -1;m_nRadio1别赋值-1表示哪个都没有选上。如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_nRadio1的值为1就是第二个被选上了(这里同样有问题,哪个是第一个?哪个是第二个?)。获取状态很简单,UpdateData(TRUE)后判断m_nRadio1的值即可。 问题2:如何使用多组?

多组和一组是一样的使用,只要搞清楚哪个是哪一组的就行了。再为对话框添加Radio3和Radio4。很简单,先为这些Radio Button排个顺序,就是排列他们的TAB ORDER。在对话框资源面板上Ctrl+D,然后按你......

阅读全文(5192) | 评论:0

转最常见的20种VC++编译错误信息集合(2007-10-23 13:34:00)

摘要:1、fatal error C1010: unexpected end of file while looking for precompiled header directive。   寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h")   2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory   不能打开包含文件“R…….h”:没有这样的文件或目录。   3、error C2011: 'C……': 'class' type redefinition   类“C……”重定义。   4、error C2018: unknown character '0xa3'   不认识的字符'0xa3'。(一般是汉字或中文标点符号)   5、error C2057: expected constant expression   希望是常量表达式。(一般出现在switch语句的case分支中)   6、error C2065: 'IDD_MYDIALOG' : undeclared identifier   “IDD_MYDIALOG”:未声明过的标识符。   7、error C2082: redefinition of formal parameter 'bReset'   函数参数“bReset”在函数体中重定义。   8、error C2143: syntax error: missing ':' before '{'   句法错误:“{”前缺少“;”。   9、error C2146: syntax error : missing ';' before identifier 'dc'   句法错误:在“dc”前丢了“;”。   10、error C2196: case value '69' already used   值69已经用过。(一般出现在switch语句的case分支中)  11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'   成员函数“OnTimer”没有在“CHello......

阅读全文(2386) | 评论:0

转创建有个性的对话框之MFC篇     (2007-10-22 15:42:00)

摘要: 想使自己的软件与众不同就要给软件加点“色”,一个颜色搭配协调的窗口要比windows千篇一律的灰底黑字更能吸引别人的眼球。设想如果html浏览器显示的网页都是白底黑字,还会有那么多的mm喜欢上网吗?可能互联网的人气将下降一半。做个出色的界面对于老手来说可能不在话下,但是对于新手来说还是无从下手,使用BCGControlBar和Xtreme Toolkit是个很好的选择,不过对于一个小程序使用这么大的库未免有头重脚轻的感觉。其实不使用这些庞然大物一样可以做个很“色”的界面,本文就结合CSDN论坛上经常被问起的问题,介绍几个给对话框上色的方法。本文的方法都是针对MFC程序的,其他方法请参看“创建有个性的对话框之ATL/WTL篇”。 第一步:改变对话框的背景颜色 如何改变对话框的背景颜色这个问题常常出现在论坛上,可见大家对Windows默认的灰色对话框是多么不满。MFC程序修改对话框的背景和文字颜色最简单的方法就是调用SetDialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该函数的原型:   void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText);         请注意,SetDialogBkColor函数并不是对Windows的某个API的封装,他是MFC框架的一部分,所以不使用MFC的程序也就不能享受这种方便。这个函数的使用很简单,在程序的CWinApp派生类的InitInstance函数中添加一行代码就行了:   SetDialogBkColor(RGB(188,197,230),RGB(13,125,188));         图.1 就是运行效果:       图.1 SetDialogBkColor效果图 使用SetDialogBkColor也有局限的地方,那就是所有的控件文字颜色都一样,不能针对不同的控件设置不同的文字颜色,还有就是不能设置Edit控件的颜色。不使用SetDialogBkColor函数,直接编写代码控制对话框的背景颜色和......

阅读全文(2547) | 评论:0

CListCtrl 使用技巧(2007-08-09 15:46:00)

摘要:作者:lixiaosan
时间:04/06/2006
以下未经说明,listctrl默认view 风格为report 相关类及处理函数
MFC:CListCtrl类 SDK:以 “ListView_”开头的一些宏。如 ListView_InsertColumn
1. CListCtrl 风格       LVS_ICON: 为每个item显示大图标
      LVS_SMALLICON: 为每个item显示小图标
      LVS_LIST: 显示一列带有小图标的item
      LVS_REPORT: 显示item详细资料       直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
2. 设置listctrl 风格及扩展风格       LONG lStyle;
      lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
      lStyle &= ~LVS_TYPEMASK; //清除显示方式位
      lStyle |= LVS_REPORT; //设置style
      SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
 
      DWORD dwStyle = m_list.GetExtendedStyle();
    ......

阅读全文(3709) | 评论:0